Der folgende Code:
%Vor%gibt mir den folgenden Fehler:
Der Typ 'System.Linq.IQueryable' kann nicht implizit in 'System.Linq.IOrderedQueryable' konvertiert werden. Es gibt eine explizite Konvertierung (fehlt eine Besetzung?)
Ich habe den Fehler behoben, indem ich am Ende sortiert habe:
%Vor% Aber ich frage mich, warum ist diese Beschränkung vorhanden? Aus welchem Grund wurde die API so entworfen, dass Sie keine where
Einschränkung hinzufügen können, nachdem Sie einen Operator order by
verwendet haben?
Der Rückgabetyp von OrderBy
ist IOrderedQueryable<T>
, also der Typ der orders
Variable (teilweise weil Sie am Ende eine No-Op-Projektion haben) - aber der Rückgabetyp von Where
ist einfach %Code%. Grundsätzlich haben Sie eine Mischung aus einer No-Op-Projektion und eine implizit typisierte lokale Variable und der letzte aktive Teil der Abfrage ist eine Reihenfolge, und < Sie wollen dann die Variable neu zuweisen. Es ist im Grunde eine unglückliche Kombination.
Du könntest es so reparieren:
%Vor%Wenn Sie die No-Op-Projektion explizit mit Hilfe der Punktnotation durchgeführt haben (ich vermute, dass der SQL-Translator schlau genug ist, um damit fertig zu werden!), wäre die Typinferenz in Ordnung:
%Vor% Oder als endgültiger und leicht merkwürdiger Vorschlag könnten Sie einfach die Reihenfolge Ihrer ursprünglichen IQueryable<T>
- und where
-Klauseln ändern. Dies wäre in LINQ to Objects eine schlechte Idee, sollte aber in LINQ to SQL keinen Unterschied machen:
Nun zum "Warum" des API-Designs: orderby
und OrderBy
return OrderByDescending
, damit Sie es mit IOrderedQueryable
und ThenBy
verketten können, die darauf angewiesen sind, dass es ein existierendes gibt befehlen, dass sie sekundär werden können, wenn Sie sehen, was ich meine.
Es ist wichtig zu beachten, dass var stark typisiert ist und zur Kompilierungszeit interpretiert wird. Dein erstes Code-Snippet entspricht im Wesentlichen dem:
%Vor%Wenn Sie den Code auf diese Weise schreiben, wird offensichtlich, warum Sie einer Variablen, die als IOrderedQueryable deklariert ist, kein IQueryable zuweisen können.
Sie können var nicht so denken, wie Sie es ablehnen würden
%Vor%Tags und Links c# linq linq-to-sql