2012-05-17 35 views
2

爲了根據用戶的電話號碼篩選人員列表,我使用了LINQ TO ENTITY。LINQ TO ENTITY:刪除「where」表達式中的特殊字符

IEnumerable<Person> personsList = (from person in repoPersons.All() 
              where person.PhoneNumber.Contains(PhoneSearch) 
              select person).ToList(); 

repoPersons.All()包含從數據庫中讀取了所有的人。 PhoneSearch是用戶輸入的搜索字詞。

的電話號碼保存在數據庫中的一個特殊格式的字符串:+1 (555) 555-6608(作爲一個例子

但我想允許用戶搜索5555556608不必正確格式化(我。希望他能夠搜索到的電話號碼的一部分,太像556608,仍然可以得到結果

我試圖創建一種稱爲RemoveSpecialCharactersInPhoneNumber,將刪除特殊字符,並返回它,使用它是這樣的:

IEnumerable<Person> personsList = (from person in repoPersons.All() 
              where RemoveSpecialCharactersInPhoneNumber(person.PhoneNumber).Contains(PhoneSearch) 
              select person).ToList(); 

但我得到這個錯誤:

LINQ to Entities does not recognize the method 'System.String RemoveSpecialCharactersInPhoneNumber(System.String)' method, and this method cannot be translated into a person expression. 

那麼,有沒有一種方法,我可以檢查是否******中國包含PhoneSearch沒有特殊字符,使用LINQ to實體?

我知道我可以使用LINQ TO ENTITY來獲取所有列表,然後使用LINQ TO OBJECT來過濾它,但我試圖避免這種方法。

任何解決方案或暗示非常讚賞

回答

2

以下是不完全乾淨整潔,但它會解決你的問題(因爲沒有方法試圖不正確地解決在SQL結束)

IEnumerable<Person> personsList = (from person in repoPersons.All() 
     where person.Phone.Replace("+", "").Replace("(", "").Replace(")", "").Replace("-", "").Replace(" ", "").Contains(PhoneNumber) 
     select person).ToList() 
+0

+1不整齊,但像一個魅力 –

+0

這將是很好,如果有可能做一個擴展方法來解決這個替換重複。那可能嗎? –

0

嘗試做

IEnumerable<Person> personsList = (from person in repoPersons.All().ToList() 
             where RemoveSpecialCharactersInPhoneNumber(person.PhoneNumber).Contains(PhoneSearch) 
             select person).ToList(); 

這將防止LINQ從試圖在SQL層來解決RemoveSpecialCharactersInPhoneNumber,而是可以通過業務層爲您處理描述。

+5

這也將整個數據庫表加載到內存... – cjk

+0

是的,這將加載內存中的所有內容。它會像將它轉換爲LINQ TO OBJECT,這是我想避免的。謝謝 – Youssef

0

它會給出錯誤,因爲linq to實體將被轉換爲SQL查詢,所以在sql中沒有RemoveSpecialCharactersInPhoneNumber的方法。

0

This是類似的問題。

似乎在服務器端評估where子句,此方法無法識別。

需要將CLR方法轉換爲Cannonical mapping,以便它可以在服務器上執行。