Linq to Sql查询具有多个聚合

时间:2009-12-10 12:23:10

标签: sql linq linq-to-sql

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

select sum(lineitemcount) as totalitems, sum(total) as totalsales
from purchaseorders

然而,在Linq to Sql中,我很难将其纳入一个查询。

目前我有这个:

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

有没有办法将此作为一个查询?

3 个答案:

答案 0 :(得分:2)

最接近我可以解决的问题是给它一个假的group-by子句。它可以工作,并按照您的预期输出,但生成的SQL实际上会在参数“1”中传递并对其进行分组,这有点不是最理想的。这是我所拥有的语法:

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

答案 1 :(得分:1)

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

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)
}

答案 2 :(得分:1)

也许你可以尝试聚合:

var totOrder= PurchaseOrders.Aggregate((preOrder, thisOrder)=>SumTwoOrder(preOrder, thisOrder));
var totalSales = totOrder.Total;
var totalItems=totOrder.LineItemCount;

这是您定义SumTwoOrder方法的方法:

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