C# LINQ-访问子表上的Int列并处理没有子行的情况

C# LINQ-访问子表上的Int列并处理没有子行的情况,c#,linq-to-sql,C#,Linq To Sql,这里是我的linq查询的简化版本 var list = from inv in db.Inventories where inv.InventoryCode.StartsWith("005") select new { inv.InventoryCode,

这里是我的linq查询的简化版本

 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(),它随后返回null,并且linq足够聪明,不会抛出ONSTIOO错误,但我确实得到了这个错误

转换为值类型“Int32”失败 因为物化的价值是 无效的结果类型的泛型 参数或查询必须使用 可空类型


现在我明白了,我可以将匿名类型更改为类,并将这个整数定义为可为null的类型,但我不想这样做。我也尝试过使用if null命令“?”0”,但这在int等引用类型上不受支持。我知道我可以使用.DefaultIfEmpty()并为匿名类型设置默认值,但如何为整数设置默认值,或者是否有其他替代方法?

强制转换为可为null的int

int? value;

首先尝试投影到所需的属性,然后使用
FirstOrDefault()
。这样,您就不必处理null引用异常的可能性,并且该类型将是适合该属性的任何类型。如有必要,将强制转换为null

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”。如果这能奏效,那就太容易了。谢谢两个答案都可以接受,这个比较整洁。谢谢