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

问题描述 投票:4回答:3

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)'方法,并且该方法无法转换为商店表达式。

解决方案

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

c# sql-server sql-server-2008 entity-framework linq-to-entities
3个回答
4
投票

我认为以字符串形式进行比较非常安全,除非您的年份<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; 

然后,查询引擎无法将索引用于长度比较,但是它可能能够用于>比较。


1
投票

这可行,但是生成的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; 

0
投票

我正在寻找类似的东西,以下对我有用

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; 
© www.soinside.com 2019 - 2024. All rights reserved.