【问题标题】:Entity Framework ISNULL in Where condition实体框架 ISNULL 在 Where 条件下
【发布时间】:2021-04-13 00:59:36
【问题描述】:

我在 SQL Server 中有一个查询:

SELECT * FROM MyTable t
WHERE ISNULL(t.Status,'') = ''

我如何在实体框架中做到这一点?

编辑: 哦,对不起,我的代码就像

WHERE ISNULL(t.Status,'') = ''

【问题讨论】:

  • 你只需要WHERE t.Status = 'CO'ISNULL 不会影响语义并使其不可分割。
  • @MartinSmith 是的,我明白这一点,但我错误地将问题提交为 WHERE ISNULL(t.Status,'') = 'CO',实际上它是 WHERE ISNULL(t.Status,'') = ''
  • 这仍然无可厚非。你应该只使用WHERE t.Status = '' OR t.Status IS NULL
  • 我没有使用 SQL 语句。我只是在这里举个例子。我需要实体框架声明。我得到了它。总之谢谢。
  • 当然这在WHERE 子句中没有用,但在ORDER BY 中非常方便,其中NULL 应该被视为大于其他任何东西。由于谷歌搜索“EF SQL isnull()”(以及可能的变体)的一般问题给出了最高结果,我将投入我的 +1 以平衡规模。

标签: c# .net entity-framework isnull


【解决方案1】:

试试类似的东西

MyTable.Where( t => (t.Status ?? "") == "CO" )

【讨论】:

  • 这个 WHERE t.Status = 'CO' 应该没问题。为什么需要检查?? (空)?
  • 虽然没有必要这样做,但这是 OP 要求的。我认为它不会生成ISNULL,而是生成COALESCE(...),但这没关系。
  • 这绝对不是更好的做法。它可以将有效的查找转换为全表扫描。不幸的是,Code analysis rule SR0007 确实(或至少确实)推荐了它,这可能就是 OP 拥有它的原因。
  • 这不是最好的快速结果,这是真的。但是,在意想不到的地方进行零传播可能意味着结果失败。真正的解决方法是不在可搜索列上使用 NULL。
  • 真正的解决办法是了解您正在使用的技术。三值逻辑不难掌握。
【解决方案2】:

虽然问题没问题,但逻辑不成立。 因为如果一个值等于CO,它永远不可能等于NULL''。 在这种情况下,您可以像这样轻松地调用它:

SQL:

SELECT * FROM MyTable t
WHERE t.Status = 'CO'

林克:

var items = (from t in db.MyTable
             where t.Status == "CO"
             select t);

但是,如果您需要它在 NULL 时具有默认值并与该值进行比较,那将更有意义(参见示例):

SQL:

SELECT * FROM MyTable t
WHERE ISNULL(t.Status, 'CO') = 'CO'

林克:

var items = (from t in db.MyTable
             where (t.Status ?? "CO") == "CO"
             select t);

这将为您提供 t.Status 为 NULL 或等于 CO 的所有项目。 当然,这只是一个例子。

注意:生成的sql可能会略有不同,但结果是一样的。 它可能看起来像这样:

SELECT * FROM MyTable t
WHERE COALESCE(t.Status, 'CO') = 'CO'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 2020-11-09
    • 2011-12-31
    相关资源
    最近更新 更多