0

如果列表 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 为空,它会崩溃。另一个问题是,如果我放一个 where 它不会包含 ListA 的元素,因为它们被 where 子句过滤掉了,我想拥有它们。

我会做一个连接,但问题是这两个对象之间没有关系。除了 ListA 中的一个元素有一个 ListB。

4

2 回答 2

2

当无法进行连接时,要获得外连接效果非常困难。基本上,我可以看到两种方法:

  1. 为 null时,用一个空 ( ) 元素替换elemListA.ListB数组。NothingListB

    Dim array(0) as Nullable(of ElementB)
    ...
    From elemListB In If(elemListA.ListB, array)
    
  2. 使用Union:首先查询有的ListA对象,ListB并与没有的对象联合。在这两个查询中,您必须创建完全相同的匿名类型,因此在第二部分中,您必须将声明的.ElementB = emptyB位置放在.emptyBDim emptyB As ElementB = Nothing

于 2013-04-24T20:34:33.123 回答
0

听起来您所描述的是左外连接。Microsoft编写了一个关于使用 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) };
于 2013-04-24T19:00:24.907 回答