C#linq查询动态OrderBy

王朝学院·作者佚名  2016-08-27  
宽屏版  字体: |||超大  

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有