【问题标题】:Flat collection to One to Many collection平面集合到一对多集合
【发布时间】:2016-03-15 10:02:59
【问题描述】:

我需要获取一个由连接等查询创建的对象列表,并生成一对多的对象层次结构。我将如何使用 Linq 做到这一点?

class Source
{
  int Id,
  string Name,
  ....  
  int MemberId,
  string MemberName,
  ....
}

class Target
{
  int Id,
  string Name,
  ....
  ICollection<Member> Members
}

class Member
{
  int Id,
  string Name,
  ....
}

示例数据

List = 
{
  new Source {Id = 1, Name = "Test1", ... MemberId = 1, MemberName = "John", ...},
  new Source {Id = 2, Name = "Test2", ... MemberId = 2, MemberName = "Max", ...},
  new Source {Id = 2, Name = "Test2", ... MemberId = 4, MemberName = "Ruby", ...}
}

期望的结果

List = 
{
  new Target {Id = 1, Name = "Test1", ... 
              Members = new List { new Member {Id = 1, Name = "John", ...}}
             },
  new Target {Id = 2, Name = "Test2", ... 
              Members = new List { new Member {Id = 2, Name = "Max", ...},
                                   new Member {Id = 4, Name = "Ruby", ...}}
             }
}

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    您正在寻找Enumerable.GroupBy,您必须按匿名类型分组:

    var result = List
        .GroupBy(s => new { s.Id, s.Name })
        .Select(xGrp => new Target
        {
            Id = xGrp.Key.Id,
            Name = xGrp.Key.Name,
            Members = xGrp
                .Select(s => new Member 
                { 
                    Id = s.MemberId, 
                    Name = s.MemberName
                })
                .ToList()
        })
        .ToList();
    

    【讨论】:

      猜你喜欢
      • 2022-01-10
      • 2021-05-02
      • 2013-11-29
      • 1970-01-01
      • 2019-06-27
      • 2011-10-28
      • 2014-04-18
      • 2011-07-23
      • 1970-01-01
      相关资源
      最近更新 更多