EF 排序扩展

Posted York

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EF 排序扩展相关的知识,希望对你有一定的参考价值。

public static class LinqOrderEx
    {
        private static IOrderedQueryable<T> OrderingHelper<T>(IQueryable<T> source, string propertyName, bool descending, bool anotherLevel)
        {
            ParameterExpression param = Expression.Parameter(typeof(T), string.Empty); // I don‘t care about some naming
            MemberExpression property = Expression.PropertyOrField(param, propertyName);
            LambdaExpression sort = Expression.Lambda(property, param);

            MethodCallExpression call = Expression.Call(
                typeof(Queryable),
                (!anotherLevel ? "OrderBy" : "ThenBy") + (descending ? "Descending" : string.Empty),
                new[] { typeof(T), property.Type },
                source.Expression,
                Expression.Quote(sort));

            return (IOrderedQueryable<T>)source.Provider.CreateQuery<T>(call);
        }
        public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> source, string propertyName)
        {
            return OrderingHelper(source, propertyName, false, false);
        }
        public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> source, string propertyName, string order)
        {
            if (order.ToLower() == "desc")
                return OrderingHelper(source, propertyName, true, false);
            else
                return OrderingHelper(source, propertyName, false, false);
        }

        public static IOrderedQueryable<T> OrderByDescending<T>(this IQueryable<T> source, string propertyName)
        {
            return OrderingHelper(source, propertyName, true, false);
        }

        public static IOrderedQueryable<T> ThenBy<T>(this IOrderedQueryable<T> source, string propertyName)
        {
            return OrderingHelper(source, propertyName, false, true);
        }

        public static IOrderedQueryable<T> ThenByDescending<T>(this IOrderedQueryable<T> source, string propertyName)
        {
            return OrderingHelper(source, propertyName, true, true);
        }

        public static IQueryable<T> OrderByName<T>(this IQueryable<T> q, string SortField, bool Ascending = true)
        {
            if (SortField.IndexOf("DESC") > 0)
            {
                SortField = SortField.Split(new char[] {   })[0];
                Ascending = false;
            }
            var param = Expression.Parameter(typeof(T), "p");
            var prop = Expression.Property(param, SortField);
            var exp = Expression.Lambda(prop, param);
            string method = Ascending ? "OrderBy" : "OrderByDescending";
            Type[] types = new Type[] { q.ElementType, exp.Body.Type };
            var mce = Expression.Call(typeof(Queryable), method, types, q.Expression, exp);
            return q.Provider.CreateQuery<T>(mce);
        }
        public static IQueryable<T> OrderByName<T>(this IQueryable<T> q, string SortField, string order = "desc")
        {
            if (string.IsNullOrWhiteSpace(SortField) || string.IsNullOrWhiteSpace(order))
            {
                return q;
            }
            if (order.ToLower() == "desc")
            {
                return OrderByName(q, SortField, false);
            }
            else
            {
                return OrderByName(q, SortField, true);
            }
        }

    }

 

以上是关于EF 排序扩展的主要内容,如果未能解决你的问题,请参考以下文章

EF添加关联的提示问题:映射从第 260 行开始的片段时有问题:

EF6 自定义迁移表名

EF 开始的片段时有问题 具有潜在运行时冲突

是否可以使用“Array.IndexOf”或其他代码派生数据对数据库中的 EF 查询结果进行排序?

getSupportFragmentManager() 在活动扩展片段中未定义

EF框架下 Linq语句多表联查排序实例