LINQ中的Nullable Int与外连接

时间:2015-12-11 19:40:12

标签: c# linq linq-to-entities

我有以下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

如果我忽略警告,一切都按预期工作。这样可以或者有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

  

这给了我pc.CategoryId == null的编译器警告,说它总是假的,因为CategoryId不可为空。但由于左外连接,它从数据库中变为空。

不,pc可能为null - 但如果pc.CategoryId为空,pc逻辑上只会抛出异常。 (正如评论中所指出的,由于查询被翻译成SQL,它实际上可能不会这样做。但我尝试编写LINQ代码,逻辑正确并且正在发生工作:)

不要忘记DefaultIfEmpty()返回一个序列,该序列是元素的原始序列,或者是一个元素,它是元素类型的默认元素。如果该元素类型是一个类(我希望它在这里),则默认值为null,这就是为什么pc如果没有匹配则为null。

这听起来像你想要的:

Selected = pc != null