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

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

你可以尝试这样的事情:

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

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

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

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

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

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

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