2010-11-16 38 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

相关问题