Как рассчитать несколько средних в одном запросе в linq для сущностей - PullRequest
1 голос
/ 27 августа 2010

Как это сделать в linq для сущностей в одном запросе?

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

??

1 Ответ

0 голосов
/ 27 августа 2010

Вы можете сделать что-то подобное:

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, хотя ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...