C# 具有左连接结果的LINQ分组依据
如果我得到这份名单 个人电话C# 具有左连接结果的LINQ分组依据,c#,linq,C#,Linq,如果我得到这份名单 个人电话 ------------------------------------------------------------ | **PersonId** |**Name** | **PhoneId** | **PhoneNumber** | ------------------------------------------------------------ | 1 | John Doe | 1 | 111-55-58
------------------------------------------------------------
| **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; }
}
公共类PersonContactInfo{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共列表电话{get;set;}
}
有了LINQ,我怎样才能让每个人都有一行,他的手机在一个列表中,并且可以传呼
我已经有了一个查询,其结果类似于PersonPhone的结果集,但我不知道如何按PersonId分组,然后将所有电话号码加入列表,并进行分页。例如,如果我希望页面大小为3,如果实际查询返回4行,如何进行sql查询以获取John Doe、Mary Jane和J.Watson的手机
注意:我没有(也不能)使用实体框架,我所做的是和EF一样,使用sql查询来填充个人电话的列表。应用
分组方式
:
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()
}
);
如果我有更多的字段,我需要把所有这些字段放到分组中,如果这些字段的值与这两个字段的值相同,并且你想将这些属性保存为投影的一部分,我认为这样做很方便。另一种方法是,例如,
g.First().Name
获取组的第一个元素并获取所需的值谢谢,我使用First()跟踪了您的示例,现在它开始工作了。