2014-11-29 2 views
0

Я хочу создать пагинацию мой LINQ запрос дает ошибку:Linq Предельные записи дают ошибку для подкачки?

var query = from c in db.Projects.Take(2).Skip(2) orderby c.ProjectId descending select c; 

дает следующее сообщение об ошибке:

$exception {"The method 'Skip' is only supported for sorted input in LINQ to Entities. The method 'OrderBy' must be called before the method 'Skip'."} System.Exception {System.NotSupportedException} 
+2

метода _The «OrderBy» должно быть вызвано ** ** перед тем метод «Skip'_ должен быть очевиден –

+1

Не каждый может читать. Многие, которые отказываются читать, все еще пытаются программировать. – TomTom

ответ

4

Try:

var query = (from c in db.Projects orderby c.ProjectId descending select c).AsEnumerable().Skip(2).Take(2) 

или более эффективным (Кредит Jon тарелочкам)

var query = (from c in db.Projects orderby c.ProjectId descending select c).Skip(2).Take(2) 
+0

Использование 'AsEnumerable 'означает, что пейджинг не будет выполняться в базе данных, поэтому, если OP действительно * запрашивает записи от 1,000,000 до 1,000,009, он будет получать первые миллионы записей, только чтобы их выбросить. –

+0

@JonSkeet согласился. Тем не менее, есть ли способ выполнить фактический запрос linq-to-sql без этих накладных расходов? –

+0

Да - просто удалите вызов 'AsEnumerable'. –

4

Ошибка описывает именно то, что требуется - ваша последовательность должна быть заказана, прежде чем пропустить/принять во внимание любой смысл. Вы уже знаете, какой заказ вы хотите - вам просто нужно сделать это раньше в логическом конвейере, чем пейджинг. Кроме того, нет смысла использовать выражение запроса здесь. Я предлагаю вам использовать:

var query = db.Projects 
       .OrderByDescending(c => c.ProjectId) 
       .Skip(2) 
       .Take(2); 

(. Это может быть все в одной строке, если вы действительно хотите, чтобы это было, но я считаю, что проще понять трубопровод, если он выкладывается вертикально)

Обратите внимание, что Я также перевернутый порядок Skip и Take - вы почти никогда не хотят Take перед тем Skip ... в примере кода, вы показали Take(2).Skip(2), который никогда не дал результатов ... результат Take(2) части является последовательность с не более чем двумя результатами, а затем Skip(2) пропускает первые два о тех результатах ... ничего не оставляя. Как правило, у вас есть что-то вроде:

.Skip((pageNumber - 1) * pageSize) 
.Take(pageSize) 
Смежные вопросы