4

我想将 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)”方法,并且该方法无法转换为存储表达式。

什么解决方案

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

4

2 回答 2

4

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

... dr.stringYear.CompareTo(myNumberString) > 0

EF 将其转换为 SQL 谓词,例如

WHERE [alias].[stringYear] > @p

这在 SQL 中是可能的,但在 C# 中是不可能的。

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

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

var len = myNumberString.Lenght;

var query = 
    from row in context.LegacyTable
    where row.NumericString.CompareTo(myNumberString) > 0
       && row.NumericString.Length >= len
    select row; 

然后查询引擎不能使用索引来进行长度比较,但它可能可以这样做来进行>比较。

于 2012-05-09T17:59:53.893 回答
2

这行得通,但是生成的 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; 
于 2012-05-09T17:25:31.083 回答