3

我wana将字符串转换为linq中的int实体,但Convert.ToInt32和int.Parse不能转换为sql 而且我的数据库很大并且无法获取所有这些内存(超过60K的记录,并获得更大) 我的查询是一样的东西将字符串转换为linq中的int到大数据库上的实体

int myNumber = 1390; 
var result = from dr in myEntitiy.TableX 
      where (Convert.ToInt32(dr.stringYear) > myNumber) // <== error 
      select dr; 

错误说无法翻译转换方法

LINQ到实体无法识别方法“的Int32 ToInt32(System.String )'方法,并且此方法不能翻译为int o商店表达。

最新解决方案

UPDATE: 如果没有办法做到这一点,请让我知道这个,然后我不得不改变在数据库中的字段类型,但它会很难:(

+1

为什么你把年份保持为一个字符串? – Jon

+2

一个愚蠢的人做到了这一点:/和我不能改变,现在 – mX64

+0

你可以尝试先做转换?将结果存储在一个列表中,然后进行比较 – ironman

回答

3

我认为这是相当安全的做比较,因为字符串,除非你有几年< 1000> 9999:

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

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

+0

ty,它的工作和解决我的问题,我知道,'>'可以在sql中用来比较字符串像int,但我dint知道它如何在EF中使用。但正如你提到它的工作,只是如果字段的数据的长度相同.let的看看是否有100%的解决方案,无论如何ty – mX64

+0

随着多年,你会没事的。上面的@ ironman99建议100%解决方案:更改数据库字段。我会为此做一个非常有力的案例! –

+0

是的,如果我可以改变数据库,但我想没有比你建议的方式更好的方式,因为在sql中没有其他方式来做到这一点。 – mX64

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

寻找一个类似的问题,我发现你的解决方案的唯一的解决方案,谢谢:) – Yalda

相关问题