簡體   English   中英

C#將兩個集合連接在一起

[英]C# Joining two collections together

C#中的新功能,試圖將兩個集合連接在一起,最終結果將提供兩個集合的所有數據。 現在,該代碼僅返回匹配的文檔。 謝謝。

//Collections
   IQueryable collection1 = database.GetCollection("MainData").AsQueryable();
   IQueryable collection2 = database.GetCollection("SecondaryData").AsQueryable(); 

          var result = collection2.Join(collection1, a => a.ID, b => b.ID, (a, b) => new { a, b })
                .ToList()
                .Select(s => new ViewModel.Customer()
                {
                    ID = s.b.ID,
                    FirstName = s.b.FirstName
                    LastName = s.b.LastName
                }).ToList();


            return result;

好的,所以您有兩個查詢來獲取不同類型的序列,比如說ClassAClassB 兩種類型都有一個屬性Id ,並且您想要對該ID進行某種連接。

...最終結果將提供兩個集合的所有數據

很高興意識到存在各種類型的聯接。 您編碼的聯接是最簡單的聯接,通常稱為inner join 結果序列中只有具有匹配ID的元素。 因此,如果您擁有Id = 3的ClassA,但沒有具有此Id的ClassB,那么它將不會出現在您的結果中。

IQueryable<ClassA> itemsA = ...
IQueryable<ClassB> itemsB = ...

var innerJoinResult = itemsA.Join(itemsB,   // inner join A and B
    itemA => itemA.Id,                      // from each itemA take the Id
    itemB => itemB.Id,                      // from each itemB take the Id
    (itemA, itemB) => new                   // when they match make a new object
    {                                       // where you only select the properties you want
        NameA = itemA.Name,
        NameB = itemB.Name,
        BirthdayA = itemA.Birthday,
        ...
    });

如果您還希望項目沒有匹配的ID,那么所有沒有匹配的itemB.Id的itemsA和沒有匹配的itemA.Id的所有itemB,則必須進行完全外部聯接。 這似乎是您寫時的意思:

...最終結果將提供兩個集合的所有數據

LINQ沒有此功能作為標准,但是您可以為其編寫擴展方法。

有關完整外部聯接的LINQ擴展功能,請參見stackoverflow中的出色的第二個答案

另請參閱擴展方法揭秘

您可以使用Concat ,它將返回第一個集合的項目,然后返回第二個集合的項目:

var combined = collection1.Concat(collection2);

或者,您可以使用Union ,它將從兩個集合中返回不同的值:

var combined = collection1.Union(collection2);

為此,您還可以從collection1到collection2進行反向聯接,然后對結果進行UNION

    var resultSet1 = collection2.Join(collection1, a => a.ID, b => b.ID, (a, b) => new { a, b })
          .ToList()
          .Select(s => new ViewModel.Customer()
          {
              ID = s.b.ID,
              FirstName = s.b.FirstName,
              LastName = s.b.LastName
          }).ToList();

    var resultSet2 = collection1.Join(collection2, a => a.ID, b => b.ID, (a, b) => new { a, b })
            .ToList()
            .Select(s => new ViewModel.Customer()
            {
                ID = s.b.ID,
                FirstName = s.b.FirstName,
                LastName = s.b.LastName
            }).ToList();


    return resultSet1.Union(resultSet2);

暫無
暫無

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

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