2013-08-02 2 views
6

Мой LINQ нечтоOrderByDescending с Пропустить и принять в LINQ показывает ошибку

GetPublishedArticleList().Where(x => x.Category.CatName == catName).OrderByDescending(x=>x.PublishedDate).Skip(skip).Take(last); 

Я получаю следующее исключение, когда приведенный выше код запускается

«Метод„Пропустить“поддерживается только для отсортированного ввода в LINQ to Entities. Метод «OrderBy» должен быть вызван перед методом «Пропустить».

Ну, я хочу, чтобы LINQ понял, что мне нужно сначала упорядочить данные в порядке убывания, а затем применить Skip и Take. (ну, этот код работает, когда OrderByDescending заменяется на O rderBy)

Может ли кто-нибудь предложить мне альтернативу?

+0

Не могли бы вы назвать Take first? Это вернет вам IEnumerable (из IOrderedQueryable), на который вы можете позвонить Skip. Если это будет бесполезно с вашими указателями, вы можете изменить его на «Take (skip + last) .Skip (skip)» – John

+0

Вау - это действительно странно. Это звучит * как ошибка для меня ... –

+3

@John: Нет, вызов 'Take' сначала нарушил бы результаты ... и дело в том, что здесь у меня есть IOrderedQueryable, а не' IOrderedEnumerable' - мы пытаемся уменьшить объем данных, передаваемых из базы данных. –

ответ

1

Это работает с EF5. (.net 4.5) Я не вижу ничего плохого с вашим кодом. Вы уверены, что у вас была последовательность методов сразу при тестировании? Был ли тип источника Iqueryable или Iqueryable?

public virtual IQueryable<TPoco> GetSortedPageList<TSortKey>(Expression<Func<TPoco, bool>> predicate, 
     Expression<Func<TPoco, TSortKey>> sortBy, 
     bool descending, 
     int skipRecords, int takeRecords) { 
     if (!descending) { 
      return Context.Set<TPoco>() 
       .Where<TPoco> predicate) 
       .OrderBy(sortBy) 
       .Skip(skipRecords) 
       .Take(takeRecords); 
     } 
     return 
      Context.Set<TPoco>() 
       .Where<TPoco>(predicate) 
       .OrderByDescending(sortBy) 
       .Skip(skipRecords) 
       .Take(takeRecords); 
    } 
+0

Тип источника - IQueryable. да, последовательность методов верна в моем конце. У меня тоже EF5. это очень странно. –

+0

Это беспокойство. Я просто написал тест, чтобы спуститься. Так оно и было. Но я беспокоился, что где-то есть проблема. Вы случайно не выполнили свой тест, создали ли список с отдельными или группами? Я пытаюсь мечтать, почему это может потерпеть неудачу. Борьба .... –

+0

Я обнаружил, что 2 вопроса с EF-dll неправильно ссылаются, и я применял Where where 2 раз. Теперь обновил EF от Nuget и объединил те предложения 2 Where из 2 разных мест (разные дочерние методы) в один. –

Смежные вопросы