创建表达式并不难,但是棘手的部分是当您不知道属性的类型(因此选择器表达式结果的类型)时如何将其绑定到相应的
OrderBy(Descending)/
ThenBy(Descendig)方法。
这是封装在自定义扩展方法中的所有内容:
public static partial class QueryableExtensions{ public static IOrderedQueryable<T> OrderByMember<T>(this IQueryable<T> source, string memberPath) { return source.OrderByMemberUsing(memberPath, "OrderBy"); } public static IOrderedQueryable<T> OrderByMemberDescending<T>(this IQueryable<T> source, string memberPath) { return source.OrderByMemberUsing(memberPath, "OrderByDescending"); } public static IOrderedQueryable<T> ThenByMember<T>(this IOrderedQueryable<T> source, string memberPath) { return source.OrderByMemberUsing(memberPath, "ThenBy"); } public static IOrderedQueryable<T> ThenByMemberDescending<T>(this IOrderedQueryable<T> source, string memberPath) { return source.OrderByMemberUsing(memberPath, "ThenByDescending"); } private static IOrderedQueryable<T> OrderByMemberUsing<T>(this IQueryable<T> source, string memberPath, string method) { var parameter = expression.Parameter(typeof(T), "item"); var member = memberPath.Split('.') .Aggregate((expression)parameter, expression.PropertyOrField); var keySelector = expression.Lambda(member, parameter); var methodCall = expression.Call( typeof(Queryable), method, new[] { parameter.Type, member.Type }, source.expression, expression.Quote(keySelector)); return (IOrderedQueryable<T>)source.Provider.CreateQuery(methodCall); }


