LINQ to SQL - Warum können Sie kein WHERE nach ORDER BY verwenden?

8

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?

    
MCS 08.06.2010, 16:40
quelle

2 Antworten

12

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:

%Vor%

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.

    
Jon Skeet 08.06.2010, 16:44
quelle
4

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%

Ссылка

    
Cory Charlton 08.06.2010 16:50
quelle

Tags und Links