i wana将字符串在linq中转换为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 ToInt32(System.String)'方法,并且该方法无法转换为商店表达式。
解决方案
更新:如果没有办法做到这一点,请确保我确定,然后我必须更改数据库中的字段类型,但这将很困难:(
我认为以字符串形式进行比较非常安全,除非您的年份<1000或> 9999:
... dr.stringYear.CompareTo(myNumberString) > 0
EF将其转换为类似SQL的谓词
WHERE [alias].[stringYear] > @p
在SQL中是可能的,但在C#中是不可能的。
一个优点是,stringYear
上的任何索引都可以在执行计划中使用。将stringYear
转换为数字会消除任何索引。
当字符串列包含锯齿状的字符串值时,此方法仍然有用。在这种情况下,谓词应与长度组合。例如,要查找所有数字字符串(大于整数)大于某个参考值的所有实体
var len = myNumberString.Lenght;
var query =
from row in context.LegacyTable
where row.NumericString.CompareTo(myNumberString) > 0
&& row.NumericString.Length >= len
select row;
然后,查询引擎无法将索引用于长度比较,但是它可能能够用于>
比较。
这可行,但是生成的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;
我正在寻找类似的东西,以下对我有用
int myNumber = 1390;
var result = from dr in myEntitiy.TableX
let x = new List<string> { dr.stringYear }.Cast<int>().FirstOrDefault()
where (x > myNumber)
select dr;