如果列表B为空,如何使用LINQ EVEN从列表A和列表B中获取元素(仍将返回列表A的元素,但列表B的元素将为空)
这个想法是能够根据列表A和B的元素重新创建一个匿名对象。
From elemListA In data.ListA_
From elemListB In elemListA.ListB _
Select New With { _
.ElementA = elemListA.ElementA, _
.ElementB = elemListA.ElementB, _
.ElementC = elemListB.ElementA, _
.elementD = elemListB.ElementB, _
}).ToList()
问题是,如果ListB为空,它将崩溃..另一个问题是如果我放置一个不包含ListA元素的地方,因为它们被where子句过滤掉了,我希望有它们。
我会做一个连接,但问题是两个对象之间没有关系..除了ListA中的一个元素有一个ListB。
答案 0 :(得分:2)
当没有连接时,获得外连接效果是非常困难的。基本上,我可以看到两种方法:
当elemListA.ListB
为空时,将Nothing
替换为带有一个空(ListB
)元素的数组。
Dim array(0) as Nullable(of ElementB)
...
From elemListB In If(elemListA.ListB, array)
使用Union
:首先查询具有ListA
的{{1}}个对象,并将其与没有的对象联合起来。在两个查询中,您必须创建完全相同的匿名类型,因此在第二部分中,您必须将ListB
放在由.ElementB = emptyB
声明emptyB
的位置。
答案 1 :(得分:0)
听起来你所描述的是左外连接。 Microsoft wrote a tutorial使用LINQ执行此操作。
专门针对您的问题,您需要检查空值。在他们的示例中,如果值为null,Microsoft使用三元运算符返回空字符串。
var query = from person in people
join pet in pets on person equals pet.Owner into gj
from subpet in gj.DefaultIfEmpty()
select new { person.FirstName, PetName = (subpet == null ? String.Empty : subpet.Name) };