我需要帮助来理解GroupJoin的第四个参数。根据我到目前为止的理解,GroupJoin接受4个参数:(1,2)-第一个是辅助列表,第二个参数是Func,它从第一个对象类型返回键,换句话说,从第一个对象类型返回键(人)。 (3,4)一种Func,在这种情况下,Func从第二个列表的第二个对象类型返回键(项),并且一个将分组后的对象与组本身一起存储的函数(我不明白此部分的代码) 。考虑到这一点并具有以下代码:
var products = new Product[]
{
new Product { Id = 1, Type = "Phone", Model = "OnePlus", Price = 1000 },
new Product { Id = 2, Type = "Phone", Model = "Apple", Price = 2000 },
new Product { Id = 3, Type = "Phone", Model = "Samsung", Price = 1500 },
new Product { Id = 4, Type = "TV", Model = "Samsung 32", Price = 200 },
};
var people = new Person[]
{
new Person { Id = 1, Name = "Ivan Ivanov", Money = 150000 },
new Person { Id = 2, Name = "Dragan Draganov", Money = 250000 },
new Person { Id = 3, Name = "Ivelin Ivelinov", Money = 350000
}
};
var items = new Item[]
{
new Item { PersonId = 1, ProductId = 1, Amount = 1 },
new Item { PersonId = 1, ProductId = 4, Amount = 1 },
new Item { PersonId = 1, ProductId = 5, Amount = 1 },
new Item { PersonId = 1, ProductId = 7, Amount = 1 },
new Item { PersonId = 2, ProductId = 2, Amount = 1 },
};
查询:
var productOwnerList = people
.GroupJoin(
items,
o => o.Id,
i => i.PersonId,
(o, i) => new <--- (**)
{
Person = o,
Products = i
.Join(products,
o1 => o1.ProductId,
i2 => i2.Id,
(o1, i2) => i2) <--- (*)
.ToArray()
})
.ToArray();
仅此而已,我只为数据发布了几行。我需要帮助以了解join方法的第4个参数在这里执行的是什么->(*)(将分组对象与组本身存储在一起)?当我看到结果时,会看到所有Person id都与产品密钥相关联,并根据Items列表(一对多)加入了两个列表。但是我无法确切地知道这条线是什么意思(o1,o2)=> i2)。很明显,这是在做什么(将与每个人的ID相关的所有项目放入每个数组中的每个项目(items [])。但是这里的“幕后”是什么?)还有一个关于(**)这行创建新问题的问题对象,这是一个匿名类,或者如果不是,则是什么。
答案 0 :(得分:4)
第四个参数-映射到documentation中的第五参数(因为第一个参数是扩展方法调用的目标)只是结果选择器。这个函数接受两个参数:第一个是“外部”序列的元素(在您的情况下为people
数组,第二个是“内部”序列的元素序列({{1} }数组)与外部元素具有相同的键。该函数应返回一个“结果”元素,方法调用的整体结果是这些结果的序列。
该函数对于每个“外部”元素均被调用一次,因此您将:
您的查询很复杂,因为您要为结果使用匿名类型,并使用另一个查询来构造匿名类型的实例。这是一个更简单的查询,可能有助于阐明:
items