C# LINQ-访问子表上的Int列并处理没有子行的情况
这里是我的linq查询的简化版本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,
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”。如果这能奏效,那就太容易了。谢谢两个答案都可以接受,这个比较整洁。谢谢