Estoy intentando construir algún código para ordenar dinámicamente un IQueryable de Linq <>.Clasificación dinámica Linq fuertemente tipada
La forma más obvia es que aquí, que ordena una lista usando una cadena para el nombre del campo
http://dvanderboom.wordpress.com/2008/12/19/dynamically-composing-linq-orderby-clauses/
Sin embargo, quiero un cambio - tiempo de compilación comprobación de nombres de campo, y la capacidad de utilizar la refactorización/Encontrar Todos Referencias para apoyar el mantenimiento posterior. Eso significa que quiero definir los campos como f => f.Name, en lugar de como cadenas.
Para mi uso específico, deseo encapsular un código que decida cuál de una lista de expresiones nombradas "OrderBy" debería usarse en función de la entrada del usuario, sin escribir código diferente cada vez.
Aquí es la esencia de lo que he escrito:
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 función GetSortedList determina cuál de los tipos mencionados de usar, lo que se traduce en un objeto de lista, donde cada fielddata contiene los valores Tipo y MethodInfo de los campos pasados en 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<>
}
no estoy seguro de si hay una manera de almacenar la totalidad del objeto de campo de una manera que le permita ser devuelto después (que sería imposible fundido, ya que es un tipo genérico)
¿Hay alguna manera de adaptar el código de muestra o crear un código completamente nuevo para ordenar usando los nombres de campos fuertemente tipados después de que se han almacenado en algún contenedor y recuperado (perdiendo cualquier tipo genérico de conversión)
ver post: (. Puede ayudar a otra que busca la orden "mágica" por) http://stackoverflow.com/questions/41244/dynamic-linq-orderby – Nordes