【问题标题】:Converting string to int in linq to entities on big database将linq中的字符串转换为int到大数据库上的实体
【发布时间】:2012-05-18 01:37:15
【问题描述】:

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

解决办法

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

【问题讨论】:

  • 为什么要将年份保存为字符串?
  • 一个愚蠢的人做了那个:/我现在不能改变它
  • 您可以先尝试进行转换吗?将结果存储在列表中,然后进行比较
  • 正如我所说的,它是一个大数据库,不能像(.ToList 或 .AsEnumerable)那样执行此操作,而且数据库也在网络上
  • 你会用字典吗?当您说数据库在网络上时,您是指云吗?

标签: c# sql-server sql-server-2008 entity-framework linq-to-entities


【解决方案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; 

【讨论】:

  • 寻找类似的问题,我发现你的解决方案是唯一的解决方案,谢谢:)
【解决方案2】:

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

那么查询引擎不能使用索引来进行长度比较,但它可能可以使用索引来进行&gt; 比较。

【讨论】:

  • ty ,它的工作并解决了我的问题,我知道,'>' 可以在 sql 中使用来与 int 之类的字符串进行比较,但我不知道它如何在 EF 中使用。但是正如你提到它的工作,只要字段数据的长度相同。让我们看看是否有一个 100% 的解决方案,无论如何 ty
  • 几年后你会没事的。上面@ironman99 建议了 100% 的解决方案:更改数据库字段。我会为此提出一个非常有力的理由!
  • 是的,如果我可以更改数据库,但我想没有比您建议的方法更好的方法了,因为 sql 中没有其他方法可以做到这一点。
  • 有人 可以更改我想的数据库。也许很难拉出正确的弦。好吧,有时你不得不接受次优。
猜你喜欢
  • 2011-12-26
  • 2010-11-07
  • 1970-01-01
  • 2015-10-11
  • 2013-08-04
  • 1970-01-01
  • 2012-01-09
相关资源
最近更新 更多