如何使用LINQ从列表A和列表B中获取元素

时间:2013-04-24 18:41:15

标签: vb.net linq

如果列表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。

2 个答案:

答案 0 :(得分:2)

当没有连接时,获得外连接效果是非常困难的。基本上,我可以看到两种方法:

  1. elemListA.ListB为空时,将Nothing替换为带有一个空(ListB)元素的数组。

    Dim array(0) as Nullable(of ElementB)
    ...
    From elemListB In If(elemListA.ListB, array)
    
  2. 使用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) };