Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在MVC中,如何从数据库中检索与一系列包含数字的字符串序列号匹配的记录?_Asp.net Mvc_Entity Framework_Lambda - Fatal编程技术网

Asp.net mvc 在MVC中,如何从数据库中检索与一系列包含数字的字符串序列号匹配的记录?

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

我有一个使用代码优先实体框架的MVC应用程序

我的数据库中有字符串序列号的记录,以及字母和数字的组合最后4个始终是数字部分

我正在尝试检索范围A和B之间的所有记录,例如从SERIAL-NO-0020SERIAL-NO-0050

我无法将字符串数字部分转换为整数,因为Linq to Entities不支持它。因此,作为获取序列号大于20的所有记录的示例,这不起作用:

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();