LINQ查询结果的属性列表

3

我有两个类:

class Person 
{
    public int PersonId { get; set; }
    public string Name { get; set; }  
}
class Phone
{
    public int PersonId { get; set; }
    public string Number { get; set; }
}

还有两个集合:

List<Person> Persons;
List<Phone> Phones;

我希望使用linq将它们连接,并作为Result对象列表返回结果:
class Result
{
    public string Name { get; set; }
    public List<string> Numbers { get; set; }
}

如何在Linq中实现这个功能?
6个回答

4
var resultList = 
from person in Persons
select new Result
{
    Name = person.Name,
    Numbers = 
    (
        from phone in Phones 
        where phone.PersonId == person.PersonId 
        select phone.Number
    ).ToList()
}

1
你可以使用 Linq 的 join 函数。
var joinedList = from c in Persons
                 join p in Phones p on p.PersonId equals c.PersonId
                 select new {Persons = c, Phones = p}; 

更新:

看起来必须作为结果返回。我们开始吧。

var results = Persons.Select(c => new Result
              {
                  Name = c.Name, 
                  Numbers = Phones.Where(p=>p.PersonId == c.PersonId)
                                  .Select(n=>n.Number).ToList()
              });

这不是 OP 所要求的。人们可能有多个电话号码,他想要他的 Result 类的列表。(我也犯了同样的错误)。 - George Duckett
哇,忘记读三个单词就被砍了!无论如何,已更新以包含正确的结果。 - Jethro

1

假设所有电话号码都指向一个现有的人,这将起作用:

var results = Phones.GroupBy(p => p.PersonId)
                    .Select(g => new Result()
{
    Name = Persons.Single(x => x.PersonId == g.Key).Name,
    Numbers = g.Select(x => x.Number).ToList()
});

1

与Mike相似...

var resultList = from person in persons
select new Result
{
    Name = person.Name, 
    Numbers = phones
        .Where(x => x.PersonId == person.PersonId)
        .Select(x => x.Number)
        .ToList()
};

1

纯粹的方法语法

List<Person> people = new List<Person>();   /*Populate the list however you wish*/
List<Phone> phones = new List<Phone>();     /*Populate the list however you wish*/

List<Result> results = people
    .Select(singlePerson => new Result 
    { 
        Name = singlePerson.Name, 
        Numbers = phones
            .Where(singlePhone => singlePhone.PersonId.Equals(singlePerson.PersonId))
            .Select(singlePhone => singlePhone.Number)
            .ToList() 
    })
    .ToList();

1

我不会只是通过将电话项添加到人员来加入这2个集合。根据您想要实现的目标,我会使用接口来指定这2个类具有共同点。

但其他解决方案也可以工作,这取决于您的问题是否适用于该解决方案。


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