linq用group分组后怎么得到多个字段?

时间:2022-06-18 03:01:59
var sta = from s in LocalEdM.rain_hour
                      where s.rhTime > Starttime && s.rhTime <= Endtime
                      group s by s.CityName into g
                      select new { CityName = g.Key, totalP = g.Sum(p => p.prec) };

如上的一个查询得到按cityname分组的结果集,我想在结果集中还包括字段lon和lat(这两个字段在表rain_hour中,表示每个cityname的经纬度),那么select new里面该怎么写呢?我直接写lon=s.lon,lat=s.lat不行啊!!!

14 个解决方案

#1


var sta = from s in LocalEdM.rain_hour
  where s.rhTime > Starttime && s.rhTime <= Endtime
  group s by s.CityName into g
  select new { CityName = g.Key, totalP = g.Sum(p => p.prec),lon=g.FirstOrDefault().lon,lat=g.FirstOrDefault().lat };

#2


失败的数据库设计

字段lon和lat属于冗余的数据。

#3


引用 1 楼 q107770540 的回复:
var sta = from s in LocalEdM.rain_hour
  where s.rhTime > Starttime &amp;&amp; s.rhTime <= Endtime
  group s by s.CityName into g
  select new { CityName = g.Key, totalP = g.Sum(p => p.prec),lon=g.……


谢谢,方法可行,能解释一下么,为什么能用FirstOrDefault提取指定的字段?

#4


FirstOrDefault 表示取集合第一个或默认的元素  从字面上就可以的理解。

你group出来集合的每一个元素的lon和lat属性都是一样的,所以取哪一个都可以,
Tim哥给的解决方案就是取第一个。

实际上你把lon和lat放在关联表里存储就不会有这样的需求,所以我说这是失败的数据库设计。

#5


不知道你能不能明白,你百度一下 "数据库范式" 看看会有助于你理解。

#6


引用 4 楼 a157147899 的回复:
FirstOrDefault 表示取集合第一个或默认的元素 从字面上就可以的理解。

你group出来集合的每一个元素的lon和lat属性都是一样的,所以取哪一个都可以,
Tim哥给的解决方案就是取第一个。

实际上你把lon和lat放在关联表里存储就不会有这样的需求,所以我说这是失败的数据库设计。

哦,谢谢,请教一下,如果改为关联表该如何改?假设lon,lat的信息放在cityinf表中,那么是设定cityinf表的cityname为主键,然后rain_hour的cityname为外键来关联cityinf么?

#7


对,就是这个意思。
“rain_hour” 我想这个表应该是记录有关每个城市下雨时间的数据,
那么这张表中就不应该出现除 "cityInfo"表主键外的任何字段,
只需在某个字段上与 "cityInfo"表的主键存在外键关系即可。

#8


引用 7 楼 a157147899 的回复:
对,就是这个意思。
“rain_hour” 我想这个表应该是记录有关每个城市下雨时间的数据,
那么这张表中就不应该出现除 "cityInfo"表主键外的任何字段,
只需在某个字段上与 "cityInfo"表的主键存在外键关系即可。


嗯,我把表按上面说的改了,但是怎么把查询rain_hour分组后的集合关联回cityinfo表得到lon,lat呢,能给个示例么?

#9


给个伪代码:

select B.*,A.lon,A.lat from CityInfo as A
inner join 
(select CityName,sum(prec) as total from rain_hour
where rhTime > Starttime && rhTime <= Endtime group by CityName) as B
on A.CityName=B.CityName

#10


引用 9 楼 a157147899 的回复:
给个伪代码:

SQL code

select B.*,A.lon,A.lat from CityInfo as A
inner join 
(select CityName,sum(prec) as total from rain_hour
where rhTime > Starttime &amp;&amp; rhTime <= Endtime group by CityNam……


sql查询语句我也会写,就是linq能达到这个效果的代码不会写,有linq的伪代码么?

#11


我看网上的例子,建立主外键后,A表/B表的名字就变成了实体中B表/A表的导航属性。可以通过导航属性访问另一个表,但是为什么我输入了A.B.???,引不出B的其他属性呢?

#12


你可以分成两次查询,比较笨的写法

var query1= from s in LocalEdM.rain_hour
  where s.rhTime > Starttime && s.rhTime <= Endtime
 group s by s.CityName into g
  select new { CityName = g.Key, totalP = g.Sum(p => p.prec) };

var query2=from data in LocalEdM.CityInfo
           join data1 in query1
           on data.CityName=data1.CityName
           select new {CityName=data1.CityName,totalP=data1.totalP,lon=data.lon,lat=data.lat}

#13


EF应该有这样的功能 可以一次查出来。 
具体我没用过,也不清楚。

#14


引用 13 楼 a157147899 的回复:
EF应该有这样的功能 可以一次查出来。 
具体我没用过,也不清楚。


谢谢两位的解答,收工结贴!!!

#1


var sta = from s in LocalEdM.rain_hour
  where s.rhTime > Starttime && s.rhTime <= Endtime
  group s by s.CityName into g
  select new { CityName = g.Key, totalP = g.Sum(p => p.prec),lon=g.FirstOrDefault().lon,lat=g.FirstOrDefault().lat };

#2


失败的数据库设计

字段lon和lat属于冗余的数据。

#3


引用 1 楼 q107770540 的回复:
var sta = from s in LocalEdM.rain_hour
  where s.rhTime > Starttime &amp;&amp; s.rhTime <= Endtime
  group s by s.CityName into g
  select new { CityName = g.Key, totalP = g.Sum(p => p.prec),lon=g.……


谢谢,方法可行,能解释一下么,为什么能用FirstOrDefault提取指定的字段?

#4


FirstOrDefault 表示取集合第一个或默认的元素  从字面上就可以的理解。

你group出来集合的每一个元素的lon和lat属性都是一样的,所以取哪一个都可以,
Tim哥给的解决方案就是取第一个。

实际上你把lon和lat放在关联表里存储就不会有这样的需求,所以我说这是失败的数据库设计。

#5


不知道你能不能明白,你百度一下 "数据库范式" 看看会有助于你理解。

#6


引用 4 楼 a157147899 的回复:
FirstOrDefault 表示取集合第一个或默认的元素 从字面上就可以的理解。

你group出来集合的每一个元素的lon和lat属性都是一样的,所以取哪一个都可以,
Tim哥给的解决方案就是取第一个。

实际上你把lon和lat放在关联表里存储就不会有这样的需求,所以我说这是失败的数据库设计。

哦,谢谢,请教一下,如果改为关联表该如何改?假设lon,lat的信息放在cityinf表中,那么是设定cityinf表的cityname为主键,然后rain_hour的cityname为外键来关联cityinf么?

#7


对,就是这个意思。
“rain_hour” 我想这个表应该是记录有关每个城市下雨时间的数据,
那么这张表中就不应该出现除 "cityInfo"表主键外的任何字段,
只需在某个字段上与 "cityInfo"表的主键存在外键关系即可。

#8


引用 7 楼 a157147899 的回复:
对,就是这个意思。
“rain_hour” 我想这个表应该是记录有关每个城市下雨时间的数据,
那么这张表中就不应该出现除 "cityInfo"表主键外的任何字段,
只需在某个字段上与 "cityInfo"表的主键存在外键关系即可。


嗯,我把表按上面说的改了,但是怎么把查询rain_hour分组后的集合关联回cityinfo表得到lon,lat呢,能给个示例么?

#9


给个伪代码:

select B.*,A.lon,A.lat from CityInfo as A
inner join 
(select CityName,sum(prec) as total from rain_hour
where rhTime > Starttime && rhTime <= Endtime group by CityName) as B
on A.CityName=B.CityName

#10


引用 9 楼 a157147899 的回复:
给个伪代码:

SQL code

select B.*,A.lon,A.lat from CityInfo as A
inner join 
(select CityName,sum(prec) as total from rain_hour
where rhTime > Starttime &amp;&amp; rhTime <= Endtime group by CityNam……


sql查询语句我也会写,就是linq能达到这个效果的代码不会写,有linq的伪代码么?

#11


我看网上的例子,建立主外键后,A表/B表的名字就变成了实体中B表/A表的导航属性。可以通过导航属性访问另一个表,但是为什么我输入了A.B.???,引不出B的其他属性呢?

#12


你可以分成两次查询,比较笨的写法

var query1= from s in LocalEdM.rain_hour
  where s.rhTime > Starttime && s.rhTime <= Endtime
 group s by s.CityName into g
  select new { CityName = g.Key, totalP = g.Sum(p => p.prec) };

var query2=from data in LocalEdM.CityInfo
           join data1 in query1
           on data.CityName=data1.CityName
           select new {CityName=data1.CityName,totalP=data1.totalP,lon=data.lon,lat=data.lat}

#13


EF应该有这样的功能 可以一次查出来。 
具体我没用过,也不清楚。

#14


引用 13 楼 a157147899 的回复:
EF应该有这样的功能 可以一次查出来。 
具体我没用过,也不清楚。


谢谢两位的解答,收工结贴!!!