假设您有一个可以为null的varchar列的表。当您尝试过滤表时,您将使用(pFilter是参数):
var filter = pFilter;
var dataContext = new DBDataContext();
var result = dataContext.MyTable.Where(x=>x.MyColumn == filter).ToList();
现在,如果有一个关键字意味着“All Nulls”,该怎么办?代码看起来像:
var filter = pFilter != "[Nulls]" ? pFilter : null;
var dataContext = new DBDataContext();
var result = dataContext.MyTable.Where(x=>x.MyColumn == filter).ToList();
但这不起作用。显然,值为null的String是......不为空?
然而,这段代码的作用是什么:
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中处理可空字符串列的最佳方法是什么?
答案 0 :(得分:3)
使用String.Equals
使LINQ句柄在生成的SQL查询上适当地处于空值
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)
如果它为null
WHERE [column] IS NULL