单个表达式中多个聚合值的Linq-to-SQL语句

如何为以下TSQL编写Linq-to-SQL语句?

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

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] 

有一个子查询涉及,但嘿! 这只是一次db旅行

你可以这样做:

 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) } 

单独提取值可能更容易,但您可以使用匿名类型。

 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) };