2011-05-20 47 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

相關問題