2009-12-05 50 views
5

我正在閱讀關於Linq to Sql字符串比較的矛盾解釋。Linq到Sql不區分大小寫等於

當我做到以下幾點:

from p in db.People 
    where p.UserName=username 
    select p 

用戶名= 「約翰」

我得到正確的區分大小寫的結果。 Linq是默認執行此操作還是發生在SQL數據庫中?

+0

您是否缺少一些引號?更改變量名稱的大小寫不會影響結果。 – 2009-12-05 23:01:24

+0

那不是我的意思見上 – zsharp 2009-12-05 23:07:31

回答

4

我想你根據你的數據庫變量指向哪裏比較實際執行結果相互矛盾。如果可以的話,linq將構建查詢並將其發送到SQL服務器。好像你可能會迫使不區分大小寫致電

where p.UserName.ToLower()=username.ToLower() 
+1

對不起,但這是不好的建議。 p.UserName.ToLower()= username.ToLower()將轉換爲SQL查詢,該查詢將強制進行全表掃描。如果「people」表很小,那麼這並不重要,但如果它是一個大表,那麼它將無法使用可能覆蓋「用戶名」列的任何索引。 – KristoferA 2009-12-09 09:42:06

1

這取決於數據庫。 SQL Server 2008將字符串視爲不區分大小寫,包括在索引表達式中使用時。 Linq不這樣做。

閱讀on MSDN,或this article

+2

大小寫敏感/不敏感取決於你在你的數據庫和/或所涉及的列(SQL Server安裝時默認設置,但它可以在幾個地方被覆蓋,下使用何種整理列級別)。 – KristoferA 2009-12-09 09:43:25

3

您的示例查詢將轉化爲東西大致是這樣的:

選擇[T0] .col1,[T 0] .col2,..., t0] .coln from [schema]。[People] where [t0] .UserName = @ p0

... username變量中的值將傳遞給@ p0 sql變量。因此,區分大小寫,區分重音等由您設置要使用的SQL Server實例/ db/table /列的排序規則控制。如果沒有在其他地方指定,則使用DB或數據庫實例的默認排序規則,但可以一直指定列級別的排序規則。

大多數人跑與不區分大小寫(CI)排序規則SQL Server,但正如我上面所說的,它可以在數據庫被覆蓋,所以你只需要檢查哪些整理你那裏。

這與您在L2O(linq to objects)查詢中做同樣的事情形成了鮮明對比,在這種情況下,case-sensitivity是默認值,您必須使用string.equals重寫使其不區分大小寫允許您指定文化和/或不區分大小寫...

+0

不會使用string.equals覆蓋與您的結果有相同的問題嗎?強制所有記錄來到linq端做比較? – 2009-12-09 17:37:13

+0

@Jeff,string.equals參考只是L2S和L2O行爲之間的比較,如果我不清楚這一點,對不起。但是,是的,如果您將這兩者結合起來,並將客戶端的評估作爲L2O查詢,那麼它不僅可以獲取所有記錄,還可以通過線路發送它們。換句話說,在這裏使用正確的排序規則是關鍵。 您的答覆中的示例仍將在數據庫中進行評估,但由於左側的where子句謂詞中的函數調用包裝函數而導致額外的表掃描開銷。 – KristoferA 2009-12-09 23:59:10

+0

感謝您的回覆(當我發表早期評論時,我給了+1) – 2009-12-10 15:56:50