【问题标题】:ASP.NET MVC Search Page - Integer StartsWith On Linq + EF4ASP.NET MVC 搜索页面 - Linq + EF4 上的整数 StartsWith
【发布时间】:2011-03-27 03:03:50
【问题描述】:

所以,在我的上一篇文章中,我询问如何使用 LINQ 和 EF4 (See Here) 构建动态搜索过滤器,最后想出了将表达式构建为字符串并使用动态 LINQ 库。

我解决了这个问题。我能够生成一个Expression<Func<TSource, out bool>> 并将其传递给DbSetWhere() 方法。我也在尝试使用 MySql 作为 EF4 背后的数据库来做到这一点。

当我尝试对整数应用字符串操作时,问题就出现了,例如搜索连续数字以 1234 开头的数据库记录。

我最初的表达是:record.ConsecutiveNumber.ToString().StartsWith("1234")。遗憾的是,正如预期的那样,事情并不那么容易,因为 EF4 无法查询 DbSet 异常:

"LINQ to Entities 无法识别 方法'System.String ToString()' 方法,而这种方法不能 翻译成商店表达式。”

经过一些谷歌搜索后,我发现这是一个常见问题。但是来吧!有没有办法执行搜索功能,可以搜索以“1234”开头的连续数字的记录?

专业人士如何使用 EF4 实现搜索功能?这是一个单一的属性过滤器。如果我想添加多个过滤器怎么办?天哪,我的头好痛……:/

谢谢!

编辑:

想法#1:存储过程呢?从 Linq 调用 MySql 存储过程怎么样?我的目标是不是太高了?

【问题讨论】:

    标签: c# mysql linq entity-framework linq-to-entities


    【解决方案1】:

    您可以使用SqlFunctions.StringConvert 方法。它需要double(或decimal),所以你必须转换你的int ConsecutiveNumber

    替换:

    record.ConsecutiveNumber.ToString().StartsWith("1234")
    

    与:

    SqlFunctions.StringConvert((double)record.ConsecutiveNumber).StartsWith("1234")
    

    【讨论】:

    • 这是否与 EF4 + MySql 设置(代码优先)兼容?
    • 好问题,我不能轻易测试。但是鉴于以下帖子,我认为这不太可能。 :(forums.mysql.com/read.php?47,396177,396177
    • 嗯,太糟糕了。我希望这是可能的.. :/
    • 你应该在问题中提到 MySQL。
    【解决方案2】:

    您是否查看过动态 LinQ 库: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

    对于你的问题 How to use "contains" or "like" in a dynamic linq query?

    之前我已经得到了这个库的代码,只是看了一下里面,很容易理解。

    【讨论】:

    • 我试过那个库。最后,它生成一个 Linq lambda 表达式,当传递给 where 方法时,应用程序崩溃并出现异常,指出 Linq2Entities 不支持 ToString。我可以对字符串数据进行包含或类似的评估,但我想要评估是否有任何记录的连续数字以某个数字开头。连续数字不是字符串,是整数,所以我的第一种方法是先将其转换为字符串,然后使用包含。但不支持 ToString。
    【解决方案3】:

    这将是我让它发挥作用的思考过程。希望它能为您指明正确的方向。

    根据其他帖子 SqlFunctions.StringConvert((double)record.ConsecutiveNumber) 适用于 Sql Server。

    Problem with converting int to string in Linq to entities

    这里是关于 linq 转换的相关信息。

    Linq int to string

    这是一个答案,提示您为 stringconvert 编写自己的 sql 函数

    Using a SQL Function in Entity Framework Select

    如果 SqlFunctions.StringConvert 对您不起作用,我建议您研究一下如何在 Sql 中执行此操作,然后编写您自己的 [EdmFunction()] attribute based method

    【讨论】:

      【解决方案4】:

      我不知道这是否适用于 Linq 到 EF,但假设他们映射了数学运算,这可能会解决您的需求:

      record.ConsecutiveNumber / Math.Pow(10, Math.Truncate(Math.Log10(record.ConsecutiveNumber) - 3)) == 1234
      

      这基本上是将数字除以 10 的幂,刚好足以留下前 4 位数字。

      我知道即使它有效,这也是非常老套和低效的,但是你去吧。 :)

      【讨论】:

        【解决方案5】:
        Any method calls in a LINQ to Entities query that are not explicitly mapped to a canonical function will result in a runtime NotSupportedException exception being thrown. 
        

        在此处检查映射规范函数: http://msdn.microsoft.com/en-us/library/bb738681.aspx

        在这种情况下,您可以使用数学函数。 (当时我认为代码先不能用在产品项目中)

        【讨论】:

          猜你喜欢
          • 2011-07-23
          • 2011-03-28
          • 1970-01-01
          • 2010-09-24
          • 1970-01-01
          • 1970-01-01
          • 2011-08-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多