首页 > 学院 > 开发设计 > 正文

C#linq查询动态OrderBy

2019-11-14 16:09:23
字体:
来源:转载
供稿:网友

groupList是原始数据集合,List<T>

sortOrder是排序类型,desc 或者asc

sortName是排序属性名称

1.使用反射。

PRivate static object GetPropertyValue(object obj, string property){      System.Reflection.PropertyInfo propertyInfo = obj.GetType().GetProperty(property);      return propertyInfo.GetValue(obj, null);} var resultList = sortOrder == "desc" ? groupList.OrderByDescending(p => GetPropertyValue(p, sortName)) : groupList.OrderBy(p => GetPropertyValue(p, sortName));//linq方式://var resultList1 = from p in groupList orderby GetPropertyValue(p, m.SortName) select p;if (sortOrder == "desc")    resultList1 = from p in groupList orderby GetPropertyValue(p, sortName) descending select p;

2.调用AsQueryable()

   将泛型 System.Collections.Generic.IEnumerable<T> 转换为泛型 System.Linq.IQueryable<T>。

var groupQueryList = groupList.AsQueryable();//herevar tmpList = groupQueryList.OrderBy(sortName, sortOrder);

需要如下扩展方法:

    public static IOrderedQueryable<T> OrderByDescending<T>(this IQueryable<T> source, string property)    {        return ApplyOrder<T>(source, property, "OrderByDescending");    }    public static IOrderedQueryable<T> ThenBy<T>(this IOrderedQueryable<T> source, string property)    {        return ApplyOrder<T>(source, property, "ThenBy");    }    public static IOrderedQueryable<T> ThenByDescending<T>(this IOrderedQueryable<T> source, string property)    {        return ApplyOrder<T>(source, property, "ThenByDescending");    }    static IOrderedQueryable<T> ApplyOrder<T>(IQueryable<T> 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 (IOrderedQueryable<T>)result;   } 

 

参考:http://stackoverflow.com/questions/41244/dynamic-linq-orderby-on-ienumerablet#41262


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表