2016-08-19 50 views
3

如果我得到这个列表LINQ分组通过与左联接结果

PersonPhone

------------------------------------------------------------ 
| **PersonId** |**Name** | **PhoneId** | **PhoneNumber** | 
------------------------------------------------------------ 
|    1 | John Doe |   1 | 111-55-5855  | 
------------------------------------------------------------ 
|    1 | John Doe |   2 | 111-55-5521  | 
------------------------------------------------------------ 
|    2 | Mary Jane|   3 | 254-565-855  | 
------------------------------------------------------------ 
|    3 | J. Watson|   NULL|    NULL| 
------------------------------------------------------------ 

我需要映射到该对象:

public class PersonContactInfo { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<string> Phones { get; set; } 
} 

使用LINQ,哪能为每个人获取一行,他的手机在列表和分页中?

我已经有一个查询,其结果是像PersonPhone结果集,但我不知道如何按PersonId分组,然后将所有PhoneNumbers加入列表和分页。例如,如果我想要三页的页面大小,如果实际查询返回4行,如何进行sql查询以获得John Doe,Mary Jane和J. Watson的手机?

注意:我没有(也不能)使用实体框架,我正在做的是和SQL查询,它们填充了一个列表PersonPhone,就像EF一样。

回答

1

应用一个group by

var query= PersonPhoneSet 
      .GroupBy(p=>new {p.PersonId, p.Name}) 
      .Select(g=> new PersonContactInfo 
         { 
          Id=g.Key.PersonId, 
          Name=g.Key.Name, 
          Phones= g.Select(p=>p.PhoneNumber).ToList() 
         } 
        ); 
+0

如果我有更多的领域,我需要把所有这些领域进组的? –

+0

那么,如果这些字段将具有与这两个值相同的值,并且希望将这些属性保存为投影的一部分,则我认为使用这种方法很方便。另一种方法可以做到,例如,'g.First()。Name'来获得组的第一个元素并获得您需要的值 – octavioccl

+0

谢谢,我遵循First()的示例,现在它正在工作。欢迎使用 –