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

41

我正在寻找与此查询等效的Linq-to-SQL代码:

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

这是无group by的聚合查询。除了发出四个单独的查询(一个Count和三个Sum),我似乎找不到任何方法来完成此操作。有什么想法吗?

2个回答

48

我找到的是似乎你仍需要使用group by...但是你可以只使用常数:

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]

这个怎么用VB.Net翻译?在group ord by 1 into og上出现了错误。它不喜欢那个1。 - user2233219
1
@kaiyaq 我将它从C#翻译成VB https://converter.telerik.com/ 并得到了以下代码:Dim orderTotals = db.Orders.GroupBy(Function(i) 1).Select New With {Key .cnt = g.Count(), Key .ScolB = g.Sum(Function(item) item.ColB), Key .ScolC = g.Sum(Function(item) item.ColC) }) 这对我很有用。 - Grant Johnson

24

您可以使用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) 
                      });

我如何在代码中干净地使用orderTotals?我必须对结果执行ToList(),然后检查列表是否至少有一个内容,然后使用列表中的第一个元素吗?类似于:var list = orderTotals.ToList(); if(list.Count == 0) { return; } var totalColB = list[0].ScolB; 是否有一种方法可以更改查询以返回第一个结果的对象?或完整的结果? - Grant Johnson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接