Linq表达式查询中的Nullable Int比较

时间:2018-02-13 13:38:12

标签: c# linq

当数据库有有效条目时,我有一个返回0结果的查询。我认为在比较中这是一个可以为空的外键。

我有;

return context.Where<Job>(
       x =>
       x.StatusId != completeStatus.Id &&
       x.StatusId != cancelledStatus.Id).ToList();

其中StatusId是;

[ForeignKey("Status")]
public int? StatusId { get; set; }

我想要包含StatusId为null的所有作业,或者不包含2 Ids(任意整数)的值。

如何更正上述声明以便返回结果?

3 个答案:

答案 0 :(得分:1)

这应该这样做(如果它是LINQ to Entities,因为它以某种类似SQL的方式处理与nullables的比较)

!x.StatusId.HasValue
|| (x.StatusId!= completeStatus.Id
  && x.StatusId != cancelledStatus.Id) 

对于其他LINQ提供程序,您可能需要在值比较中使用x.StatusId.Value

答案 1 :(得分:0)

您可以为StatusId OR

添加null
return context.Where<Job>(
   x =>
   (x.StatusId != completeStatus.Id &&
   x.StatusId != cancelledStatus.Id) ||
   x.StatusId == null).ToList();

答案 2 :(得分:0)

根据你的描述,我认为你想要这样的东西:

return context.Where<Job>(
       x =>
       !x.HasValue ||
       (x.StatusId.Value != completeStatus.Id &&
       x.StatusId.Value != cancelledStatus.Id)).ToList();

重要的是要记住int?不是基本类型,并且不以任何方式继承int / Int32。这只是Nullable<int>的语法糖。它是object,其Value属性可能为null。任何Nullable<T>都是如此。

实现括号以分隔比较以防止不可预测的结果并使代码维护更容易也很重要。在这里,它清楚地表明我们希望 的所有结果没有 x 的值,或者那些值存在且两者都不匹配completeStatus.Id的结果和cancelledStatus.Id