【问题标题】:Querying using NULL on varchar column在 varchar 列上使用 NULL 进行查询
【发布时间】:2012-09-24 19:23:46
【问题描述】:

如何将 null 作为值传递给从 linq 到 sql 的字符串 (varchar) 列?我正在尝试查询表,其中某些行的列(例如 Col_A)具有 NULL,而其他行具有“NotNull”(字符串)作为值。

string s = null;

var query = (from r in context.Table1
            where r.Col_A == s
            select r).ToList();

这将返回 0 行。但如果我将 s 设置为“NotNull”,我会按预期返回行。

任何指针都会有所帮助。

【问题讨论】:

  • 你从null 得到了什么问题?
  • 您需要显示您尝试过但不起作用的代码。只要有问题的列中允许使用空值,您就可以传递空值
  • 我尝试将变量设置为 null 但查询返回 0 行。但是数据库中有匹配的行
  • @SamAnderson 代码说话,陈述无力
  • 如果我传入一个有效字符串(非空),我会按预期返回行。

标签: c# sql sql-server linq linq-to-sql


【解决方案1】:

有一个烦人的错误,在某些情况下,以下可能会有所不同:

where x.Foo == null

where x.Foo == s

s 在执行时恰好是 null。基本上,在某些用例中,它可能会错误地使用:

WHERE [x].[Foo] = @p3

使用 @p3null 值,但显然这在符合 ANSI 的 SQL 中是不明智的。

我建议如果您正在做一个参数值可能是 null 的测试,请将其特殊情况并使用 literal null 对查询进行编码在 C# 中。我确实有一些代码可以使用表达式访问者在事后应用这个,但是对于特殊情况 null 来说更容易。所以:

var query = // some core query

if(s == null) { query = query.Where(x => x.Foo == null); }
else { query = query.Where(x => x.Foo == s); }

【讨论】:

  • 谢谢 Marc,这是唯一的方法吗?
  • 在您的示例中,您可以压缩为where r.Col_A == s || (r.Col_A == null && s == null) - 输出的 SQL 语句看起来有点奇怪,但它至少可以避免“null type of wrong”问题
  • @Sam 很少有事情是“唯一的方法”;p
【解决方案2】:

您尝试过 DBNull.Value 吗?那是 .net 的 DB 等价于 null。

【讨论】:

  • 很多 ORM 隐藏了这个丑陋的实现泄漏细节。 LINQ-to-SQL 很少公开这一点,如果有的话。
猜你喜欢
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
  • 2020-01-13
  • 2017-08-21
  • 1970-01-01
相关资源
最近更新 更多