2009-09-08 7 views
2

je finis par écrire beaucoup de code qui ressemble àméthode de commande LINQ générique - analyse syntaxique une expression

var ordered = isDescending ? queryable.OrderByDescending(x => x.ID) : queryable.OrderBy(x => x.ID) 

mais avec des expressions telles que x => x.DateOfBirth etc. Ce que je voudrais faire est Placez cela dans une méthode d'extension générique que je pourrais analyser mon expression, et un booléen est descendant vers, mais je ne suis pas sûr de savoir comment faire cela. Quelque chose comme

public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> source, Expression<Func<T, TKey>> func, bool isDescending) { 
    return isDescending ? source.OrderByDescending(func) : source.OrderBy(func); 
} 

Quelqu'un peut-il me dire comment faire cela? De préférence avec une explication pour que je puisse le comprendre.

Répondre

4

Vous êtes presque là - vous manque juste un paramètre de type:

public static IOrderedQueryable<T> OrderBy<T, TKey>(
    this IQueryable<T> source, Expression<Func<T, TKey>> func, bool isDescending) { 
    return isDescending ? source.OrderByDescending(func) : source.OrderBy(func); 
} 

Votre code ne fonctionnait pas avant parce que le type du paramètre func utilisé TKey, et qui n'a pas été l'un des tapez les paramètres dans votre déclaration de méthode. Ce qui précède devrait bien fonctionner.