LINQ加入,组和总和(或任何聚合)

时间:2012-07-12 16:59:49

标签: c# linq group-by aggregate

拥有订单标题和详细信息表,想要获取所有标题列并从详细信息中附加总计订单数量。

我正在尝试做什么(伪sql):

select Header.*, sum(Details.Quantity)
from Header
join Details on Details.HeaderID = Header.ID
group by HeaderID

为了避免重写所有Header列(有很多)我创建了一个新对象,如下所示:

public class OrderView 
{
    public Header Header { get; set; }
    public int? TotalQuantity { get; set; }
}

我悲伤的尝试填补它:

var results = from oh in db.Header
              join od in db.Details on oh.ID equals od.HeaderID                          
              where oh.Store == params.Store
                 // && ...  a bunch more search filters on Header ...
              group od by od.PID into odg
              select new OrderView() { Header = oh, TotalQuantity = odg.Sum(x => x.QTY) };

我当前尝试的第一个问题是在select行中,oh未定义,在我对LINQ的无知中导致我相信来自Header的所有结果都已发送到某处其他

如果我在搜索中没有看到这种类型的查询的最佳做法,我完全可以删除整个查询并执行不同的操作。

1 个答案:

答案 0 :(得分:4)

你的意思是这样的?我假设od.PID真的是od.HeaderID(= oh.ID)来自您的“我正在尝试做的事情”中的pesudo-sql,并且 oh.IDdb.Header的每一行都是唯一的(可能的PK?),因此您可以按行分组。

var results = from oh in db.Header
              join od in db.Details on oh.ID equals od.HeaderID                          
              where oh.Store == params.Store
                 // && ...  a bunch more search filters on Header ...
              group od by oh into odg
              select new OrderView() 
              {
                  Header = odg.Key, 
                  TotalQuantity = odg.Sum(x => x.QTY) 
              };