Оператор Linq-to-SQL для нескольких агрегированных значений в одном выражении - PullRequest
7 голосов
/ 07 мая 2010

Как бы я написал оператор Linq-to-SQL для следующего TSQL?

select 
  count(*),
  sum(Amount),
  avg(Amount),
  min(Amount),
  max(Amount) 
from 
  TableName

Ответы [ 3 ]

4 голосов
/ 30 мая 2011

HACK ALERT , но это работает.Попробуйте сгруппировать свои записи по условию, которое они все разделяют:

var result = from g in db.Employees
        group g by g.Id.GetType() == typeof(int) into gg
        select new 
        {
            Count = gg.Count(),
            Sum = gg.Sum(x => x.Salary)
        };

. Это генерирует SQL:

SELECT COUNT(*) AS [Count], SUM([t1].[Salary]) AS [Sum]
FROM (
SELECT 1 AS [value], [t0].[Salary]
FROM [dbo].[Employee] AS [t0]
) AS [t1]
GROUP BY [t1].[value]

Вложен подзапрос, но эй!это только одна поездка в дб

2 голосов
/ 07 мая 2010

Вы можете сделать:

var result = new
{
    Count = db.TableName.Count(),
    Sum = db.TableName.Sum(r => r.Amount),
    Average = db.TableName.Avg(r => r.Amount),
    Min = sb.TableName.Min(r => r.Amount),
    Max = db.TableName.Max(r => r.Amount)        
}
1 голос
/ 07 мая 2010

Вероятно, проще получать значения по отдельности, но вы можете сделать это с анонимным типом.

var aggregates = new {
Count = context.TableName.Count(),
Sum = context.TableName.Sum(t => t.Amount),
Avg = context.TableName.Avg(t => t.Amount),
Min = context.TableName.Min(t => t.Amount),
Max = context.TableName.Max(t => t.Amount)
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...