using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; namespace APT.Infrastructure.Core.Extensions { public static class QueryableExtensions { public static IQueryable OrderByName(this IQueryable queryable, string propertyName, bool desc = false) { return QueryableHelper.OrderBy(queryable, propertyName, desc); } static class QueryableHelper { private static Dictionary cache = new Dictionary(); public static IQueryable OrderBy(IQueryable queryable, string propertyName, bool desc) { dynamic keySelector = GetLambdaExpression(propertyName); return desc ? Queryable.OrderByDescending(queryable, keySelector) : Queryable.OrderBy(queryable, keySelector); } private static LambdaExpression GetLambdaExpression(string propertyName) { if (cache.ContainsKey(propertyName)) return cache[propertyName]; var param = Expression.Parameter(typeof(T)); var body = Expression.Property(param, propertyName); var keySelector = Expression.Lambda(body, param); cache[propertyName] = keySelector; return keySelector; } } } }