【问题标题】:Convert SQL query with GroupBy and Avg to LINQ使用 Group By 和 Avg 将 SQL 查询转换为 LINQ
【发布时间】:2017-03-15 16:37:02
【问题描述】:

我有一个简单的 SQL 查询:

SELECT 
    l.State,
    AVG(ls.Amount) As StateAvg
FROM 
    LeadSales ls 
    JOIN  LEADS l on ls.LeadID = l.LeadID
GROUP BY 
    l.State

这行得通:

将其转换为 LINQ 有点麻烦(其中 queryLeadSales 表的 IQueryable)...

var StateList = from q in query
                 group q by new
                 {
                      q.Lead.State,
                      q.Amount // <--- it this corrcect?
                 } into g
                 select new AverageLeadSalesPriceItem
                 {
                      StateCode = g.Key.State,
                      StateAverage = ????
                  };

与:

public class AverageLeadSalesPriceItem
{
    public string StateCode { get; set; }
    public decimal? StateAverage { get; set; }
}

【问题讨论】:

  • Get Average Using LINQ的可能重复
  • /\ @Pikoh 我看了那个,但无法使那个答案起作用。
  • 查询在c#中是如何定义的?
  • @jdweng 好问题。我编辑了我的 OP

标签: c# linq


【解决方案1】:

离你不远了。 group 子句应该按照您在 SQL 中分组的相同字段进行分组,然后分组构造对象 g 就像它自己的 Enumerable/Queryable 一样,包含组的所有行,您可以在其上调用聚合函数。因此,只有一个字段定义组键,不需要匿名类型,然后您只需在 g 上调用 Average(),定义标识要平均的字段的投影。

var StateList = from q in query
             group q by q.Lead.State into g
             select new AverageLeadSalesPriceItem
             {
                  StateCode = g.Key,
                  StateAverage = g.Average(gq=>gq.Amount),
             };

请记住,如果您的 Linq 查询基于 EF DbSet 之类的 Queryable 提供程序,则不会对数据库执行,直到您指示您需要“真正的”内存中对象,或者通过调用返回一个的方法隐式调用或多个对象(First()、ToArray() 等)或显式使用 AsEnumerable() 扩展方法。

【讨论】:

    【解决方案2】:

    这会有点像

    var StateList = from q in query
                     group q by new
                     {
                          q.Lead.State
                     } into g
                     select new AverageLeadSalesPriceItem
                     {
                          StateCode = g.Key.State,
                          StateAverage = g.Average( a=>a.Amount )
                      };
    

    请注意,如果您想动态计算聚合(如在 SQL 中),您可以使用专门的库,如 NReco PivotData(我是这个库的开发人员,它对单一部署项目是免费的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-28
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      相关资源
      最近更新 更多