3

我正在使用 LINQ TO ENTITY,以便根据他们的电话号码过滤人员列表。

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 to entity 将被转换为 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 尝试RemoveSpecialCharactersInPhoneNumber在 SQL 层中解析,而是可以按照您的描述由您的业务层处理。

于 2012-05-17T11:50:27.883 回答