【问题标题】:LINQ join, group and sum (or any aggregate)LINQ 连接、分组和求和(或任何聚合)
【发布时间】:2012-07-12 16:59:48
【问题描述】:

有订单标题和明细表,想要获取所有标题列并从明细中附加一个总订单数量。

我正在尝试做的事情(伪 sql):

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

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

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 的所有结果都已发送到其他地方。

如果有我在搜索中没有看到的此类查询的最佳实践,我完全可以放弃整个查询并以不同的方式执行。

【问题讨论】:

    标签: c# linq group-by aggregate


    【解决方案1】:

    你的意思是这样的?我假设 od.PID 真的是 od.HeaderID (= oh.ID) 来自你的“我正在尝试做的事情”中的 pesudo-sql,并且 oh.ID 对于db.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) 
                  };
    

    【讨论】:

    • 是的,是的,我做到了。所以.Key 是您分组依据的内置属性。很高兴知道。
    • 是的,你从一个组中得到一个IGrouping
    猜你喜欢
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    相关资源
    最近更新 更多