LINQ to Entities无法识别方法'Int32 ToInt32(System.String)'方法

时间:2014-10-10 12:45:09

标签: c# linq

我在网上查了一些答案,我明白我无法将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是我之前应用的另一个查询。知道怎么解决吗?

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

您可以尝试这样的事情:

// 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();

答案 2 :(得分:0)

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

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

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