Linq:如何通过多对多关系进行分组

本文关键字:关系 何通过 Linq | 更新日期: 2023-09-27 18:06:12

我有一个像next这样的实体项目:

class Item
{
  int Id;
  string Name;
  int GroupId;
  virtual Group Group; //refers to Group table
  string Size;
  virtual ICollection<Set> Sets; //refers to many-to-many relation
}

所以我想把所有的项目分组如下:

ICollection<IGrouping<string, Item>> list = AllItems.GroupBy(x => x.Group.Name).ToList();
ICollection<IGrouping<string, Item>> list = AllItems.GroupBy(x => x.Size).ToList();

我想要相同的,但是用集合。这有可能吗?

澄清。例如,Item1包含在每一个集合中,那么我想在分组结束时按集合下一个列表:

Set 1
   Item 1
   Item 2
Set 2
   Item 1
   Item 3
Set 3
   Item 1
   Item 4
.....

注意,我需要相同的结构ICollection<IGrouping<string, Item>>,在代码中传递它。我在想也许要创建一个中间结构,它可以接受ICollection<IGrouping<string, Item>>和包含我的项目的set列表?

Linq:如何通过多对多关系进行分组

SelectMany + GroupBy与值选择器:

ICollection<IGrouping<string, Item>> list = AllItems
    .SelectMany(x => x.Sets
        .Select(y => new
        {
            Key = y,
            Value = x
        }))
    .GroupBy(x => x.Key.Name, x => x.Value)
    .ToList();