C# 将linq中的字符串转换为int到大型数据库中的实体

C# 将linq中的字符串转换为int到大型数据库中的实体,c#,sql-server,sql-server-2008,entity-framework,linq-to-entities,C#,Sql Server,Sql Server 2008,Entity Framework,Linq To Entities,i wana在linq to entities中将字符串转换为int,但convert.ToInt32和int.Parse无法转换为sql 而且我的数据库很大,不能把所有的数据都存储在超过60k的记录中,并且变得更大 我的问题类似于 int myNumber = 1390; var result = from dr in myEntitiy.TableX where (Convert.ToInt32(dr.stringYear) > myNumber) // &l

i wana在linq to entities中将字符串转换为int,但convert.ToInt32和int.Parse无法转换为sql 而且我的数据库很大,不能把所有的数据都存储在超过60k的记录中,并且变得更大 我的问题类似于

int myNumber = 1390;
var result = from dr in myEntitiy.TableX
             where (Convert.ToInt32(dr.stringYear) > myNumber) // <== error
             select dr; 
错误表示无法转换转换方法

LINQ to Entities无法识别方法“Int32 ToInt32System.String”,并且无法将此方法转换为存储表达式

什么是解决方案

更新:
如果没有办法做到这一点,请确保这一点,然后我必须更改数据库中的字段类型,但这将很难:

这是可行的,但生成的SQL将很混乱

int myNumber = 1390;
var result = from dr in myEntitiy.TableX
             let num = myEntitiy.TableX.Take(1).Select(x => dr.stringYear).Cast<int>().FirstOrDefault()
             where num > myNumber
             select dr; 

我认为以字符串形式进行比较是非常安全的,除非您的年份<1000或>9999:

... dr.stringYear.CompareTomyNumberString>0 EF将其转换为SQL谓词,如

其中[alias].[stringYear]>@p 这在SQL中是可能的,但在C中是不可能的

一个优点是,stringYear上的任何索引都可以在执行计划中使用。将stringYear转换为数字可以消除任何索引

当字符串列包含锯齿形字符串值时,此方法仍然有用。在这种情况下,谓词应该与长度组合。例如,查找任何作为整数的数字字符串大于某个参考值的所有实体

var len=myNumberString.长度; 变量查询= 来自context.LegacyTable中的行 其中row.NumericString.CompareTomyNumberString>0 &&row.NumericString.Length>=len 选择行;
然后,查询引擎无法使用索引进行长度比较,但它可能可以使用索引进行>比较。

为什么要将年份保留为字符串?一个愚蠢的年份这样做了:/i我现在无法更改这一点。您可以尝试先进行转换吗?将结果存储在列表中,然后进行比较。我说这是一个大数据库,不能这样做。ToList或。一个可计算的数据库也在网络监视器上。你使用字典吗?当你说数据库在网络上时,你是指云吗?它的工作和解决我的问题,我知道,“>”可以用在sql中与int之类的字符串进行比较,但我不知道它如何在EF中使用。但正如你们提到的,只要字段的数据长度相同,它的工作就可以了。让我们看看是否有一个100%的解决方案,不管怎样,用几年的时间你们就可以了。上面@ironman99建议了100%的解决方案:更改数据库字段。我会提出一个非常有力的理由!是的,如果我可以更改数据库,但我想没有比您建议的方法更好的方法了,因为sql中没有其他方法可以做到这一点。我想有人可以更改数据库。也许很难做出正确的决定。好吧,有时候你不得不用次优解决。寻找类似的问题,我发现你的解决方案是唯一的解决方案,谢谢: