【问题标题】:LINQ TO ENTITY: Removing special characters inside the "where" expressionLINQ TO ENTITY:删除“where”表达式中的特殊字符
【发布时间】:2012-05-17 11:46:41
【问题描述】:

我使用 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 过滤它,但我试图避免这种方法。

非常感谢任何解决方案或提示

【问题讨论】:

    标签: c# string linq entity-framework


    【解决方案1】:

    以下内容并不完全整洁,但它会解决您的问题(因为没有方法试图在 SQL 端错误地解决)

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

    【讨论】:

    • 如果有可能制作一个扩展方法来解决这个替换重复,那就太好了。这可能吗?
    • @JoseGuilhermeMonteiro 有点晚了,但答案是肯定的。
    • 扩展不工作,我试了一下,通过错误
    【解决方案2】:

    会报错,因为linq to entity会被转换成SQL查询,所以sql中没有RemoveSpecialCharactersInPhoneNumber的方法。

    【讨论】:

      【解决方案3】:

      This 是类似的问题。

      好像where子句是在服务器端评估的,这个方法无法识别。

      CLR方法需要转换成Cannonical mapping才能在服务器上执行。

      【讨论】:

        【解决方案4】:

        试试看

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

        这将阻止 LINQ 尝试在 SQL 层解析 RemoveSpecialCharactersInPhoneNumber,而是可以按照您的描述由您的业务层处理。

        【讨论】:

        • 是的,这会将所有内容加载到内存中。这就像将其转换为 LINQ TO OBJECT 一样,这是我想避免的。谢谢
        猜你喜欢
        • 1970-01-01
        • 2016-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多