实体框架的LINQ为空,不为空问题(Entity Framework Linq Is Null, I

2019-10-30 15:38发布

我有一个接收类别ID的方法,后面两个可选的字符串参数默认为null。

我试着用在SO但没有SOFAR帮助其他的问题了几个类似的答案。

我试图让LINQ到EF查询的工作方式如下:

如果任何一个可选参数有一个值,使用值,否则使用的是空的。

如果两个可选参数是本发明的使用这些作为查询的一部分,或者任何一个如果只在EIS提供。 但是,如果没有添加parmeters,只需使用类别ID。

在DB既可选参数被标记为空。

这里是不工作的代码:

          from c in dtx.Categories
          where c.CategoryId == CatId
         && (string.IsNullOrEmpty(param1) ? c.Param1 == null : c.Param1 == param1)
         && (string.IsNullOrEmpty(param2) ? c.Param2 == null : c.Param2 == Param2)
        select c

尝试二:

          from c in dtx.Categories
          where c.CategoryId == CatId
          && (c.Param1 == null ? c.Param1 == null : c.Param1 == param1)
          && (c.Param2 == null ? c.Param2 == null : c.Param2 == param2)
          select c

不会引发任何错误,但两者的查询总是返回零分的结果,除非这两个参数的存在。

一个我试过的帖子: 我如何可以查询在实体框架空值?

Answer 1:

从我所知道的,看起来像查询条件的问题不正确写入。 让检查什么会用一个例子追加:

数据:

Id = 1, Param1 = null, Param2 = null
Id = 2, Param1 = 'a'   param2 = null
Id = 3, Param1 = null, Param2 = 'b'
Id = 4, Param1 = 'a'   param2 = 'c'

在当前的查询,并提出了其他解决办法,你只会得到编号1.您的条件都在说:如果参数1 IS NULL和c.Param1(储值)为null或c.Param1等于参数1的值。

你需要的是,上面写着一个条件:如果参数1为空或c.Param1等于参数1的值。

如果您使用此查询,你总是会得到你的结果。

from c in dtx.Categories
where c.CategoryId == CatId
    && (string.IsNullOrEmpty(param1) || c.Param1 == param1)
    && (string.IsNullOrEmpty(param2) || c.Param2 == param2)
select c


Answer 2:

第三编辑运气,也许是我正确的这个时候读的问题:)

var p1 = string.IsNullOrEmpty(param1) ? null : param1;
var p2 = string.IsNullOrEmpty(param2) ? null : param2;

var query = dtx.Categories.Where(c => c.CategoryId == CatId);
if (p1 != null || p2 != null) {
    query = query.Where(c => c.Param1 == p1 && c.Param2 == p2);
}


Answer 3:

你应该明确地展开检查,要么都是null或它们匹配

((string.IsNullOrEmpty(param1) && c.Param1 == null) || (c.Param1 == param1))

编辑:刚刚测试并不要紧为U检查null或不SQL是一样的,所以只是做

from c in dtx.Categories 
    where c.CategoryId == CatId 
       && (c.Param1 == param1) 
       && (c.Param2 == Param2) 
select c 


Answer 4:

问题是,当你写

from ... where c.Param1 == null ...

的LINQ翻译为相同的SQL表达式:

SELECT ... FROM ... WHERE Param1 = null ...

但你需要这样的:

SELECT ... FROM ... WHERE Param1 IS NULL ...

所以在这里正确的解决方案是

from c in dtx.Categories
where c.CategoryId == CatId && 
     (param1 == null ? !c.Param1.HasValue : c.Param1.Value == param1) && 
     (param2 == null ? !c.Param2.HasValue : c.Param2.Value == param2)
select c


文章来源: Entity Framework Linq Is Null, Is Not Null Issue