using System; using System.Linq; using System.Linq.Expressions; using System.Reflection; using SqlSugar; namespace JSMachine.WMS.Infrastructure.LambdaHelp { public static class OrderExpression { public static ISugarQueryable OrderByLambda(this ISugarQueryable source, string property, OrderByType orderByType) { return ApplyOrder(source, property, orderByType.ToString()); } static ISugarQueryable ApplyOrder(ISugarQueryable source, string property, string methodName) { string[] props = property.Split('.'); Type type = typeof(T); ParameterExpression arg = Expression.Parameter(type, "x"); Expression expr = arg; foreach (string prop in props) { // use reflection (not ComponentModel) to mirror LINQ PropertyInfo pi = type.GetProperty(prop); expr = Expression.Property(expr, pi); type = pi.PropertyType; } Type delegateType = typeof(Func<,>).MakeGenericType(typeof(T), type); LambdaExpression lambda = Expression.Lambda(delegateType, expr, arg); object result = typeof(Queryable).GetMethods().Single( method => method.Name == methodName && method.IsGenericMethodDefinition && method.GetGenericArguments().Length == 2 && method.GetParameters().Length == 2) .MakeGenericMethod(typeof(T), type) .Invoke(null, new object[] { source, lambda }); return (ISugarQueryable)result; } } }