2010-11-16 41 views
1

這是我的linq查詢的減少版本;LINQ - 訪問子表上的Int列並處理沒有子行時的情況

var list = from inv in db.Inventories 
         where inv.InventoryCode.StartsWith("005") 
         select 
         new 
         { 
          inv.InventoryCode, 
          inv.InventoryMedias.Where(im => im.MediaType == 0).FirstOrDefault().Synopsis, 
          inv.InventoryMedias.Where(im => im.MediaType == 0).FirstOrDefault().InventoryID 
         }; 

...因爲庫存記錄不必有任何InventoryMedia行,我已經添加了.FirstOrDefault(),然後返回一個空和LINQ是足夠聰明,不拋出ONSTIOO錯誤,但我確實得到這個錯誤。

演員陣容價值型「的Int32」失敗 因爲物化值爲 空。無論是結果型的通用 參數或查詢必須使用 可空類型

現在我明白了,我可以只改變匿名類型的類定義此整數可空類型,但我不希望去做。我也嘗試過使用if null命令「?? 0」,但不支持像int這樣的引用類型。我知道我可以使用.DefaultIfEmpty()併爲匿名類型設置一個默認值,但我如何設置整數的默認值或是否有另一種選擇?

回答

1

儘量突出到所需性質第一然後使用FirstOrDefault()。這樣你就不必處理空引用異常的可能性,並且該類型將適用於該屬性。如果有必要,可以拋出。

var list = from inv in db.Inventories 
      where inv.InventoryCode.StartsWith("005") 
      select 
      new 
      { 
       inv.InventoryCode, 
       Synopsis = inv.InventoryMedias 
          .Where(im => im.MediaType == 0) 
          .Select(im => im.Synopsis) 
          .FirstOrDefault(), 
       InventoryID = inv.InventoryMedias 
           .Where(im => im.MediaType == 0) 
           .Select(im => im.InventoryID) 
           .FirstOrDefault(), 
      }; 
+0

這兩個答案都可以接受,這一個是有點整潔。謝謝。 – tkerwood 2010-11-16 08:33:52

1

鑄造到可空INT

int? value; 
+0

哦,然後使用「?? 0」。如果這樣做會很容易。謝謝 – tkerwood 2010-11-16 04:50:26

相關問題