No se puede convertir IQueryable <> a un error IOrderedQueryable
-
20-09-2019 - |
Pregunta
Tengo el siguiente código de 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);
}
Esa última línea (el extra donde) me está dando el error:
No se puede convertir implícitamente el tipo 'System.Linq.IQueryable' a 'System.Linq.IOrderedQueryable'.
No estoy seguro de lo que esto significa ...
¿Por qué recibo este error?
Se presentó una vez he añadido la cláusula "orderby" a la consulta, antes de que compila bien, así que tengo una especie de presentimiento de lo que está pasando, pero no puedo poner mi dedo en él.
Solución
Trate declarar posts
específicamente como IQueryable<Post>
en lugar de var
(que recoger el IOrderedQueryable<Post>
(seguirá siendo ser ordenada).
Alternativamente, re-estructura que así que la orden en el extremo, lo que nos permite (opcionalmente) traer en el where
en el medio:
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, nos fijamos en finalQuery
)
La razón de que se erroring es que actualmente tiene (esencialmente):
IOrderedQueryable<Post> posts = {snip};
...
posts = {something (Where) that returns IQueryable<Post>}
Otros consejos
El resultado de las expressionis lambda de tipo IQueryable. No se permite el método de extensión Cuando, por lo que usarlo primero hay que convertir esto en, por ejemplo, una lista.
Usted puede hacer esto utilizando
posts = posts.ToList().Where(p => p.PostStatus.Id != 90);