Невозможно преобразовать 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);