LINQ Group By 和选择集合

Posted

技术标签:

【中文标题】LINQ Group By 和选择集合【英文标题】:LINQ Group By and select collection 【发布时间】:2012-05-17 14:33:04 【问题描述】:

我有这个结构

Customer
 - has many Orders
  - has many OrderItems

给定OrderItems 的子集,我想通过 LINQ 生成CustomerItems 的列表:

List of new  Customer, List<OrderItem> Items 

这是客户从商品子集中订购的所有商品的分组

如何使用 LINQ 回溯订单并按客户分组以生成此对象?

到目前为止,我正在做类似的事情

items
 .GroupBy(i => i, i => i.Order.Customer, (i, customer) => new customer, i)

但这显然不是一个列表。我猜我在某个地方需要一个 SelectMany,但可以使用一些指针。

【问题讨论】:

【参考方案1】:

我想你想要:

items.GroupBy(item => item.Order.Customer)
     .Select(group => new  Customer = group.Key, Items = group.ToList() )
     .ToList() 

如果你想继续使用你当前使用的GroupBy的重载,你可以这样做:

items.GroupBy(item => item.Order.Customer, 
              (key, group) =>  new  Customer = key, Items = group.ToList() )
     .ToList() 

...但我个人觉得不太清楚。

【讨论】:

您需要对组进行 ToList() 调用吗?最后一个 ToList() 还不够吗? @Joanna:根据OP的要求,匿名类型的Items属性必须是一个列表。 您能否为此提供一些帮助:***.com/questions/44764687/… 似乎“group by”在 EfCore5 中不再适用,即使在最简单的情况下(from la in dbContext.LawArticles group la by new la.TenantId, la.LawArticleId into aAgg select new TenantId = aAgg.Key.TenantId, LawArticleId = aAgg.Key.LawArticleId, ArticleTexts = aAgg.ToList() ,抱怨“无法翻译 LINQ 表达式 'GroupByShaperExpression ...”...【参考方案2】:

你可能也喜欢这个

var Grp = Model.GroupBy(item => item.Order.Customer)
      .Select(group => new 
         
             Customer = Model.First().Customer, 
             CustomerId= group.Key,  
             Orders= group.ToList() 
       )
      .ToList();

【讨论】:

为什么我得到的是item.Field&lt;&gt;而不是.Order?我正在使用数据表。【参考方案3】:

你可以通过加入群组来实现它

var result = (from c in Customers
          join oi in OrderItems on c.Id equals oi.Order.Customer.Id into g
          Select new  customer = c, orderItems = g);

c 是客户,g 是客户订购的商品。

【讨论】:

以上是关于LINQ Group By 和选择集合的主要内容,如果未能解决你的问题,请参考以下文章

LINQ:从列表中选择项目(Group By/Select/Sum & Max!)

mysql group by 的用法,集合后取出指定的字段

如何通过 join 和 group by 在 C# Linq 中获取 Min?

java中list集合的内容,如何使用像数据库中group by形式那样排序

如何使用 group by 和 order by LINQ DataTable 以删除重复数据

Linq-排序Order By