我在网上查了一些答案,我明白我无法将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
是我之前应用的另一个查询。知道怎么解决吗?
答案 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?因为它们有直接的数据库映射