ASP.NET MVC搜索页面 – 整数StartsWith On Linq + EF4
因此,在我上一篇文章中,我问如何使用LINQ和EF4构建动态搜索filter( 请参阅此处 ),最后提出了将表达式构建为字符串并使用Dynamic LINQ库将其解析为表达式的解决方案。
我解决了这个问题。 我能够生成一个Expression<Func>
并将其传递给DbSet
的Where()
方法。 我也尝试使用MySql作为EF4背后的数据库。
当我尝试将字符串操作应用于整数时出现问题,例如搜索连续数字以1234开头的数据库记录。
我的初始表达式类似于: record.ConsecutiveNumber.ToString().StartsWith("1234")
。 遗憾的是,正如预期的那样,事情并不那么容易,因为EF4无法查询DbSet
,但有exception:
“LINQ to Entities无法识别方法’System.String ToString()’方法,并且此方法无法转换为商店表达式。”
经过一些谷歌搜索,我发现这是一个常见的问题。 但是C’MON! 有没有办法执行搜索function,可以搜索具有以“1234”开头的连续数字的记录?
专业人士如何使用EF4实现搜索function? 这是一个属性filter。 如果我想添加多个filter怎么办? 上帝,我的头痛…:/
谢谢!
编辑:
想法#1:存储过程怎么样? 从Linq调用MySql存储过程怎么样? 我瞄准的方式太高了吗?
您是否看过Dynamic LinQ Library: http ://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
对于您的问题如何在动态linq查询中使用“包含”或“喜欢”?
以前我已经获得了这个lib的代码,只是看看里面,它很容易遵循。
您可以使用SqlFunctions.StringConvert方法。 它需要一个double
(或decimal
),所以你必须转换你的int ConsecutiveNumber
。
更换:
record.ConsecutiveNumber.ToString().StartsWith("1234")
附:
SqlFunctions.StringConvert((double)record.ConsecutiveNumber).StartsWith("1234")
这将是我开始工作的思考过程。 希望它指出你正确的方向。
根据其他post,SqlFunctions.StringConvert((double)record.ConsecutiveNumber)适用于Sql Server。
将Linq中的int转换为实体的字符串的问题
以下是有关linq转换的相关信息。
Linq int to string
这是一个暗示为stringconvert编写自己的sql函数的答案
在entity framework中使用SQL函数选择
如果SqlFunctions.StringConvert对你不起作用,我建议你想看看如何在Sql中完成它,然后编写你自己的[EdmFunction()]
基于[EdmFunction()]
属性的方法 。
我不知道这是否可以在Linq到EF上工作,但假设他们映射了Math操作,这可能会解决您的需求:
record.ConsecutiveNumber / Math.Pow(10, Math.Truncate(Math.Log10(record.ConsecutiveNumber) - 3)) == 1234
这基本上是将数字除以10的幂,大到足以留下前4位数。
我知道即使它有效,这也是非常hacky和低效的,但是你去了。 🙂
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
在这种情况下,您可以使用数学函数。 (我认为当时代码不能在产品项目中使用)