C#linq查询动态OrderBy
groupList是原始数据集合,List<T>
sortOrder是排序类型,desc 或者asc
sortName是排序属性名称
1.使用反射。PRivatestaticobjectGetPropertyValue(objectobj,stringproperty)
{
System.Reflection.PropertyInfo propertyInfo=obj.GetType().GetProperty(property);returnpropertyInfo.GetValue(obj,null);
}varresultList = sortOrder =="desc"? groupList.OrderByDescending(p => GetPropertyValue(p, sortName)) : groupList.OrderBy(p =>GetPropertyValue(p, sortName));//linq方式://varresultList1 =frompingroupListorderbyGetPropertyValue(p, m.SortName)selectp;if(sortOrder =="desc")
resultList1=frompingroupListorderbyGetPropertyValue(p, sortName)descendingselectp;
2.调用AsQueryable() 将泛型 System.Collections.Generic.IEnumerable<T> 转换为泛型 System.Linq.IQueryable<T>。
vargroupQueryList = groupList.AsQueryable();//herevartmpList = groupQueryList.OrderBy(sortName, sortOrder);
需要如下扩展方法:
publicstaticIOrderedQueryable<T> OrderByDescending<T>(thisIQueryable<T> source,stringproperty)
{returnApplyOrder<T>(source, property,"OrderByDescending");
}publicstaticIOrderedQueryable<T> ThenBy<T>(thisIOrderedQueryable<T> source,stringproperty)
{returnApplyOrder<T>(source, property,"ThenBy");
}publicstaticIOrderedQueryable<T> ThenByDescending<T>(thisIOrderedQueryable<T> source,stringproperty)
{returnApplyOrder<T>(source, property,"ThenByDescending");
}staticIOrderedQueryable<T> ApplyOrder<T>(IQueryable<T> source,stringproperty,stringmethodName) {string[] props = property.Split('.');
Type type=typeof(T);
ParameterExpression arg= Expression.Parameter(type,"x");
Expression expr=arg;foreach(stringpropinprops) {//use reflection (not ComponentModel) to mirror LINQPropertyInfo 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);objectresult =typeof(Queryable).GetMethods().Single(
method=> method.Name ==methodName&&method.IsGenericMethodDefinition&& method.GetGenericArguments().Length ==2&& method.GetParameters().Length ==2)
.MakeGenericMethod(typeof(T), type)
.Invoke(null,newobject[] {source, lambda});return(IOrderedQueryable<T>)result;
}
参考:http://stackoverflow.com/questions/41244/dynamic-linq-orderby-on-ienumerablet#41262