Ich versuche, einige Code für dynamisch sortieren eine Linq IQueryable<> zu bauen.
Der offensichtliche Weg ist hier, der eine Liste mit einer Zeichenkette für den Feldnamen sortiert
http://dvanderboom.wordpress.com/2008/12/19/dynamically-composing-linq-orderby-clauses/
Ich möchte jedoch eine Änderung - Überprüfung der Feldnamen während der Kompilierung und die Möglichkeit, Refactoring/Find All References zu verwenden, um die spätere Wartung zu unterstützen. Das bedeutet, dass ich die Felder als f=>f.Name und nicht als Strings definieren möchte.
Für meine spezifische Verwendung möchte ich etwas Code kapseln, der entscheiden würde, welche einer Liste von benannten "OrderBy"-Ausdrücken basierend auf Benutzereingaben verwendet werden sollte, ohne jedes Mal anderen Code zu schreiben.
Hier ist das Wesentliche, was ich geschrieben habe:
var list = from m Movies select m; // Get our list
var sorter = list.GetSorter(...); // Pass in some global user settings object
sorter.AddSort("NAME", m=>m.Name);
sorter.AddSort("YEAR", m=>m.Year).ThenBy(m=>m.Year);
list = sorter.GetSortedList();
...
public class Sorter<TSource>
...
public static Sorter<TSource> GetSorter(this IQueryable<TSource> source, ...)
Die Funktion GetSortedList bestimmt, welche der benannten Sortierungen zu verwenden ist. Das Ergebnis ist ein List-Objekt, in dem jedes FieldData die MethodInfo- und Type-Werte der in AddSort übergebenen Felder enthält:
public SorterItem<TSource> AddSort(Func<T, TKey> field)
{
MethodInfo ... = field.Method;
Type ... = TypeOf(TKey);
// Create item, add item to diction, add fields to item's List<>
// The item has the ThenBy method, which just adds another field to the List<>
}
Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, das gesamte Feldobjekt so zu speichern, dass es später zurückgegeben werden kann (es wäre unmöglich, einen Cast durchzuführen, da es sich um einen generischen Typ handelt)
Gibt es eine Möglichkeit, den Beispielcode anzupassen oder einen völlig neuen Code zu entwickeln, um mit stark typisierten Feldnamen zu sortieren? nach sie wurden in einem Container gespeichert und abgerufen (ohne generische Typenzuordnung)