2013-04-24 61 views
0

如何使用LINQ EVEN从列表A和列表B获取元素如果列表B为空(仍然会返回列表A的元素,但列表B的元素将为空)如何使用LINQ从列表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

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

  1. 由阵列与一个空(Nothing)元件更换时elemListA.ListBListB为空。

    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声明。

+0

我通过在第二个列表中添加空项目来解决了我的问题。所以解决方案1对我来说很简单,并且已被接受。谢谢! – Rushino 2013-04-24 20:37:56

0

听起来像你所描述的是左外连接。微软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) }; 
+0

这个解决方案的问题是,你介绍..人等于pet.Owner这意味着你需要从宠物的所有者的参考。在我的情况下,我没有这样的参考,我不能有一个。 – Rushino 2013-04-24 19:46:17

相关问题