Vb.net 如何使用LINQ从列表A和列表B中获取元素
如何使用LINQ从列表A和列表B中获取元素,即使列表B为空(仍将返回列表A的元素,但列表B的元素将为空) 其思想是能够基于列表a和B的元素重新创建单个匿名对象Vb.net 如何使用LINQ从列表A和列表B中获取元素,vb.net,linq,Vb.net,Linq,如何使用LINQ从列表A和列表B中获取元素,即使列表B为空(仍将返回列表A的元素,但列表B的元素将为空) 其思想是能够基于列表a和B的元素重新创建单个匿名对象 From elemListA In data.ListA_ From elemListB In elemListA.ListB _ Select New With { _ .ElementA = elemListA.ElementA, _ .ElementB = elemListA.Element
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为空,它将崩溃。。另一个问题是,如果我把a放在where中,它将不包括ListA的元素,因为它们被where子句过滤掉了,我想要它们。
我想做一个连接,但问题是这两个对象之间没有关系。。除了ListA中的一个元素之外,还有一个ListB。听起来像是一个左外连接。微软希望通过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) };
在不可能连接的情况下,获得外部连接效果非常困难。基本上,我可以看到两种方法:
ListB
为空时,将elemListA.ListB
替换为带有一个空(Nothing
)元素的数组
Dim数组(0)可为空(元素B)
...
来自If中的elemListB(elemListA.ListB,数组)
Union
:首先查询包含ListB
的ListA
对象,并与未包含的对象进行Union。在这两个查询中,您必须创建完全相同的匿名类型,因此在第二部分中,您必须将.ElementB=emptyB
放在Dim emptyB
声明为ElementB=Nothing的位置这个解决方案的问题在于你引入了。。person等于pet.Owner,这意味着你需要一个从宠物到主人的证明。在我的例子中,我没有这样的引用,也没有。我通过在第二个列表中添加一个空项来修复我的问题。因此,解决方案1对我来说很容易,并且已经被接受。谢谢