Não pode ser convertido iQueryable <> para errar um erro
-
20-09-2019 - |
Pergunta
Eu tenho o seguinte código 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);
}
Essa última linha (o extra onde) está me dando o erro:
Não é possível converter implicitamente o tipo 'System.Linq.iqueyabilable' em 'System.linq.iorderedQuerable'.
Não tenho certeza do que isso significa ...
Por que estou recebendo esse erro?
Apareceu depois que eu adicionei a cláusula "Orderby" à consulta, antes que ela compilasse bem, então eu tenho uma espécie de palpite do que está acontecendo, mas não consigo colocar meu dedo nele.
Solução
Tente declarar posts
especificamente como IQueryable<Post>
ao invés de var
(que pegará o IOrderedQueryable<Post>
(ainda vai ser ordenado).
Como alternativa, reestruturá-lo para que pedimos no final, permitindo-nos (opcionalmente) trazer o where
no meio:
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);
(obviamente, olhamos para finalQuery
)
A razão pela qual é errar é que atualmente você tem (essencialmente):
IOrderedQueryable<Post> posts = {snip};
...
posts = {something (Where) that returns IQueryable<Post>}
Outras dicas
O resultado da expressão lambda do tipo iQueryable. Ele não permite o método de extensão em que, para usá -lo primeiro, você deve convertê -lo, por exemplo, uma lista.
Você poderia fazer isso usando
posts = posts.ToList().Where(p => p.PostStatus.Id != 90);