代码之家  ›  专栏  ›  技术社区  ›  trh88

嵌套枚举上的GroupBy

  •  1
  • trh88  · 技术社区  · 1 年前

    我很难使用 GroupBy 当通过对象的嵌套属性进行分组时。

    数据结构如下:

    public class Activity
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public IEnumerable<Business> Businesses { get; set; }
    }
    
    public class Business
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    

    我有一个活动列表( IEnumerable<Activity> )就像这样:

    • 活动1
      • 业务A
      • 业务B
    • 活动2
      • 业务B
    • 活动3
      • 业务A

    最后,我想将活动分组到各自的业务中:

    • 业务A

      • 活动1
      • 活动3
    • 业务B

      • 活动1
      • 活动2

    我试过各种组合 分组 SelectMany / Select 但似乎无法正确映射分组。

    3 回复  |  直到 1 年前
        1
  •  2
  •   Svyatoslav Danyliv    1 年前

    请尝试以下查询:

    var query =
        from a in Activities
        from b in a.Businesses
        group new { a, b } by b.Id into g
        select new 
        {
            Business = g.Select(x => x.b).First(),
            Activities = g.Select(x => x.a).ToList()
        };
    
    var result = query.ToList();
    
        2
  •  1
  •   GregorMohorko    1 年前

    这样可以:

    它获得了所有独特的业务,然后从中创建具有包含此业务的所有活动的组:

    var result = activities
        .SelectMany(a => a.Businesses)
        .DistinctBy(b => b.Id)
        .GroupBy(
            b => b,
            b => activities.Where(a => a.Businesses.Any(ab => ab.Id == b.Id)));
    

    注意:我还假设 Id 是它应该分组的属性。

        3
  •  1
  •   NotFound    1 年前

    以下内容应该有效:

    var businesses = activities
        //flatten the structure for every business
        //for every entry create a new object that contains the activity and business
        .SelectMany(x => x.Businesses, (activity, business) => new { activity, business })
        //group by the business id and for each id select all activities
        .GroupBy(x => x.business.Id, x => x.activity)
        //materialize the enumerable (not required)
        .ToList();