在LINQ中连接父和子集合以获得单个合并输出

NZJ*_*mes 4 c# linq

我有一个项目集合,每个项目都包含一个辅助集合.我需要根据次要项目的总集生成新项目列表.例如,如果你有一个狗的列表,每只狗有一个朋友列表,我需要所有狗的所有狗朋友的总清单.

通常我会使用SelectMany执行此操作,但这里的难点是我的辅助对象不包含对父对象的引用,并且新列表需要包含来自辅助对象和父对象的字段.即如下

var dogs = List<Dog>
var newList = dogs.SelectMany(i => i.DogFriends).Select(dogFriend => new NewObject
            {
                fieldOne = dog.propertyOne,
                fieldTwo = dog.propertyTwo
                fieldThree = dogFriend.propertyOne
            });
Run Code Online (Sandbox Code Playgroud)

在上面,我没有提到狗,所以我不能选择那些.

我正在寻找的是一种在SQL中连接两个表的方法,因此您可以从两个对象中选择值.但我希望总值与子对象的总数相匹配.即如果你有3只狗,每只3个朋友,最终列表将有9个对象.

如何使用LINQ实现这一目标?

Maa*_*ten 10

确实.SelectMany(...)是答案.另一种用法是:

var data = dogs
    .SelectMany(d => d.DogFriends.Select(df => new { d, df })
    .Select(x =>
        // Now you can use both d and df
        new NewObject {
            fieldOne = x.d.propertyOne,
            fieldTwo = x.d.propertyTwo
            fieldThree = x.df.propertyOne
        }
    )
    .ToArray();
Run Code Online (Sandbox Code Playgroud)

更简单的是使用查询LINQ表示法.这基本上在编译时转换为上述内容.

var data = from d in dogs
           from df in d.DogFriends
           select new NewObject {
               fieldOne = d.propertyOne,
               fieldTwo = d.propertyTwo
               fieldThree = df.propertyOne
           }
Run Code Online (Sandbox Code Playgroud)