如何在linq到实体的一个查询中计算多个平均值

时间:2010-08-27 15:54:04

标签: linq linq-to-entities

如何在linq中对一个查询中的实体执行此操作?

SELECT avg(Column1), avg(Column2), ... from MyTable 
where ColumnX = 234

??

1 个答案:

答案 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 ...