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

时间:2016-03-09 11:35:47

标签: 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
            });

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

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

如何使用LINQ实现此目的?

2 个答案:

答案 0 :(得分:9)

确实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(); 就是答案。另一种用法是:

var data = from d in dogs
           from df in d.DogFriends
           select new NewObject {
               fieldOne = d.propertyOne,
               fieldTwo = d.propertyTwo
               fieldThree = df.propertyOne
           }

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

09,39 * * * *  root [-x /usr/lib/php/sessionclean] && /usr/lib/php/sessionclean

答案 1 :(得分:1)

使用.SelectMany重载 https://msdn.microsoft.com/en-us/library/bb534631%28v=vs.110%29.aspx

var query = petOwners .SelectMany( petOwner => petOwner.Pets, (petOwner, petName) => new { petOwner, petName } )