Невозможно преобразовать 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'.I»

Я не уверен, что это значит ...

Почему я получаю эту ошибку?

Появился, как только я добавил "Сортировать по" предложение к запросу, до этого он скомпилировался нормально, так что у меня есть догадка о том, что происходит, но я могуя не могу понять, как это сделать.

Ответы на вопрос(2)

т метод расширения Где, поэтому, чтобы использовать его в первую очередь, вы должны преобразовать его, например, в список.

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

posts = posts.ToList().Where(p => p.PostStatus.Id != 90);
 Daniel Magliola13 нояб. 2009 г., 23:21
Хммммм, но нет, что сначала выполнить запрос, которыйпринесет все записи из базы данных, а затем отфильтрует их по статусу в ASP.Net? Я'Я бы предпочел, чтобы БД обрабатывал все WHERE, что, как я думал, произошло бы, если бы я просто добавил предложение .Where, поскольку SQL будет генерироваться и выполняться позже, когда будут перечислены результаты. В вашем случае, неt ToList () заставить его тоже выполняться?
Решение Вопроса

posts конкретно какIQueryable скорее, чемvar (который подниметIOrderedQueryable (это все ещебыть приказал).

В качестве альтернативы, реструктурируйте его так, чтобы мы заказали в конце, что позволит нам (необязательно) внести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>}
</post></post>
 Daniel Magliola13 нояб. 2009 г., 23:24
Оба работали как шарм, спасибо! Что вы имеете в виду, мы заказываем в конце, а не в середине? Isn»t фактический SQL, сгенерированный и выполненный после всего этого после перечисления запроса? Я предполагал, что LINQ будет достаточно умен, чтобыкомбинат» ГДЕ ...
 Daniel Magliola13 нояб. 2009 г., 23:53
А-а-а-а, это последнее объяснение СУПЕР ясно, гоча. Спасибо!!
 Marc Gravell13 нояб. 2009 г., 23:48
Это OrderBy, который меняет подпись ... делая OrderBy последним, что мы применяем, мы имеемIQueryable во всем, что легче сочинять. Как вы говорите, провайдер (EF, LINQ-to-SQL и т. Д.) Объединит все перед тем, как его выполнить.

Ваш ответ на вопрос