Невозможно преобразовать IQueryable <> в ошибку IOrderedQueryable

У меня есть следующий код LINQ:

    var posts = (from p in db.Posts
         .Include("Site")
         .Include("PostStatus")
        where p.Public == false
        orderby p.PublicationTime 
        select p);

        if (!chkShowIgnored.Checked) {
            posts = posts.Where(p => p.PostStatus.Id != 90);
        }

Эта последняя строка (дополнительная, где) дает мне ошибку:

Невозможно неявно преобразовать тип 'System.Linq.IQueryable' в 'System.Linq.IOrderedQueryable'.

Я не уверен, что это значит...
Почему я получаю эту ошибку?
Он появился после того, как я добавил предложение orderby в запрос, прежде чем он скомпилировал его, поэтому у меня есть догадка о том, что происходит, но я не могу вставить в него свой палец.

Ответ 1

Попробуйте объявить posts специально как IQueryable<Post>, а не var (который подберет IOrderedQueryable<Post> (он будет be упорядочен).

В качестве альтернативы, переструктурируйте его так, чтобы мы заказывали в конце, позволяя нам (необязательно) принести where в середине:

var posts = from p in db.Posts
             .Include("Site")
             .Include("PostStatus")
            where p.Public == false
            select p);

if (!chkShowIgnored.Checked) {
    posts = posts.Where(p => p.PostStatus.Id != 90);
}
var finalQuery = posts.OrderBy(p => p.PublicationTime);

(очевидно, мы смотрим на finalQuery)

Причиной является ошибка в том, что в настоящее время у вас есть (по существу):

IOrderedQueryable<Post> posts = {snip};
...
posts = {something (Where) that returns IQueryable<Post>}

Ответ 2

Результат лямбда-выражения типа IQueryable. Он не позволяет использовать метод расширения. Так, чтобы использовать его сначала, вы должны преобразовать его, например, в список.

Вы можете сделать это, используя

posts = posts.ToList().Where(p => p.PostStatus.Id != 90);