有订单表头和明细表,想要抓取所有表头列并从明细中附加总订单数量。
我正在尝试做什么(伪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 已发送到其他地方。
如果有我在搜索中没有看到的此类查询的最佳实践,我完全可以放弃整个查询并以不同的方式进行处理。
最佳答案
你的意思是这样的?我假设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)
};
关于c# - LINQ 连接、分组和求和(或任何聚合),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11456856/