2016-03-15 90 views
0

我需要获取作为查询与连接等结果创建的对象的列表,并产生一对多的对象层次结构。我如何与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", ...}} 
      } 
} 

回答

0

您正在寻找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(); 
+0

非常感谢,这是我正在寻找的 – Matt