ASP.NET MVC搜索页面 – 整数StartsWith On Linq + EF4

因此,在我上一篇文章中,我问如何使用LINQ和EF4构建动态搜索filter( 请参阅此处 ),最后提出了将表达式构建为字符串并使用Dynamic LINQ库将其解析为表达式的解决方案。

我解决了这个问题。 我能够生成一个Expression<Func>并将其传递给DbSetWhere()方法。 我也尝试使用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

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