Asp.net mvc 在MVC中,如何从数据库中检索与一系列包含数字的字符串序列号匹配的记录?
我有一个使用代码优先实体框架的MVC应用程序 我的数据库中有字符串序列号的记录,以及字母和数字的组合最后4个始终是数字部分 我正在尝试检索范围A和B之间的所有记录,例如从SERIAL-NO-0020到SERIAL-NO-0050 我无法将字符串数字部分转换为整数,因为Linq to Entities不支持它。因此,作为获取序列号大于20的所有记录的示例,这不起作用:Asp.net mvc 在MVC中,如何从数据库中检索与一系列包含数字的字符串序列号匹配的记录?,asp.net-mvc,entity-framework,lambda,Asp.net Mvc,Entity Framework,Lambda,我有一个使用代码优先实体框架的MVC应用程序 我的数据库中有字符串序列号的记录,以及字母和数字的组合最后4个始终是数字部分 我正在尝试检索范围A和B之间的所有记录,例如从SERIAL-NO-0020到SERIAL-NO-0050 我无法将字符串数字部分转换为整数,因为Linq to Entities不支持它。因此,作为获取序列号大于20的所有记录的示例,这不起作用: var records = context.SerialNumbers.Where(m => Convert.ToDecim
var records = context.SerialNumbers.Where(m => Convert.ToDecimal(m.SerialNo.Substring(10, 4)) > 20).ToList();
有没有一种方法可以做到这一点,而无需首先从数据库中提取所有记录并进行进一步筛选?您可以在Linq的帮助下编写SP并访问此SP(存储过程),而无需编写查询。
在SP中,您可以先拆分记录,然后进行比较。它还将花费更少的时间并提高性能。Convert.ToDecimal与Linq to Entities一起使用时无法转换为SQL 您可以创建一个查询数据的存储过程,以便执行EF无法执行的任何操作 另一种解决方案是创建计算列 首先添加一个新属性。让它在
SerialNumber
实体中命名为SerialId
第二个,用数据注释装饰该属性:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
如果需要,也可以使用fluent配置:
modelBuilder.Entity<SerialNumber>().Property(t => t.SerialId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
修改说明,SerialNumber
表的每一行都有一个生成的列,它的值是通过使用这个SQL语句=>CAST(子字符串(SerialNo,11,4)作为INT)来计算的。
您可以通过运行ef命令=>更新数据库来更新数据库
最后,您可以将Linq更改为以下实体,无需任何转换:
var records = context.SerialNumbers.Where(m => m.SerialId > 20).ToList();
您有权更改数据库吗?如果需要,可以。您需要像我在下面的回答中那样创建computedd列。
var records = context.SerialNumbers.Where(m => m.SerialId > 20).ToList();