首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LINQ、Joins、Grouping和Aggregates

LINQ、Joins、Grouping和Aggregates
EN

Stack Overflow用户
提问于 2011-03-10 08:01:13
回答 1查看 475关注 0票数 3

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

步骤1:

代码语言:javascript
复制
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步:

代码语言:javascript
复制
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))
                      });

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

代码语言:javascript
复制
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)的聚合值可用。

那么,有没有人知道是否可以在单个查询中同时从子表和父表获得聚合呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-12 13:21:07

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

我建议将较大的查询拆分成更小的、更容易理解的部分,如前两个示例所示。对查询使用好的名称可以使它们更容易阅读。例如,我可以将query命名为orderQuantities。from q in query没有传达太多含义,但是from oq in orderQuantities让我知道查询结束的是哪种类型的数据。

如果你真的认为你需要把它们放在一起:

代码语言:javascript
复制
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))
    }); 

这太难看了..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5253891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档