Вопрос

У меня есть следующий код 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);
        }

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

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

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

Это было полезно?

Решение

Попробуйте объявить 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>}

Другие советы

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

Вы могли бы сделать это с помощью

posts = posts.ToList().Where(p => p.PostStatus.Id != 90);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top