【问题标题】:LINQ to Entities does not recognize the method 'Int32 ToInt32(System.String)' methodLINQ to Entities 无法识别方法“Int32 ToInt32(System.String)”方法
【发布时间】:2014-10-10 21:11:11
【问题描述】:

我在网上查了一些答案,我知道我无法将 ToInt32 转换为 T-SQL,我需要先在内存中运行我的查询,然后再进行转换,但我不知道如何申请在我的例子中。我有下面的查询,它显示了标题中写的错误消息:

string[] parts = rvm.ZipCode.Split('-');
var list = results.OrderBy(b => 
  Math.Abs(Convert.ToInt32(parts[0]) - Convert.ToInt32(b.Zip))).Take(5).ToList();

results 是我之前应用的另一个查询。知道如何解决吗?

【问题讨论】:

  • 据我了解,您需要将其转换为局部变量 first 中的 int32,然后将其提供给您的 LINQ 查询。这让我想知道如果您将整个转换部分包装在括号中,编译器会首先处理吗?值得一试。如果没有,只需创建一个 int32 的局部变量,并将其提供给 LINQ。

标签: c# linq


【解决方案1】:

调用AsEnumerable() 将强制它在内存中进行排序:

var list = results.AsEnumerable().OrderBy(b => Math.Abs(Convert.ToInt32(parts[0]) - Convert.ToInt32(b.Zip))).Take(5).ToList();

这可能是非常低效的,因为Take(5) 将在已经从数据库中检索到数据之后发生,因此您将整个结果集提取到内存中,对其进行排序,然后丢弃除前 5 条记录之外的所有记录。

【讨论】:

    【解决方案2】:

    你可以试试这样的:

    // It would be better, if we make the conversion only once instead of 
    // doing this each time we fetch an item from our collection.
    int value = Convert.ToInt32(parts[0]);
    
    var list = results.AsEnumerable()
                      .OrderBy(z => Math.Abs(value - Convert.ToInt32(z.Zip)))
                      .Take(5)
                      .ToList();
    

    【讨论】:

      【解决方案3】:

      Linq2SQL 和 Linq2Entity 总是尝试将查询传递给数据库,并且大多数数据库没有与转换类相同的功能。这意味着要应用转换函数,您需要指示 linq 从数据库中检索数据,以便它可以运行代码,而不仅仅是将其传递给数据库。

      这是通过调用 AsEnumerable() 或 ToList() 在调用转换函数之前实例化查询来完成的

      另一种选择是将其更改为更简单的转换,例如 (int) 或 int?因为这些确实有直接的数据库映射

      【讨论】:

        猜你喜欢
        • 2016-06-09
        • 1970-01-01
        • 1970-01-01
        • 2015-07-25
        • 1970-01-01
        • 2015-09-20
        • 2015-07-20
        • 2020-01-26
        • 1970-01-01
        相关资源
        最近更新 更多