使用 GroupBy 和 Average 将 SQL 转换为 lambda LINQ
Posted
技术标签:
【中文标题】使用 GroupBy 和 Average 将 SQL 转换为 lambda LINQ【英文标题】:Translate SQL to lambda LINQ with GroupBy and Average 【发布时间】:2013-03-19 18:36:15 【问题描述】:我花了几个小时尝试将简单的 SQL 转换为 lambda LINQ
SELECT ID, AVG(Score) FROM myTable
GROUP BY ID
有什么想法吗?
【问题讨论】:
到底是什么语言? :) 【参考方案1】:from t in myTable
group t by new
t.ID
into g
select new
Average = g.Average(p => p.Score),
g.Key.ID
或Lambda
myTable.GroupBy(t => new ID = t.ID)
.Select (g => new
Average = g.Average (p => p.Score),
ID = g.Key.ID
)
【讨论】:
谢谢。正是我需要的。效果很好【参考方案2】:Linq-to-Objects 中的等价物如下所示。
var results = from row in myTable
group row by row.Id into rows
select new
Id = rows.Key,
AverageScore = rows.Average(row => row.Score)
;
对于类似 ORM 的实体框架来说,它只是略有不同。也就是说,您需要通过数据上下文或适当的 DbSet/ObjectSet。
【讨论】:
【参考方案3】:var _result = from a in myTable
group a by a.ID into g
select new
ID = g.Key.ID,
AverageResult = g.Average(x => x.Score)
【讨论】:
请注意g.Key.ID
将不存在且不会编译。在这个 sn-p 中只需要 g.Key
。
@AnthonyPegram 为什么它不会编译?我刚刚测试过。
这个版本?您应该会收到一条错误消息,大致说明“'int' 不包含 'ID' 的定义,并且没有扩展方法 'ID' 接受......”(用int
代替 ID 的任何实际属性类型。)关键是g.Key
是 ID。它不是包含 ID 属性的对象。以上是关于使用 GroupBy 和 Average 将 SQL 转换为 lambda LINQ的主要内容,如果未能解决你的问题,请参考以下文章