2011-05-20 45 views
2

假设您有一个可以为空的varchar列的表。当您尝试过滤表,你可以使用(pFilter是参数):处理LinqToSql中可空字符串列的最佳方法是什么?

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可为空字符串列的最佳方式?

回答

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) 

,如果为空

WHERE [column] IS NULL 
+0

任何想法为什么它不工作?我的意思是一个技术解释。 – 2011-05-20 20:44:25

+0

@Marco我更新了答案。基本上,LINQ to SQL提供程序如何处理'=='。 – Equiso 2011-05-20 21:18:22

+0

太棒了,现在它很有意义:) – 2011-05-20 22:24:44

相关问题