Question

J'ai le code LINQ suivant:

    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);
        }

Cette dernière ligne (supplémentaire où) me donne l'erreur:

Impossible de convertir implicitement le type 'System.Linq.IQueryable' à 'System.Linq.IOrderedQueryable'.

Je ne sais pas ce que cela signifie ...
Pourquoi suis-je recevoir cette erreur?
Il est apparu une fois que j'ajouté la clause « orderby » à la requête, avant que compilé fin, donc je sorte de pressentiment de ce qui se passe, mais je ne peux pas tout à fait mettre mon doigt dedans.

Était-ce utile?

La solution

Essayez de déclarer posts spécifiquement comme IQueryable<Post> plutôt que var (qui décrochez le IOrderedQueryable<Post> (il sera toujours est ordonnée).

Vous pouvez également re structure afin que nous commander à la fin, ce qui nous permet de (le cas échéant) mettre en where au milieu:

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);

(évidemment, nous regardons finalQuery)

La raison pour laquelle il est erroring est que vous avez actuellement (essentiellement):

IOrderedQueryable<Post> posts = {snip};
...
posts = {something (Where) that returns IQueryable<Post>}

Autres conseils

Le résultat des lambda expressionis de type IQueryable. Il ne permet à la méthode d'extension Lorsque, de façon à l'utiliser d'abord vous devez convertir en, par exemple, une liste.

Vous pouvez le faire en utilisant

posts = posts.ToList().Where(p => p.PostStatus.Id != 90);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top