我有一组项目,每个项目都包含一个辅助集合。我需要根据次要项目的总集生成新项目列表。例如,如果你有一个狗列表,每只狗有一个朋友列表,我需要所有狗的所有狗朋友的总清单。
通常我会使用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实现此目的?
答案 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 }
)