[英]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.