将一个包含另一个对象列表属性的列表展平

8

我有以下几个类:

public class Owner
{
    public string Id { get; set; }
    public string Name { get; set; }
}
public class Main
{
    public string Id { get; set; }
    public string Name { get; set; }
    public List<Owner> Owners { get; set; }
}

我想将 List<Main> 转换成 List<FlatList>,其中 FlatList 是

public class FlatList
{
        public string Id { get; set; }          // Id from Main
        public string Name { get; set; }        // Name from Main
        public string OwnerId { get; set; }     // Id from each Owner in a Main's Owner
        public string OwnerName { get; set; }   // Name from each Owner in a Main's Owner
}

很遗憾,我还没有能够找到执行此操作的LinQ查询。

3个回答

11
您应该使用SelectMany来展开一个Main对象序列:

对序列的每个元素执行一个转换函数,并将结果序列的所有元素合并为一个序列。

因此,它会将每个Main对象投影到FlatList对象序列中,然后将结果序列展开为一个FlatList序列。
var flatList = mainList.SelectMany(m => 
    m.Owners.Select(o => 
        new FlatList { 
              Id = m.Id, 
              Name = m.Name, 
              OwnerId = o.Id,
              OwnerName = o.Name
         })).ToList()

4
List<Main> mainList = ...
var flatList = (
    from main in mainList
    from owner in main.Owners
    select new FlatList {
        Id = main.Id, Name = main.Name,
        OwnerId = owner.Id, OwnerName = owner.Name
    }).ToList();

2

您可以使用Linq(在幕后进行秘密循环)来完成这项任务:

from m in mainList
from o in m.Owners
select new FlatList
{
   Id  = m.Id,
   Name = m.Name,
   OwnerId = o.OwnerId ,
   OwnerName = o.OwnerName 
};

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