使用左连接结果进行LINQ分组

本文关键字:LINQ 分组 结果 连接 | 更新日期: 2023-09-27 18:03:05

如果我有这个列表

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分组,然后将所有phonenumber加入到列表中,并分页。例如,如果我希望页面大小为3,如果实际查询返回4行,如何使用sql查询获取John Doe, Mary Jane和J. Watson的手机?

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

使用左连接结果进行LINQ分组

应用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()
                         }
                     );