gpt4 book ai didi

c# - LINQ、联接、分组和聚合

转载 作者:行者123 更新时间:2023-11-30 18:05:47 26 4
gpt4 key购买 nike

使用 Join 或 GroupJoin,是否有任何方法可以为父表和子表中的字段生成聚合值。给定一个 Orders 表和一个 OrderDetails 表,使用下面的 2 个步骤我可以从 Orders 中获得一个聚合 (MAX) 并从 OrderDetails 中获得一个聚合 (SUM)。

第 1 步:

var query = from o in orders
join d in details on o.OrderId equals d.OrderId
select new
{
order = o.OrderId,
maximum = o.UserId,
quantity = d.Quantity
};

第 2 步:

var result = (from q in query
group q by q.order into g
select new
{
OrderId = g.Key,
MaxUnits = g.Max(q => q.maximum),
Available = (g.Max(q => q.maximum) - g.Sum(q => q.quantity))
});

但是,当我尝试将它们组合在一起时:

var finalresult   = orders  
.GroupJoin( details,
o => o.OrderId,
d => d.OrderDetailId,
(o, grp) => new {
OrderId = o.OrderId,
MaxUnits = grp.Max(o => o.maximum),
Available = (grp.Max(o => o.maximum) - grp.Sum(d => d.Quantity))
});

.. 值“o”超出了分组集“grp”的范围。所以 grp.Max(o => o.maximum) 会导致错误。似乎只有子表 (OrderDetail) 的聚合值可用。

那么有谁知道是否可以在单个查询中从子表和父表中获取聚合?

最佳答案

result 一个查询。 LINQ 和延迟执行的美妙之处在于,在第 1 步中没有发生实际计算,只定义了一个查询。然后,第 2 步在该查询之上构建以创建另一个单个 查询。当您执行 result 时,该查询将作为单个 block 执行。

我建议将较大的查询拆分为较小的更易于理解的部分,就像前两个示例中那样。为查询使用好的名称可以使它们更易于阅读。例如,我可能会将查询命名为 orderQuantities。 from q in query 没有传达太多意义,但是 from oq in orderQuantities 让我知道查询结束了什么样的数据。

如果你真的认为你需要它们:

var query = orders.Join(details, o => o.OrderId, d => d.OrderId, 
(o, d) => new {
order = o.OrderId,
maximum = o.UserId,
quantity = d.Quantity
}).GroupBy(oq => oq.order)
.Select(g => new {
OrderId = g.Key,
MaxUnits = g.Max(q => q.maximum),
Available = (g.Max(q => q.maximum) - g.Sum(q => q.quantity))
});

现在这很丑...

关于c# - LINQ、联接、分组和聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5253891/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com