C# 实体框架将字符串与整数进行比较

C# 实体框架将字符串与整数进行比较,c#,string,entity-framework,linq,C#,String,Entity Framework,Linq,我想比较实体框架中的两个值。其中一个是数据库中的varchar,但内容是整数。 我尝试了一些方法(如EF6中不支持的Convert.ToInt32) EF中不支持这些解析操作 .Where(r => String.Compare(r.foo.xxx,yy)>=0 .Where(r => r.foo.xxx>= SqlFunctions.StringConvert(yy)) 这些操作比较两个字符串值(字符串比较中7>=58) 在MSSQL的EF like Cast中是否

我想比较实体框架中的两个值。其中一个是数据库中的varchar,但内容是整数。 我尝试了一些方法(如EF6中不支持的Convert.ToInt32)

EF中不支持这些解析操作

.Where(r => String.Compare(r.foo.xxx,yy)>=0

.Where(r => r.foo.xxx>= SqlFunctions.StringConvert(yy))
这些操作比较两个字符串值(字符串比较中7>=58)

在MSSQL的EF like Cast中是否有比较这些值的方法


Thx.

您可以在扩展名
之前使用扩展名
.ToList()
。Where()
然后尝试像这样将字符串列解析为int

  int temp;
  .ToList().Where(r => (int.TryParse(r.foo.xxx, out temp) ? temp : 0) >= yy); 

这两种方式的关键是
.ToList()
。它从数据库获取所有
字符串
数据,因此当您对结果调用
int.TryParse
时,数据库查询已经运行,因此它使用纯CLR代码,而不是尝试将
int.TryParse
转换为SQL查询。我在我的一个沙盒项目中创建了一个EF上下文,并验证了这一点。

结果表明EF不支持数据库级别的此操作。。。一个示例解决方法可以是:如果需要,按其他属性过滤,并仅使用所需的列对DB数据进行投影,然后使用
.ToList()
方法将其具体化,然后可以使用
int.Parse()
int.TryParse()
将字符串值转换为整数并与另一个数值进行比较。例如:

db.Entities
  .Where(x => x.DbFilterableProperty == sampleValue) // This is optional
  .Select(x => new { x.NumberAsString, x.OtherProperty })
  .ToList()
  .Where(x => int.Parse(x.NumberAsString) >= someNumericValue);

这里最重要的是投影(
new{x.numberastring,x.OtherProperty}
),它只提供您真正需要的属性,因此,内存中的其他实体属性中的数据不会超过您的需要。

您是否有理由将数据库列类型设置为
varchar
,而不是某些数字类型?我们无权更改数据库,其他单位负责该数据库。(一些政治问题:))那么为什么不将模型属性映射到对应于DB列类型的属性呢?修复数据库错误。没有其他现实的解决办法。使用错误的数据类型不仅会使查询变得困难,还会严重影响性能。您将如何编写SQL语句来执行您想要的操作?如果您在字段中使用了
CAST
,则会阻止数据库使用任何索引,强制使用完整的表格扫描重复问题(如标记)中的答案事实上对您没有帮助(我不确定威胁的未接受答案,但该答案也相当困难)。我想和你分享我写的这个答案(我相信这至少比把所有的数据拉到你的电脑上用L2O要好)。要列出的数据太大了。因此,我想筛选要在查询中列出的数据。分区取决于该字段。
.ToList()
将具体化内存中的所有实体,然后处理内存中的集合。对于少量的实体(和少量的属性(DB表列))来说,这不是一个大问题,但在许多情况下,您最终会遇到一个大的性能问题。这是不正确的。你可以在现场强制转换,而OP已经发布了一个(错误的)尝试,这完全是错误的做法。将内存中的所有内容加载到筛选器是一个坏主意,我们如何在数据库级别将字符串转换为整数?PS正如我所说,该解决方案不是完美的,但会将存储在内存中的数据量降低到一定程度……正如重复的问题所示,
Convert.ToInt32
转换为
CAST
。OP可能写了
Convert.ToInt32(foo.Property)>=yy
,损害性能,就像对索引字段执行
CAST
一样
Convert.ToInt32()
对我不起作用。。。我正在使用EntityFramework 6.1.3,它会抛出
System.NotSupportedException
异常,试图在数据库级别执行该方法。您给出的问题的最佳答案是一个链接,它显示了一个在内存中而不是在DB级别进行查询的方法。。。因此,基本上我们在我的答案中以优化结束…谢谢@VladislavKaramfilov,但正如我之前所说的,数据太大,并且在该字段上有一个partton,因此在条件出现之前,TOLIST方法是无用的。
db.Entities
  .Where(x => x.DbFilterableProperty == sampleValue) // This is optional
  .Select(x => new { x.NumberAsString, x.OtherProperty })
  .ToList()
  .Where(x => int.Parse(x.NumberAsString) >= someNumericValue);