Sto provando a creare codice per l'ordinamento dinamico di Linq IQueryable <>.Ordinamento Linq dinamico fortemente tipizzato
Il modo più ovvio è qui, che ordina un elenco utilizzando una stringa per il nome del campo
http://dvanderboom.wordpress.com/2008/12/19/dynamically-composing-linq-orderby-clauses/
Tuttavia voglio un cambio - tempo di compilazione il controllo dei nomi di campo, e la possibilità di utilizzare il refactoring/Trova Tutto Riferimenti per supportare la manutenzione successiva. Ciò significa che voglio definire i campi come f => f.Name, anziché come stringhe.
Per il mio uso specifico, desidero incapsulare un codice che decida quale di un elenco di espressioni denominate "OrderBy" debba essere utilizzato in base all'input dell'utente, senza scrivere codice diverso ogni volta.
Ecco l'essenza di quello che ho scritto:
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, ...)
La funzione GetSortedList determina quale dei tipi di nome da usare, che si traduce in un oggetto List, in cui ogni FieldData contiene i valori di tipo MethodInfo e dei campi passati in AddSort:
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<>
}
non sono sicuro se c'è un modo per memorizzare l'intero oggetto campo in modo tale da permettere che essere restituito dopo (sarebbe impossibile per lanciare, dal momento che è un tipo generico)
Esiste un modo per adattare il codice di esempio o creare codice completamente nuovo, per ordinare i nomi di campo fortemente tipizzati dopo sono stati memorizzati in alcuni contenitori e recuperati (perdendo qualsiasi tipo generico di trasmissione)
vedi post: (. Può aiutare altri che cerca ordine "magico" da) http://stackoverflow.com/questions/41244/dynamic-linq-orderby – Nordes