我有以下LINQ查询
var categories = (from c in context.Categories
join pc in context.ProductCategories
on new { Id = c.CategoryId, ProductId = 12 }
equals new { Id = pc.CategoryId, ProductId = pc.ProductId }
into productCategories
from pc in productCategories.DefaultIfEmpty()
select new ViewModel
{
CategoryId = c.CategoryId,
Category = c.Name,
Selected = (pc.CategoryId == null) ? false : true
}).ToList();
这给了我pc.CategoryId == null
的编译器警告,说它总是假的,因为CategoryId
是Int类型而不是可空的。但由于左外连接,它来自数据库null
。
如果我忽略警告,一切都按预期工作。这样可以或者有更好的方法吗?
答案 0 :(得分:1)
这给了我pc.CategoryId == null的编译器警告,说它总是假的,因为CategoryId不可为空。但由于左外连接,它从数据库中变为空。
不,pc
可能为null - 但如果pc.CategoryId
为空,pc
逻辑上只会抛出异常。 (正如评论中所指出的,由于查询被翻译成SQL,它实际上可能不会这样做。但我尝试编写LINQ代码,逻辑正确并且正在发生工作:)
不要忘记DefaultIfEmpty()
返回一个序列,该序列是元素的原始序列,或者是一个元素,它是元素类型的默认元素。如果该元素类型是一个类(我希望它在这里),则默认值为null
,这就是为什么pc
如果没有匹配则为null。
这听起来像你想要的:
Selected = pc != null