Kann nicht IQueryable <> zu IOrderedQueryable Fehler konvertieren
-
20-09-2019 - |
Frage
Ich habe folgenden LINQ-Code:
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);
}
Das letzte Zeile (das extra wo) ist mir die Fehlermeldung geben:
Kann nicht implizit konvertiert Typ 'System.Linq.IQueryable' auf 'System.Linq.IOrderedQueryable'.
Ich bin mir nicht sicher, was das bedeutet ...
Warum erhalte ich diesen Fehler?
Es zeigte sich, sobald ich die „orderby“ -Klausel der Abfrage hinzugefügt, vor, dass es in Ordnung zusammengestellt, so dass ich ein bisschen eine Ahnung davon haben, was los ist, aber ich kann nicht ganz meine Finger hineingesteckt.
Lösung
Versuchen posts
speziell als IQueryable<Post>
erklärt anstatt var
(die die IOrderedQueryable<Post>
abholen (es wird noch werden zu bestellen).
Alternativ umstrukturieren es so dass wir am Ende zu bestellen, so dass wir (optional) bringt in der where
in der Mitte:
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);
(natürlich schauen wir auf finalQuery
)
Der Grund, es ist erroring ist, dass zur Zeit Sie haben (im Wesentlichen):
IOrderedQueryable<Post> posts = {snip};
...
posts = {something (Where) that returns IQueryable<Post>}
Andere Tipps
Das Ergebnis der Lambda expressionis vom Typ IQueryable. Es ist nicht erlaubt, die Erweiterungsmethode Wo, so dass es zu verwenden, müssen Sie zunächst diese konvertieren, zum Beispiel einer Liste.
könnten Sie tun dies mit
posts = posts.ToList().Where(p => p.PostStatus.Id != 90);