Linq to SQL:如何在没有分组的情况下进行聚合?

Posted

技术标签:

【中文标题】Linq to SQL:如何在没有分组的情况下进行聚合?【英文标题】:Linq to SQL: how to aggregate without a group by? 【发布时间】:2009-10-20 20:42:12 【问题描述】:

我正在搜索与此查询等效的 Linq-to-SQL:

SELECT
  [cnt]=COUNT(*),
  [colB]=SUM(colB),
  [colC]=SUM(colC),
  [colD]=SUM(colD)
FROM myTable

这是没有分组的聚合。除了发出四个单独的查询(一个计数和三个总和)之外,我似乎找不到任何方法来做到这一点。有什么想法吗?

【问题讨论】:

【参考方案1】:

这就是我发现的似乎你仍然需要通过...进行分组...可以使用常量:

var orderTotals =
    from ord in dc.Orders
    group ord by 1 into og
    select new
    
        prop1 = og.Sum(item=> item.Col1),
        prop2 = og.Sum(item => item.Col2),
        prop3 = og.Count(item => item.Col3)
    ;

这会生成以下 SQL,虽然不是最佳的,但可以:

SELECT SUM([Col1]) as [prop1], SUM([Col2]) as [prop2], COUNT(*) AS [prop3]
FROM (
    SELECT 1 AS [value], [t0].[Col1], [t0].[Col2], [t0].[Col3]
    FROM [table] AS [t0]
    ) AS [t1]
GROUP BY [t1].[value]

【讨论】:

【参考方案2】:

您可以使用 Lambda 表达式执行相同的查询,如下所示:

  var orderTotals = db.Orders
                      .GroupBy( i => 1)
                      .Select( g => new
                      
                           cnt = g.Count(), 
                           ScolB = g.Sum(item => item.ColB), 
                           ScolC = g.Sum(item => item.ColC) 
                      );

【讨论】:

以上是关于Linq to SQL:如何在没有分组的情况下进行聚合?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 Linq to SQL 的情况下在 Windows Phone 中使用 SQL Server Compact

如何通过 LINQ to Sql 结果上的数据对分组进行 lambda?

Linq to sql 按多条记录分组

EF Linq to Sql 多表left join查询并对结果group by分组之后进行count,max等处理

Linq to sql,聚合列,按日期分组到列表视图

如何在代码中定义/更改 Linq To Sql 的映射