C# 具有多字段和聚合函数的LINQ group by
我尝试在LINQ中进行查询,转换以下T-SQL查询:C# 具有多字段和聚合函数的LINQ group by,c#,linq,C#,Linq,我尝试在LINQ中进行查询,转换以下T-SQL查询: select b.crs, d.epg, d.m, Count (a.sq_rea) as qt from t_aaaa a with (nolock) join t_bbbb b with (nolock) on a.crs = b.crs join t_cccc c with (nolock) on a.spr = c.spr and c.rsp = 1
select b.crs,
d.epg,
d.m,
Count (a.sq_rea) as qt
from t_aaaa a with (nolock)
join t_bbbb b with (nolock) on a.crs = b.crs
join t_cccc c with (nolock) on a.spr = c.spr and c.rsp = 1
join v_dddd d with (nolock) on c.epg = d.epg
Where a.st = 5
group by b.crs, d.epg, d.m
但是,我不能像这样使用聚合函数:
var llstData = (from a in lobjaaaaDao.list()
join b in lobjbbbbDao.list() on a.p equals b.p
join c in lobjcccc.listar() on a.u equals c.u
from d in lobjddddDao.list()
where a.w == d.w &&
a.st.Equals(5) &&
d.Indent == false
group a by new { b.xxxx, c.yyyy, c.zzzz } into grp
select new
{
grp.Key.xxxx,
grp.Key.yyyy,
grp.Key.zzzz,
total = a.kkkk.Count() // ERROR ON THIS LINE
}
).ToList();
我得到这个错误:
当前上下文中不存在名称a
如何修复错误?在上一个select语句中,您可以访问的查询中的唯一参数是
grp
;每组的位置;每个组由一个键和一个IEnumerable
表示,在您的示例中:IEnumerable
。话虽如此,;您可以将行total=a.kkk.Count()
替换为total=grp.SelectMany(v=>v.kkk.Count()
或total=grp.Sum(a=>a.kkk.Count())
来解决此问题。
这样,
total
表示组中每个a中kkk
计数的总和。错误是什么?哦。我现在看到了。等等,让我编辑一下你的作品,让它更明显。编辑。还有,只是一个想法。。。就我个人而言,当我有使用SQL但无法使用LINQ的查询(如您的查询)时,我只是将查询保留在SQL中。您不必使用LINQ。您仍然可以使用t-sql查询并返回您要查找的相同的列表。LINQ很好,直到它不是。不,它不是一个KeyValuePair
是一个i分组
,它是一个IEnumerable
并且有一个TKey
Key
属性。因此没有值
属性。最后,我不认为有理由在这里执行SelectMany
,因为它已经分组了,所以计数应该只在sq\u rea
不为空的行上<代码>总计数(a=>a.sq_rea!=null)代码>@juharr从问题中得出,总数是根据对象a上的一个属性kkk的计数来计算的,这就是为什么我假设OP需要对组中每个项目的kkk计数求和的原因。=>它可以被grp.Sum(a=>a.kkk.Count())a组替换为。。。into grp
表示grp
是a
行的集合。可能Linq中的kkk
相当于SQL中的sq_rea
,因为它们似乎有许多其他名称差异。