使用C#从LINQ查询字段的字符串转换为Int进行比较(高度从)
我试图使用linq查询,当我试图转换高度值时,不知何故,我在运行时遇到了错误 错误: LINQ to实体无法识别方法“Int32” ToInt32(System.String)“”方法,并且无法转换此方法 转换为存储表达式 是否有更好的方法来比较高度值使用C#从LINQ查询字段的字符串转换为Int进行比较(高度从),c#,linq,C#,Linq,我试图使用linq查询,当我试图转换高度值时,不知何故,我在运行时遇到了错误 错误: LINQ to实体无法识别方法“Int32” ToInt32(System.String)“”方法,并且无法转换此方法 转换为存储表达式 是否有更好的方法来比较高度值 case "HeightFrom": photosquery = photosquery.Where(x => Convert.ToInt32(x.physical.BodyHeight.TrimEnd()) >= Conv
case "HeightFrom":
photosquery = photosquery.Where(x => Convert.ToInt32(x.physical.BodyHeight.TrimEnd()) >= Convert.ToInt32(height));
break;
EF不知道如何翻译最后的转换。如果第一个不起作用,只需尝试int.parse(x.physical.BodyHeight.TrimEnd())
或直接转换(int)x.physical.BodyHeight.TrimEnd()
如果是我,并且我有时间,我可能会在开始查询之前将该模型映射到另一个具有正确数据类型的模型
EF不知道如何翻译最后的转换。如果第一个不起作用,只需尝试int.parse(x.physical.BodyHeight.TrimEnd())
或直接转换(int)x.physical.BodyHeight.TrimEnd()
如果是我,并且我有时间,我可能会在开始查询之前将该模型映射到另一个具有正确数据类型的模型 问题是您正在使用的Linq提供程序(可能来自EF)不支持
Convert.ToInt32
。此问题的快速解决方案是使用AsEnumerable
扩展方法切换到Linq to对象
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);
问题是您使用的Linq提供程序(可能来自EF)不支持
Convert.ToInt32
。此问题的快速解决方案是使用AsEnumerable
扩展方法切换到Linq to对象
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);
如果你的数据不多,你可以使用
case "HeightFrom": photosquery = photosquery.ToList().Where(x => Convert.ToInt32(x.physical.BodyHeight.TrimEnd()) >= Convert.ToInt32(height)); break;
但对于繁重的数据来说,这是不好的,首先加载所有数据,然后过滤它,如果您的数据不是很多,您可以使用它
case "HeightFrom": photosquery = photosquery.ToList().Where(x => Convert.ToInt32(x.physical.BodyHeight.TrimEnd()) >= Convert.ToInt32(height)); break;
但是,对于重数据,首先加载所有数据,然后过滤掉一些不相关的数据,但是您能保证
BodyHeight
和Height
始终可以转换为int
?您运行异常的风险非常高,为什么不在您的模型上创建具有正确错误处理的int.TryParse()
属性,然后只比较新的int
属性?避免在数据库字段(左侧)上进行任何类型的操作。这将始终导致一个不可争论的查询。您尝试执行的操作在Linq to Entities中似乎没有得到很好的支持,请参见下面的答案:有些不相关,但您能否保证车身高度和高度始终可以转换为int
?您运行异常的风险非常高,为什么不在您的模型上创建具有正确错误处理的int.TryParse()
属性,然后只比较新的int
属性?避免在数据库字段(左侧)上进行任何类型的操作。这将始终导致一个不可争论的查询。您尝试执行的操作在Linq to Entities中似乎没有得到很好的支持,请参见下面的答案:正如您正确指出的,EF不知道如何转换最后一次转换,第一次转换也是如此:)问题在于将physical.BodyHeight值转换为int,不是高度值。我得到如下相同的错误:{“LINQ to Entities不识别方法'Int32 ToInt32(System.String)'方法,并且此方法无法转换为存储表达式。”}正如您正确指出的,EF不知道如何转换最后的转换,第一次转换也是如此:)问题在于physical.BodyHeight值转换为int,而不是height值。我得到了如下相同的错误:{“LINQ to Entities无法识别方法'Int32 ToInt32(System.String)'方法,并且此方法无法转换为存储表达式。”}这是一个很好的建议。让我看看是否可以将表设计更改为整数而不是字符串。我知道更改少于1000条记录的数据将是一项乏味的任务,但这将永久解决问题。我有用于显示的数值(例如:下拉列表文本提供高度-6'2",但我的值可能为62,基于用户搜索,我需要比较该值并使用linq带来匹配的数据。这就是我正在尝试做的。是的,我认为这样做会有一个永久性的解决方案,并在查询中获得更好的性能。在创建转换为int的查询之前,请尝试验证用户输入并进行转换该列,幸运的是,现有数据已按原样接受。现在,我正在从edmx中删除该表,并将其与设计更改一起添加回。我可能必须在几个aspx.cs文件中修改代码,这应该可以工作。这比更改代码更容易。这是一个非常好的建议。让我看看是否可以将表设计更改为整数而不是字符串。我知道更改少于1000条记录的数据将是一项乏味的任务,但这将永久解决问题。我有用于显示的numieric值(例如:dropdownlist文本提供高度-6'2",但我的值可能为62,基于用户搜索,我需要比较该值并使用linq带来匹配的数据。这就是我正在尝试做的。是的,我认为这样做会有一个永久性的解决方案,并在查询中获得更好的性能。在创建转换为int的查询之前,请尝试验证用户输入并进行转换该列,幸运的是,现有数据已按原样接受。现在,我将从edmx中删除该表并将其添加回