linq to sql - 在 LinqToSql 中处理可为空的字符串列的最佳方法是什么?



假设你有一个表,其中包含一个可为空的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

最新更新