2012-10-03 25 views
0

如何將null作爲值傳遞給從linq到sql的字符串(varchar)列?我試圖查詢一些列的行有NULL(比如Col_A),其他人有「NotNull」(字符串)作爲值。在varchar列上使用NULL查詢

string s = null; 

var query = (from r in context.Table1 
      where r.Col_A == s 
      select r).ToList(); 

這將返回0行。但是如果我將s設置爲「NotNull」,我會按預期返回行。

任何指針都會有幫助。

+3

你從'null'得到了什麼問題? –

+2

您需要顯示您嘗試過的代碼無效。只要允許在列中存在空值,您就可以傳遞null –

+0

我試圖將變量設置爲null,但查詢返回0行。但在DB中有匹配的行 – ABC

回答

0

你試過了DBNull.Value嗎?這是.net的DB相當於null。

+1

許多ORM隱藏了這個醜陋的實現泄漏細節。如果有的話,LINQ-to-SQL很少公開這一點。 –

4

有一個惱人的錯誤,在下面就可以在某些情況下的工作方式不同:

where x.Foo == null 

VS

where x.Foo == s 

其中s恰好是null在執行。基本上,在某些使用情況,它可以正確最終使用:

WHERE [x].[Foo] = @p3 

@p3一個null值,但顯然這是不符合ANSI SQL明智的。

如果你正在做一個測試,參數值可能是null,特殊情況下,它和代碼與在C#中的文字null查詢我建議。我確實有一些代碼可以使用表達式訪問者在事後應用,但是對於特殊情況null更容易。所以:

var query = // some core query 

if(s == null) { query = query.Where(x => x.Foo == null); } 
else { query = query.Where(x => x.Foo == s); } 
+0

謝謝Marc,是唯一的方法嗎? – ABC

+0

在你的例子中,你可以壓縮到'where r.Col_A == s || (r.Col_A == null && s == null)' - 輸出SQL語句看起來有點奇怪,但它至少會避免「null類型錯誤」問題 – OffHeGoes

+0

@Sam很少有事情是「唯一的方式「; p –