35 lines
1.4 KiB
C#
35 lines
1.4 KiB
C#
|
|
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<T> OrderByName<T>(this IQueryable<T> queryable, string propertyName, bool desc = false)
|
|||
|
|
{
|
|||
|
|
return QueryableHelper<T>.OrderBy(queryable, propertyName, desc);
|
|||
|
|
}
|
|||
|
|
static class QueryableHelper<T>
|
|||
|
|
{
|
|||
|
|
private static Dictionary<string, LambdaExpression> cache = new Dictionary<string, LambdaExpression>();
|
|||
|
|
public static IQueryable<T> OrderBy(IQueryable<T> 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;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|