使用Join或GroupJoin,有没有办法同时为父表和子表中的字段生成聚合值。给定一个Orders表和一个OrderDetails表,使用下面的两个步骤,我可以从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)的聚合值可用。
那么,有没有人知道是否可以在单个查询中同时从子表和父表获得聚合呢?
发布于 2011-03-12 13:21:07
result是一个单一查询。LINQ和延迟执行的美妙之处在于,在步骤1中没有发生实际的计算,只定义了一个查询。然后,步骤2在该查询的基础上构建,以创建另一个查询。当您执行result时,该查询将作为单个块执行。
我建议将较大的查询拆分成更小的、更容易理解的部分,如前两个示例所示。对查询使用好的名称可以使它们更容易阅读。例如,我可以将query命名为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))
}); 这太难看了..。
https://stackoverflow.com/questions/5253891
复制相似问题