嵌套3层LINQ查询

Cra*_*ion 0 .net c# linq lambda

我有多个Person对象,每个对象可能包含0个或更多Email对象.我需要搜索针对人员集合的人员,并查找记录,其中Person中包含的电子邮件地址也存在于人员记录集合中的任何一个中.然后我可以采取行动合并这些记录

下面的摘要类结构:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public IList<Email> Emails { get; set; }
}


public class Email
{
    public string Label { get; set; }
    public string Address{ get; set; }
    public bool IsPrimary { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我需要找到一个列表并找到具有相同电子邮件地址的人.但是,我无法弄清楚如何构建一个匹配Person的LINQ查询并循环收集Person of obejcts并比较电子邮件地址?

理想情况下,这将是一个lambda,但很想知道创建它的一步一步的过程.

Ser*_*kiy 5

您可以将人员投射到电子邮件人员对的序列,并通过电子邮件地址对这些序列进行分组 在这种情况下,每个组将拥有共享相同电子邮件地址(组的密钥)的人员:

people.SelectMany(p => p.Emails.Select(e => new { e.Address, Person = p }))
      .GroupBy(x => x.Address)
      .Select(g => new { Address = g.Key, People = g.Select(x => x.Person) })
Run Code Online (Sandbox Code Playgroud)

查询语法:

from p in people
from e in p.Emails
select new { e.Address, Person = p } into x
group x by x.Address into g
select new {
   Address = g.Key,
   People = g.Select(x => x.Person)
}
Run Code Online (Sandbox Code Playgroud)

注意:如果您需要整个电子邮件是唯一的,则覆盖EqualsGetHashCode方法,Email以便通过其字段的值而不是通过引用来比较此类的实例(或确保您在不同的人之间共享相同的电子邮件实例).