如何在linq中对一个查询中的实体执行此操作?
SELECT avg(Column1), avg(Column2), ... from MyTable
where ColumnX = 234
??
答案 0 :(得分:0)
你可以这样做:
var averages = myTable
.Where(item => item.ColumnX == 234)
.Aggregate(
new { count = 0, sum1 = 0.0, sum2 = 0.0 },
(acc, item) => new { count = acc.count + 1, sum1 = acc.sum1 + item.Column1, sum2 = acc.sum2 + item.Column2 },
acc => new { avg1 = acc.sum1 / acc.count, avg2 = acc.sum2 / acc.count });
注意调用 实际上它似乎工作;) AsEnumerable()
强制Aggregate
在本地执行(因为EF可能不知道如何将其转换为SQL)
或者,您可以使用此查询:
var averages =
from item in table
where item.ColumnX == 234
group item by 1 into g
select new
{
Average1 = g.Average(i => i.Column1),
Average2 = g.Average(i => i.Column2)
};
这里使用group by
不是很直观,但它可能比其他解决方案更容易阅读。不确定它是否可以转换为SQL ...