2013-04-24 24 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

相關問題