【问题标题】:LINQ generating wrong SQL for empty stringLINQ 为空字符串生成错误的 SQL
【发布时间】:2020-03-14 17:14:21
【问题描述】:

我有以下代码:

var approver = _context.approver.Where(x => x.ApproverName != "").Select(x => x.ApproverUserId).Distinct();

而生成的SQL是

SELECT DISTINCT "x"."approveruserid"
FROM "approver" "x"
WHERE (("x"."approvername" <> '') OR "x"."approvername" IS NULL )

我希望 SQL 应该是

SELECT DISTINCT "x"."approveruserid"
FROM "approver" "x"
WHERE (("x"."approvername" <> '') OR "x"."approvername" IS NOT NULL )

因此,生成的 SQL 缺少 NOT 子句,这会导致返回错误的结果。顺便说一句,我正在使用 Oracle 数据库。在 Oracle 中,null 等于空字符串。 如何解决?

[更新]:我正在使用

var approver = _context.approver.Where(x => x.ApproverName.Length > 0).Select(x => x.ApproverUserId).Distinct();

作为一种解决方法。但我对另一个可以正确生成 SQL 以进行空字符串检查的建议持开放态度。

【问题讨论】:

  • 预期查询中的 IS NOT NULL 条件没有区别, 条件只能为非空值。
  • @jarlh 如果NOT 子句不存在,我会得到错误的结果。
  • 顺便说一下,我正在使用 Oracle。
  • 您的预期结果是什么?我的意思是,approvername 为空的行会发生什么?
  • 我希望它返回批准人名称不是空字符串或 null 的记录。

标签: sql oracle entity-framework linq


【解决方案1】:

生成的 SQL 是正确的。您要求字符串不是“”和null != ""。

Linq to SQL 不支持String.IsNullOrEmpty(),但您的解决方法可以正常工作。

或者你可以使用这样的东西:

_context.approver.Where(x => (x.ApproverName ?? "" ) != "")

【讨论】:

  • 在 Oracle 中,null = ""。
  • 对于其他人 null != "" 是未知的,不是真的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-30
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
相关资源
最近更新 更多