簡體   English   中英

了解Linq鏈接語法中的GroupJoin和Join(作業)

[英]Understanding the GroupJoin and Join in Linq chaining syntax (Homework)

我需要幫助來了解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 [])。但是這里的“幕后”是什么?)還有一個關於(**)這行創建新問題的問題對象,這是一個匿名類,或者如果不是,它是什么。

第四個參數-映射到文檔中第五個參數(因為第一個參數是擴展方法調用的目標)只是結果選擇器。 該函數接受兩個參數:第一個是“外部”序列的元素(在您的情況下為people數組),第二個是“內部”序列的元素(在您的情況下為items數組)的元素序列與外部元素相同的鍵。 該函數應返回一個“結果”元素,並且方法調用的總體結果是這些結果的序列。

每個“外部”元素都會調用一次該函數,因此您需要:

  • 首次致電:個人ID 1,以及ID 1、4、5、7的產品
  • 第二次致電:個人ID 2,產品ID 2
  • 第三次致電:個人ID 3,產品序列為空

您的查詢很復雜,因為您要為結果使用匿名類型,並使用另一個查詢來構造匿名類型的實例。 這是一個更簡單的查詢,可能有助於闡明:

var productOwnerList = people
    .GroupJoin(
        items,
        o => o.Id,
        i => i.PersonId,
        (person, items) => $"{person.Id}: {string.Join(",", items.Select(item => item.ProductId))}"
    .ToArray();  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM