【问题标题】:Entity Framework Linq Is Null, Is Not Null Issue实体框架 Linq 为 Null,不是 Null 问题
【发布时间】:2012-05-24 17:54:09
【问题描述】:

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

我尝试使用其他关于 SO 问题的类似答案,但到目前为止没有任何帮助。

我正在尝试让 linq to 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?

【问题讨论】:

  • Param2 不应该是 param2 吗?这可能只是一个发布问题。

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


【解决方案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 为 Null 且 c.Param1(存储的值)为 null 或 c.Param1 等于 Param1 值。

你需要的是一个条件:If Param1 Is Null OR c.Param1 Is Equal to Param1 value。

如果你使用这个查询,你总会得到你的结果。

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

【讨论】:

    【解决方案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);
    }
    

    【讨论】:

    • 好像把所有的东西都退回来了。
    【解决方案3】:

    您应该明确展开检查,要么两者都是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 
    

    【讨论】:

    • 编辑看起来是正确的,但是,如果 db 值为 '' 且 param 为 null 或 db 值为 null 且 param 为 "",则不会返回 true。
    • 这是我最初的尝试,我现在都重试了它们,但我仍然得到零结果。感谢您的帮助。
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-23
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 2020-12-29
      相关资源
      最近更新 更多