Как произвести много агрегаций по множеству строк - PullRequest
1 голос
/ 01 октября 2010

Мне сложно сопоставить простой запрос T-SQL, такой как этот

select min(price) as MinPrice, max(price) as MaxPrice, avg(price) as AvgPrice
from titles

, с выражением Linq, таким как:

var answer = from t in Titles
select new { MinPrice=Min(t.Price), MaxPrice=Max(t.Price), AvgPrice=Avg(t.Price)};

Очевидно, что это не работаеттак как Мин не существует в этом контексте.Я также понимаю, что требуется какое-то предложение Group, но, поскольку у меня нет группы by в исходной инструкции T-Sql, я не уверен, как будет применяться group by в этом запросе linq.

Я использую EF 4, но в этом случае я сомневаюсь, что это имеет значение в этом примере.

Ответы [ 2 ]

2 голосов
/ 01 октября 2010

Не уверен, что он работает с EF, но вы можете попробовать что-то вроде этого:

var query =
    from p in products
    group p by 0 into g
    select new
    {
        Min = g.Min(p => p.Price),
        Max = g.Max(p => p.Price),
        Avg = g.Average(p => p.Price)
    };
var result = query.First();

РЕДАКТИРОВАТЬ: только что попробовал в LINQPad с Linq to SQL, он работает ... так что, вероятно, работает и в EF


Приведенный выше запрос генерирует следующий SQL:

SELECT TOP (1) [t2].[value] AS [Min], [t2].[value2] AS [Max], [t2].[value3] AS [Avg]
FROM (
    SELECT MIN([t1].[Price]) AS [value], MAX([t1].[Price]) AS [value2], AVG([t1].[Price]) AS [value3]
    FROM (
        SELECT @p0 AS [value], [t0].[Price]
        FROM [Product] AS [t0]
        ) AS [t1]
    GROUP BY [t1].[value]
    ) AS [t2]

(часть SELECT TOP(1) существует только из-за вызова First)

Это явно не оптимально, но я предполагаю, что SQL Server достаточно умен, чтобы оптимизировать его до чего-то более простого ...

0 голосов
/ 01 октября 2010
var prices = titles.Select(t => t.Price);
var answer = new { min = prices.Min(), max = prices.Max(), avg = prices.Average(); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...