2011-08-14 25 views
3

將var更改爲IEnumerable時,我的搜索結果變得區分大小寫;考慮下面的代碼:將var更改爲IEnumerable的不同搜索結果

下面的代碼返回與RA或RA兩種情況:

var result = from x in dataBase.tableName 
      select x; 
result = result.Where(x => x.id.Contains("ra")); 

以下返回代碼只例RA,而不是RA:

IEnumerable result = from x in dataBase.tableName 
        select x; 
result = result.Where(x => x.id.Contains("ra")); 
莫非

別人的幫助和解釋我發生了什麼事?不應該結果是相似的嗎?

回答

9

不同的是,在第一種情況下,var將是一個IQueryable<T> - 這意味着您的呼叫Where將是Queryable.Where(您的lambda表達式轉換爲表達式樹之後)。過濾器最終在數據庫中執行,我懷疑你的字段是不區分大小寫的(因此搜索不區分大小寫)。

在第二種情況下,您得到了IEnumerable<T>,因此您的Where調用將轉換爲Enumerable.Where(將您的lambda表達式轉換爲委託之後)。過濾器最終以.NET代碼執行 - Contains始終區分大小寫。基本上,LINQ是一個漏洞抽象 - 是的,如果同一個過濾器在所有情況下都給出相同的結果,那將是可愛的,但這是不現實的。瞭解泄漏的位置,並據此採取行動 - LINQ仍然是一個巨大的福音:)

7

您的result變量不是IEnumerable - 它是IQueryable

結果被改變,當你手動更改類型IEnumerable,因爲你現在要做以下Contains查詢使用LINQ到對象,而不是使用LINQ數據庫實體(或LINQ到SQL)上。

使用IEnumerable您的查詢使用您的lambda表達式,將數據庫中的每個結果帶入內存並執行區分大小寫的Contains()擴展方法。

隨着IQueryable您的查詢使用表達式目錄樹,並會嘗試創建您的Contains查詢對應的數據庫查詢這恰好是不區分大小寫(最有可能是SQL LIKE查詢)。

只要將隱式類型明確爲IQueryable即可解決您的問題。