假设你有一个表,其中包含一个可为空的varchar列。当您尝试过滤表时,您将使用 (pFilter 是参数):
var filter = pFilter;
var dataContext = new DBDataContext();
var result = dataContext.MyTable.Where(x=>x.MyColumn == filter).ToList();
现在,如果有一个关键字表示"所有空值"怎么办。代码如下所示:
var filter = pFilter != "[Nulls]" ? pFilter : null;
var dataContext = new DBDataContext();
var result = dataContext.MyTable.Where(x=>x.MyColumn == filter).ToList();
但这行不通。显然,值为 null 的字符串是...不为空?
但是,此代码起作用:
var filter = pFilter != "[Nulls]" ? pFilter : null;
var dataContext = new DBDataContext();
var result = dataContext.MyTable.Where(x=>x.MyColumn == filter || (filter == null && x.MyColumn == null)).ToList();
解决方法并没有说服我,这就是为什么我的问题是:在 LinqToSql 中处理可为空的字符串列的最佳方法是什么?
使用String.Equals
,使 LINQ 句柄在生成的 SQL 查询上适当地为 null
var result = dataContext.MyTable
.Where(x => String.Equals(x.MyColumn, filter))
.ToList();
编辑:
如果使用==
则 LINQ 将为一般情况生成查询WHERE [column] = @parameter
但在 SQL NULL 上与 NULL 不匹配,则测试 NULL 的正确方法是 [column] IS NULL
。
有了String.Equals
LINQ 有足够的信息在每种情况下将方法转换为适当的句子,这意味着:
如果您传递非空字符串,它将是
WHERE ([column] IS NOT NULL) AND ([column] = @parameter)
如果为空
WHERE [column] IS NULL