使用左连接的LINQ分组结果

3
如果我得到了这个列表 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分组,然后将所有电话号码连接到List中并进行分页。例如,如果我想要每页三个,如何编写sql查询以获取John Doe、Mary Jane和J. Watson及其电话,如果实际查询返回4行?
注意:我不是(也不能)使用Entity Framework,我正在使用一个sql查询来填充PersonPhone列表,就像EF一样。
1个回答

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

如果我有更多的字段,我需要将所有这些字段放入“group by”中吗? - antonio_mg
如果这些字段将具有与这两个相同的值,并且您希望将这些属性保存为投影的一部分,那么我认为这样做很方便。另一种方法可能是执行g.First().Name之类的操作,以获取组的第一个元素并获取所需的值。 - ocuenca
谢谢,我按照你的示例使用了First(),现在它可以正常工作了。 - antonio_mg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接