我正在尝试使用linq查询,当我尝试转换高度值时,我在运行时遇到错误。
错误:
LINQ to Entities无法识别方法'Int32 ToInt32(System.String)'方法,这个方法无法翻译 进入商店表达。
有没有更好的方法来比较身高值?
case "HeightFrom":
photosquery = photosquery.Where(x => Convert.ToInt32(x.physical.BodyHeight.TrimEnd()) >= Convert.ToInt32(height));
break;
答案 0 :(得分:0)
case "HeightFrom":
var h = Convert.ToInt32(height);
photosquery = photosquery.Where(x => Convert.ToInt32(x.physical.BodyHeight.TrimEnd()) >= h);
break;
EF不知道如何翻译最后一次转换。如果第一个不起作用,只需尝试int.parse(x.physical.BodyHeight.TrimEnd())
或直接投射(int)x.physical.BodyHeight.TrimEnd()
如果是我,而且我有时间,我可能会在开始查询之前将该模型映射到具有正确数据类型的另一个模型。
答案 1 :(得分:0)
问题是您正在使用的Linq提供商(可能来自EF)不支持Convert.ToInt32
。这个问题的快速解决方案是使用AsEnumerable
扩展方法切换到Linq to Objects
photosquery = photosquery.AsEnumerale()
.Where(x => Convert.ToInt32(x.physical.BodyHeight.TrimEnd()) >= Convert.ToInt32(height));
现在如果BodyHeight
是一个字符串并且你要保存一个整数,我强烈建议你改变那个列的类型。您的查询可以完全在服务器端执行:
int value=Convert.ToInt32(height);
photosquery = photosquery.Where(x => x.physical.BodyHeight >= value);
答案 2 :(得分:0)
如果你的数据不是很多,你可以使用
case "HeightFrom": photosquery = photosquery.ToList().Where(x => Convert.ToInt32(x.physical.BodyHeight.TrimEnd()) >= Convert.ToInt32(height)); break;
但是对于大量数据不好并且首先加载所有数据然后过滤它