Linq to Sql для подсчета и усреднения набора данных (без группировки) - PullRequest
3 голосов
/ 21 июля 2010

Я хотел бы выполнить оператор Linq to Sql, который фиксирует количество и среднее в (отфильтрованном) наборе данных. То, что у меня работает, но требует двух запросов к базе данных, когда это должно быть возможно в одном запросе.

Интересно, что я могу получить один запрос при использовании предложения group by.

Например:

select count(*), avg(duration) from events

Мой linq выглядит так:

var x = from e in db.events
        select e;
x = from i in x
    where i.NAME == "foo"
    select i;

return new {
    count = x.Count(),
    avgDuration = x.Average(e => e.Duration)
    };

С этим кодом я получаю два запроса:

SELECT AVG([t0].[DURATION]) AS [value] FROM [dbo].[EVENTS] AS [t0]

и

SELECT COUNT(*) AS [value] FROM [dbo].[EVENTS] AS [t0]

Есть ли другой способ?

1 Ответ

7 голосов
/ 21 июля 2010

Лучшее, что я могу получить - это вложенный подзапрос:

var x = from e in db.events 
        group e by 1 into grp
        select new { 
            count = grp.Count(), 
            avgDuration = grp.Average(x => x.Duration) }

Согласно LINQPad, это выведет SQL:

DECLARE @p0 Int = 1

SELECT COUNT(*) AS [count], AVG([t1].[Amount]) AS [avgDuration]
FROM (
    SELECT @p0 AS [value], [t0].[Duration]
    FROM Events AS [t0]
    ) AS [t1]
GROUP BY [t1].[value]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...