我最近在尝试使用跳过并获取LINQ语句时遇到错误。跳过()和Take()作为可枚举对象作为可查询
我的发言看起来像这样。
DbConxtext.MyTable.Get(c => c.UserID == id)
.OrderBy(orderProperty).Skip(index).Take(length).ToList();
这给了我这个错误
附近有语法错误 '偏移'。\ r \ n无效的NEXT在FETCH语句
我发现了选项的使用,这是造成因为OFFSET NEXT和FETCH在sql server 2008上不起作用,但我知道我在代码的其他地方使用了分页,并且它们都工作正常。
奏效,这一次是跳过和采取是可枚举的扩展上对didnt的那些工作,可查询的那些的那些之间的区别。
因此,添加AsEnumerable()查询修复了我的问题。这似乎生成SQL使用SELECT TOP(10)而不是OFFSET和FETCH。
编辑:在阅读了一遍之后,我意识到AsEnumerable不会生成不同的SQL。它将执行查询并执行内存中的跳转。
DbConxtext.MyTable.Get(c => c.UserID == id)
.OrderBy(orderProperty).AsEnumerable().Skip(index).Take(length).ToList();
我的问题是什么是使用跳过,并采取的可枚举扩展VS可查询的区别。
为什么EF决定在两种情况之间生成不同的SQL。
'这似乎生成SQL使用SELECT TOP(10)'它不会做这样的事情。您应该查看生成的* actual * SQL以查看两个查询之间的差异。 – Servy
区别在于'Skip'和'Take'将被应用于内存而不是DB中。基本上你会得到所有的结果,然后将其过滤到你想要的结果。 – juharr
为什么你认为使用AsEnumerable时会生成一个select? AsEnumerable表示*在这里停止生成SQL *。我有兴趣了解为什么人们相信编程方面的错误;是什么导致你这种信念? –