具有多个聚合的Linq到Sql查询

具有多个聚合的Linq到Sql查询,sql,linq,linq-to-sql,Sql,Linq,Linq To Sql,给定一个简单的模式,例如PurchaseOrders{OrderId,Total,LineItemCount},我想为一些简单的统计数据生成一个简单的查询,如下所示: select sum(lineitemcount) as totalitems, sum(total) as totalsales from purchaseorders 然而,在LINQtoSQL中,我很难将其放入一个查询中 目前,我有以下几点: decimal totalSales = PurchaseOrders.Sum(

给定一个简单的模式,例如PurchaseOrders{OrderId,Total,LineItemCount},我想为一些简单的统计数据生成一个简单的查询,如下所示:

select sum(lineitemcount) as totalitems, sum(total) as totalsales
from purchaseorders
然而,在LINQtoSQL中,我很难将其放入一个查询中

目前,我有以下几点:

decimal totalSales = PurchaseOrders.Sum(po => po.Total)
decimal totalItems = PurchaseOrders.Sum(po => po.LineItemcount)

有没有一种方法可以作为一个查询来实现这一点?

这里有一种方法应该是可行的。我不确定数据类型,所以我假设了可为空的整数

from t in (
    from t in PurchaseOrders
    select new {
        t.LineItemCount,
        t.Total,
        Dummy = "x"
    }
)
group t by new { t.Dummy } into g
select new {
  TotalItems = (System.Int32?)g.Sum(p => p.LineItemCount),
  TotalSales = (System.Int32?)g.Sum(p => p.Total)
}

也许你可以试试:

var totOrder= PurchaseOrders.Aggregate((preOrder, thisOrder)=>SumTwoOrder(preOrder, thisOrder));
var totalSales = totOrder.Total;
var totalItems=totOrder.LineItemCount;
以下是定义
sumtworder
方法的方法:

   public PurchaseOrder SumTwoOrder(PurchaseOrder prev, PurchaseOrder thisOrder)
  {
    return new PurchaseORder(prev.Total+thisOrder.Total, prev.LineItemCount+thisOrder.LineItemCount);
  }

我能做的最接近的事情就是给它一个伪GROUPBY子句。它可以正常工作,并按预期输出,但生成的SQL实际上会传入一个参数“1”,并对其进行分组,这有点次优。下面是我得到的语法:

PurchaseOrders
    .GroupBy(po => 1)
    .Select(pogroup => new {
           TotalSales = pogroup.Sum(po => po.Total),
           TotalItems = pogroup.Sum(po => po.LineItemCount)
        });

更新:我可以通过使用“group[po]by po.something to blah”语法获得想要的效果,尽管这正是我所需要的,但我仍然好奇我是否可以在没有组的情况下进行多个聚合。如果你向它传递这样的函数指针,那么它就将其用作IEnumerable,这意味着所有的聚合都将在C#中进行,而不是在数据库中。是的,我有很多数据,所以我确实需要SQL来为我进行聚合。好主意,我可以在我的数据的其他部分使用这个方法,所以谢谢:-)这很有效,干杯!我同意fyjham的答案,因为它生成的SQL更好,运行速度更快。我确实必须更改lambdas的总和,因为我相信您不打算将po称为该组,但我得到了这个想法,并且它是有效的:-)您是对的-我在根据您的数据重新编写查询时输入了错误的值(我对本地db进行了一些类似的测试,将其转换回问题,我稍微混淆了一下)。我已经把它们修好了,以防以后有人阅读;)