Невозможно преобразовать IQueryable <> в ошибку IOrderedQueryable - PullRequest
12 голосов
/ 14 ноября 2009

У меня есть следующий код 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», до того, как он скомпилировался нормально, так что я немного догадываюсь о происходящем, но не могу понять, что именно.

Ответы [ 2 ]

21 голосов
/ 14 ноября 2009

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

В качестве альтернативы, реструктурируйте его так, чтобы мы заказали в конце, что позволит нам (опционально) ввести 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>}
0 голосов
/ 14 ноября 2009

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

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

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