我想比较实体框架中的两个值。其中一个是数据库中的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。
答案 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上下文并验证了它的工作原理。