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.

Foi útil?

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top