2011-07-07 30 views
2

這裏是我的查詢的摘錄:DefaultIfEmpty在LINQ到SQL加入導致重複

... 
join p in dc.PODs on c.ID equals p.Consignment into pg 
from pgg in pg.DefaultIfEmpty() 
... 

什麼查詢應該做的就是與貨物相關聯的所有「莢」,將其存儲爲一個IEnumerable對象(這似乎工作),所以我可以在查詢從查詢​​生成的主IEnumerable時通過它運行。

問題是,我得到重複的主行與DefaultIfEmpty行,這隻發生在一行有多個PODs - 所以它返回一個行爲每個POD,這是不正確的。如果我取出pg.DefaultIfEmpty()行,它似乎工作更好一點,但我仍然想獲得沒有POD的行。

任何想法傢伙?

+0

可以顯示完整的查詢。 – msarchet

+0

對不起,目前我不能上網,因爲我在沒有互聯網接入的機器上工作。當我有5分鐘時間,我會輸入它:) – Chris

+0

工作沒有互聯網接入?不會管理第二個 –

回答

0

請原諒我,如果我對你的意圖不滿意,因爲我的查詢摘錄中看不到數據的完整結構或最初的from或最終的select子句。所以我發佈了我認爲是基於您構建的片段和示例數據的解決方案。如果我關機,請告訴我,我會糾正它。

如果你想託運到豆莢行的列表,每一批貨到POD上自己的路線,你可以做這樣的事情(記住我fromselect條款都是基於我的樣本數據):

 // select the consignment id & name (i made up) and each matching POD 
     var results = from c in consignments 
         join p in dc.PODs on c.ID equals p.Consignment into pg 
         from pgg in pg.DefaultIfEmpty() 
         select new { ID = c.ID, Name = c.Name, POD = pgg }; 

     // This is just a SAMPLE display just for kicks and grins 
     foreach (var r in results) 
     { 
      Console.WriteLine(r.Name + " " + ((r.POD != null) 
               ? (r.POD.Consignment + " " + r.POD.Description) 
               : "none")); 
     } 

這個查詢輸出是這樣的:

One 1 TextBox 
Two none 
Three 3 Refridgerator 
Three 3 Bucket 
Four none 
Five none 

但是我不能肯定我理解你的話:

「問題是,我得到 重複的主行」

我不知道,如果你說你不希望看到每行每購買一次託運,其中每個結果該IEnumerable與貨物和豆莢序列中的項目,你會想要像一個查詢:

 // select the Consignment ID and Name (i made up), and list of PODs 
     // instead of the individual POD 
     var results = from c in consignments 
         join p in dc.PODs on c.ID equals p.Consignment into pg 
         select new { ID = c.ID, Name = c.Name, PODs = pg }; 

     // This is just a SAMPLE display just for kicks and grins 
     foreach (var r in results) 
     { 
      Console.WriteLine(r.Name + " "); 

      if (r.PODs.Count() > 0) 
      { 
       foreach (var pod in r.PODs) 
       { 
        Console.WriteLine("\t" + pod.Consignment + " " + pod.Description); 
       } 
      } 
      else 
      { 
       Console.WriteLine("\tNone"); 
      } 
     } 

凡選擇是選擇POD列表,而不是個人的比賽,它輸出這樣的:

One 
     1 TextBox 
    Two 
     None 
    Three 
     3 Refridgerator 
     3 Bucket 
    Four 
     None 
    Five 
     None 
1

只是想確認你的第二種情況,是不是沒有兩個,四個,五個沒有物品的輸出,因爲它不是外連接? One 1 TextBox Three 3 Refridgerator 3 Bucket

我試過的是使用等效的WHERE IN爲dc.PODS。 ​​

活動分享,如果你有其他的想法