3

私は、電話番号に基づいて人のリストをフィルタリングするためにLINQTOENTITYを使用しています。

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.

では、LINQ TO ENTITYを使用して、PhoneNumberに特殊文字なしのPhoneSearchが含まれているかどうかを確認する方法はありますか?

LINQ TO ENTITYを使用してすべてのリストを取得し、次にLINQ TO OBJECTを使用してそれをフィルター処理できることはわかっていますが、このアプローチを回避しようとしています。

任意の解決策やヒントは大歓迎です

4

4 に答える 4

2

以下は正確に整然としたものではありませんが、問題を解決します (SQL 側で誤って解決しようとするメソッドがないため)。

IEnumerable<Person> personsList = (from person in repoPersons.All()
         where person.Phone.Replace("+", "").Replace("(", "").Replace(")", "").Replace("-", "").Replace(" ", "").Contains(PhoneNumber)
         select person).ToList()
于 2012-05-17T13:03:41.590 に答える
1

エンティティへのlinqがSQLクエリに変換されるため、エラーが発生します。そのため、SQLにはRemoveSpecialCharactersInPhoneNumberのメソッドがありません。

于 2012-05-17T11:50:54.587 に答える
0

これは同様の質問です。

where 句はサーバー側で評価されるようですが、このメソッドは認識できません。

サーバー上で実行できるように、 CLR メソッドをCannonical マッピングに変換する必要があります。

于 2012-05-17T11:51:55.443 に答える
-1

やってみる

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

これにより、LINQがSQLレイヤーで解決しようとするのを防ぎRemoveSpecialCharactersInPhoneNumber、代わりに、説明したようにビジネスレイヤーで処理できます。

于 2012-05-17T11:50:27.883 に答える