我最近在嘗試使用跳過並獲取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 *。我有興趣瞭解爲什麼人們相信編程方面的錯誤;是什麼導致你這種信念? –