实体框架Linq是空的,不是空的问题

时间:2012-05-24 17:54:10

标签: c# linq entity-framework optional-parameters isnull

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

我尝试使用其他问题的一些类似的答案,但没有任何帮助。

我试图让linq到EF查询工作如下:

如果任一可选参数具有值,则使用该值,否则使用Is Null。

如果存在两个可选参数,请将这些参数用作查询的一部分,或者仅在提供的eis上使用。但如果没有添加参数,只需使用类别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

不会引发错误,但除非两个参数都存在,否则两个查询总是返回零结果。

我试过的其中一个帖子: How can i query for null values in entity framework?

4 个答案:

答案 0 :(得分:1)

第3次编辑运气,也许我这次正确地阅读了这个问题:)

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);
}

答案 1 :(得分: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'

使用当前查询和建议的其他解决方案,您将只获得Id 1。 您的条件是:如果Param1为空并且c.Param1(存储的值)为空或者c.Param1等于Param1值。

你需要的条件是:如果Param1为空或者c.Param1等于Param1值。

如果您使用此查询,您将始终获得结果。

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

答案 2 :(得分:0)

你应该明确地展开支票,要么都是null,要么匹配

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

编辑:刚刚测试过,无关紧要是你检查null或者SQL是否相同,所以只做

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

答案 3 :(得分:0)

问题在于你写了

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