Impossibile convertire IQueryable <> per errore IOrderedQueryable
-
20-09-2019 - |
Domanda
Ho il seguente codice 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);
}
L'ultima riga (l'extra dove) mi sta dando l'errore:
Impossibile convertire implicitamente il tipo 'System.Linq.IQueryable' a 'System.Linq.IOrderedQueryable'.
Non sono sicuro di che cosa questo significa ...
Perché mi appare questo errore?
Sembrava una volta ho aggiunto la clausola "orderby" alla query, prima che compilato bene, quindi ho una specie di presentimento di quello che sta succedendo, ma non riesco a mettere il dito in esso.
Soluzione
Prova dichiarando posts
specificamente come IQueryable<Post>
piuttosto che var
(che prenderà il IOrderedQueryable<Post>
(sarà ancora essere ordinato).
In alternativa, ri-struttura così abbiamo ordinare alla fine, ci permette di (opzionalmente) portare nel where
al centro:
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);
(ovviamente, guardiamo finalQuery
)
Il motivo è erroring è che attualmente si dispone (essenzialmente):
IOrderedQueryable<Post> posts = {snip};
...
posts = {something (Where) that returns IQueryable<Post>}
Altri suggerimenti
Il risultato delle expressionis lambda di tipo IQueryable. Essa non permette il metodo di estensione Dove, in modo da usarlo prima è necessario convertire questo, ad esempio, una lista.
Si potrebbe fare questo usando
posts = posts.ToList().Where(p => p.PostStatus.Id != 90);