【问题标题】:Translate SQL to lambda LINQ with GroupBy and Average使用 GroupBy 和 Average 将 SQL 转换为 lambda LINQ
【发布时间】:2013-03-19 18:36:15
【问题描述】:

我花了几个小时尝试将简单的 SQL 转换为 lambda LINQ

SELECT ID, AVG(Score) FROM myTable
GROUP BY ID

有什么想法吗?

【问题讨论】:

  • 到底是什么语言? :)

标签: c# linq group-by average


【解决方案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 属性的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多