【问题标题】:Convert to Int from String from LINQ Query field using C# for comparison (Height From)使用 C# 从 LINQ 查询字段中的字符串转换为 Int 以进行比较(从高度)
【发布时间】:2017-10-21 02:45:39
【问题描述】:

我正在尝试使用 linq 查询,当我尝试以某种方式转换高度值时,我在运行时遇到错误。

错误:

LINQ to Entities 无法识别方法 'Int32 ToInt32(System.String)' 方法,这个方法不能翻译 到商店表达式中。

有没有更好的方法来比较高度值?

case "HeightFrom":
     photosquery = photosquery.Where(x => Convert.ToInt32(x.physical.BodyHeight.TrimEnd()) >= Convert.ToInt32(height));
     break;

【问题讨论】:

  • 有点不相关,但你能保证BodyHeightHeight总是 可以转换成int 吗?您的异常风险非常高,为什么不在您的模型上创建具有正确错误处理int.TryParse()int 属性,然后只比较新的int 属性?
  • 避免对数据库字段(左侧)进行任何类型的操作。这将始终导致不可分割的查询。
  • Linq-to-Entities 似乎不太支持您尝试执行的操作,请参阅此 SO 答案:stackoverflow.com/a/16694769/4276832

标签: c# linq


【解决方案1】:

问题是您使用的 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);

【讨论】:

  • 这是一个很好的建议。让我看看是否可以将表格设计更改为整数而不是字符串。我知道更改少于 1000 条记录的数据将是一项繁琐的任务,但这应该可以永久解决问题。我有用于显示的数值(例如:下拉列表文本提供高度 - 6' 2",但我的值可能为 62,根据用户搜索,我需要比较该值并使用 linq 带来匹配的数据。这就是我我正在努力。
  • 是的,我认为进行该更改您将获得永久解决方案并在查询中获得更好的性能。在创建查询之前尝试验证用户输入并进行强制转换
  • 我将该列转换为 int,幸运的是现有数据按原样接受。现在,我正在从 edmx 中删除该表,并将其与设计更改一起添加回来。我可能需要修改几个 aspx.cs 文件中的代码,这应该可以工作。这比更改代码更容易。非常感谢。
【解决方案2】:
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()

如果是我,并且我有时间,我可能会在开始查询之前将该模型映射到具有正确数据类型的另一个模型。

【讨论】:

  • 正如您正确指出的那样,EF 不知道如何翻译最后一次转换,第一次转换也是如此 :)
  • 问题是physical.BodyHeight 值转换为int,而不是高度值。我收到与以下相同的错误:{“LINQ to Entities 无法识别方法 'Int32 ToInt32(System.String)' 方法,并且此方法无法转换为存储表达式。”}
【解决方案3】:

如果你的数据不是很多你可以使用

case "HeightFrom": photosquery = photosquery.ToList().Where(x => Convert.ToInt32(x.physical.BodyHeight.TrimEnd()) >= Convert.ToInt32(height)); break;

但是对于大数据是不行的,首先加载所有数据然后过滤它

【讨论】:

  • 我想在最后过滤 - 使用 TOList()。
猜你喜欢
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多