2009-06-16 18 views
0

Dies ist eine sehr kurze Frage und ich fürchte, die Antwort ist auch kurz.LINQ CompiledQuery.Compile und dynamische Sortierung?

Gibt es eine Möglichkeit der entlang der Linien von

Func<DataContext, string, bool, IEnumerable<X> fnMyQuery = CompiledQuery.Compile<DataContext, string, bool IList<X>(
    (db, sortColumn, sortDesc) => (
      (!sortDesc)? 
       db.OrderBy(x => DynamicResolve(sortColumn)) 
      : 
       db.OrderByDescending(x => DynamicReolve(sortColumn)) 
    )); 

Said in einer anderen Art und Weise etwas zu tun, würde Ich mag eine kompilierte Abfrage erstellen, die Art in einer Spalte und einer Sortierreihenfolge und dann nehmen kann meine Ergebnisse auf die gewünschte Weise - ich kann herausfinden, wie dies zu tun, ohne die Abfrage kompiliert werden - aber ist es möglich, mit einer kompilierten Abfrage mit LINQ to SQL?

Antwort

0

Der Zweck von CompiledQuery.Compile besteht darin, eine vollständig übersetzte und sofort einsatzbereite Methode zu erstellen, die die Abfrage auswertet.

Komplett übersetzt.

Natürlich hindert Sie nichts daran, die Sortierung außerhalb der Datenbank zu machen (die Quelle könnte eine kompilierte Abfrage sein).

public IList<T> SortedResults<T>(IEnumerable<T> source, 
    string sortColumn, bool sortDesc) 
{ 
    List<T> results = source.ToList(); 
    if (!sortDesc) 
    { 
    results = Enumerable 
     .OrderBy(results, x => DynamicResolve(sortColumn)) 
     .ToList(); 
    } 
    else 
    { 
    results = Enumerable 
     .OrderByDescending(results, x => DynamicResolve(sortColumn)) 
     .ToList(); 
    } 
    return results; 

} 
+0

Ich weiß das, und offensichtlich gibt es kein Problem in, sagen wir 10 Artikel sortieren, aber beim Versuch, Seite, wird dies und Problem, wenn Sie tonnenweise Datensätze sortiert nach einer Spalte - auf der Client-Seite sortieren dann wird zu einem Problem, da das Schneiden auch dort gemacht wird. Aber danke für die Idee, aber ich vermute, der Weg, um wirklich Ihre Antwort zu lesen ist ein einfaches "Nein, das ist nicht möglich". – kastermester

+0

Wenn Sie paging, sollten Sie nicht nach dem Sortieren ToList ... Sie sollten Skip and Take. –

+0

Das Problem, über das ich spreche, ist eine Sammlung von, sagen wir 1.000.000 Artikel. Und Sie tun var list = myCollection.OrderBy (s => s.Title) .Skip (5000) .Take (10) .ToList(); Mit dem Ansatz, den Sie vorschlagen, würde ich die gesamte Sammlung der Datenbank herausnehmen müssen, dann sortieren und jetzt überspringen und nehmen (dh, das wird langsam!). Die Idee für mich, eine kompilierte Abfrage zu verwenden, ist schneller - nicht langsamer. – kastermester

1

Die einzige Möglichkeit, die ich von der Lösung dieses Problems weiß, besteht darin, zwei Abfragen zu kompilieren. Eins für jede Sortierreihenfolge und dann das Umbrechen mit einem Helfer, der die korrekte kompilierte Abfrage delegiert.