[英]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;
好的,所以您有兩個查詢來獲取不同類型的序列,比如說ClassA
和ClassB
。 兩種類型都有一個屬性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.