在Linq To Sql中处理可空字符串列的最佳方法是什么?

时间:2011-05-20 18:08:54

标签: string linq-to-sql nullable

假设您有一个可以为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中处理可空字符串列的最佳方法是什么?

1 个答案:

答案 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