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.

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top