了解Linq链接语法中的GroupJoin和Join(作业)

时间:2019-06-24 05:39:22

标签: c# linq

我需要帮助来理解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 [])。但是这里的“幕后”是什么?)还有一个关于(**)这行创建新问题的问题对象,这是一个匿名类,或者如果不是,则是什么。

1 个答案:

答案 0 :(得分:4)

第四个参数-映射到documentation中的第五参数(因为第一个参数是扩展方法调用的目标)只是结果选择器。这个函数接受两个参数:第一个是“外部”序列的元素(在您的情况下为people数组,第二个是“内部”序列的元素序列({{1} }数组)与外部元素具有相同的键。该函数应返回一个“结果”元素,方法调用的整体结果是这些结果的序列。

该函数对于每个“外部”元素均被调用一次,因此您将:

  • 首次致电:ID为1的人员,以及ID为1、4、5、7的产品
  • 第二次呼叫:ID为2的人员,以及ID为2的产品
  • 第三次致电:人员ID 3,产品序列为空

您的查询很复杂,因为您要为结果使用匿名类型,并使用另一个查询来构造匿名类型的实例。这是一个更简单的查询,可能有助于阐明:

items