Не удается преобразовать IQueryable<> к ошибке IOrderedQueryable
-
20-09-2019 - |
Вопрос
У меня есть следующий код 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);