LINQ to Entities不识别方法';Int32到Int32(System.String)';方法
本文关键字:Int32 方法 System String to LINQ Entities 识别 | 更新日期: 2023-09-27 18:26:12
我在网上查看了一些答案,我知道我无法将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
是我之前应用的另一个查询。知道怎么解决吗?
调用AsEnumerable()
将强制它在内存中进行排序:
var list = results.AsEnumerable().OrderBy(b => Math.Abs(Convert.ToInt32(parts[0]) - Convert.ToInt32(b.Zip))).Take(5).ToList();
不过,这可能非常低效,因为Take(5)
将在从数据库中检索数据之后发生,因此您将整个结果集提取到内存中,对其进行排序,然后丢弃除前5条记录之外的所有记录。
你可以试试这样的东西:
// 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();
Linq2SQL和Linq2Entity总是尝试将查询传递给数据库,而大多数数据库都没有与convert类相同的功能。这意味着,要应用convert函数,需要指示linq从数据库中检索数据,这样它就可以运行代码,而不仅仅是将代码传递给数据库。
这是通过在调用转换函数之前调用AsEnumerable()或ToList()来实例化查询来完成的
另一种选择是将其更改为更简单的转换,如(int)或int?因为这些确实有一个直接的数据库映射