实体框架将字符串与整数

时间:2015-09-17 08:10:27

标签: c# string entity-framework linq

我想比较实体框架中的两个值。其中一个是数据库中的varchar,但内容是整数。 我尝试了一些方法(如在EF6中不支持Entity Framework/Linq EXpression converting from string to int Convert.ToInt32)

.Where(r => Convert.ToInt32(r.foo.xxx)>=yy)

.Where(r => int.Parse(r.foo.xxx)>=yy)

EF不支持这些解析操作,

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

.Where(r => r.foo.xxx>= SqlFunctions.StringConvert(yy))

并且这些操作比较两个字符串值(字符串比较中的7> = 58)

无论如何都要比较EF中的这些值,比如MSSQL中的Cast。

THX。

2 个答案:

答案 0 :(得分:-1)

事实证明EF并不支持数据库级别的此操作...示例解决方法可以:如果需要,可以通过其他属性进行过滤并进行投影< / strong>只包含您需要的列的数据,并使用.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.NumberAsString, x.OtherProperty })只会为您提供您真正需要的属性,因此您不会从内存中的其他实体属性获得比您需要的更多数据。 / p>

答案 1 :(得分:-2)

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

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

关键是这两种方式的.ToList()。它从数据库中获取所有string数据,因此当您在结果上调用int.TryParse时,数据库查询已经运行,因此它使用纯CLR代码,而不是尝试转换{{ 1}}进入SQL查询。我在我的一个Sandbox项目中创建了一个EF上下文并验证了它的工作原理。