当前位置: 首页 > 编程语言 > C#

使用动态排序的LINQ查询

时间:2023-04-10 19:57:36 C#

使用动态排序的LINQ查询我有一个查询需要根据查询字符串参数进行排序。比如sortby参数是price,Query需要随着price的变化而变化。如果其评级比更改查询按评级排序。我知道PredicateBuilder可以执行And和OR操作,但我如何执行动态ordebylinq查询。那么,您可以使用switch语句或类似的语句:IQueryablequery=...;switch(orderByParameter){case"price":query=query.OrderBy(x=>x.Price);休息;案例“评级”:query=query.OrderBy(x=>x.Rating);休息;//etc}您也可以使用反射来完成,但假设您的可用字段数量有限,这可能是最简单的方法。如果您确切知道哪些是用于订购的可能参数,那么乔恩的回答是最好的。但是,如果参数数量未知,则可以动态构建表达式。例如:classProgram{staticvoidMain(string[]args){varpeople=new[]{newPerson{Name="David",Age=40},newPerson{Name="Maria",Age=12},newPerson{Name="Lucas",Age=45}}.AsQueryable();foreach(varpinpeople.OrderBy("Age")){Console.Write(p.Name);}}classPerson{publicstringName{get;放;}publicintAge{得到;放;}}}staticclassIQueryableExtensions{publicstaticIQueryableOrderBy(thisIQueryableitems,stringpropertyName){vartypeOfT=typeof(T);varparameter=Expression.Parameter(typeOfT,"parameter");varpropertyType=typeOfT.GetProperty(propertyName).PropertyType;varpropertyAccess=Expression.PropertyOrField(参数,propertyName);varorderExpression=Expression.Lambda(propertyAccess,parameter);varexpression=Expression.Call(typeof(Queryable),"OrderBy",newType[]{typeOfT,propertyType},items.Expression,Expression.Quote(orderExpression));返回items.Provider.CreateQuery(表达式);}}扩展@lontivero回答如果你想按升序和降序对多个项目进行动态排序,你可以执行如下操作。添加OrderByDescending,ThenBy,ThenByDescending方法以上是C#学习教程:LINQquerywithdynamicOrderBy分享的全部内容,如果对你有用还需要详细了解C#学习教程,希望大家多多关注—staticclassIQueryableExtensions{publicstaticIQueryableOrderBy(thisIQueryableitems,stringpropertyName){vartypeOfT=typeof(T);varparameter=Expression.Parameter(typeOfT,"parameter");varpropertyType=typeOfT.GetProperty(propertyName).PropertyType;varpropertyAccess=Expression.PropertyOrField(参数,propertyName);varorderExpression=Expression.Lambda(propertyAccess,parameter);varexpression=Expression.Call(typeof(Queryable),"OrderBy",newType[]{typeOfT,propertyType},items.Expression,Expression.Quote(orderExpression));返回items.Provider.CreateQuery(expression);}publicstaticIQueryableOrderByDescending(这个IQueryableitems,stringpropertyName){vartypeOfT=typeof(T);varparameter=Expression.Parameter(typeOfT,"parameter");varpropertyType=typeOfT。GetProperty(属性yName).PropertyType;varpropertyAccess=Expression.PropertyOrField(参数,propertyName);varorderExpression=Expression.Lambda(propertyAccess,parameter);varexpression=Expression.Call(typeof(Queryable),"OrderByDescending",newType[]{typeOfT,propertyType},items.Expression,Expression.Quote(orderExpression));返回items.Provider.CreateQuery(expression);}publicstaticIQueryableThenBy(这个IQueryableitems,stringpropertyName){vartypeOfT=typeof(T);varparameter=Expression.Parameter(typeOfT,"parameter");varpropertyType=typeOfT.GetProperty(propertyName).PropertyType;varpropertyAccess=Expression.PropertyOrField(参数,propertyName);varorderExpression=Expression.Lambda(propertyAccess,parameter);varexpression=Expression.Call(typeof(Queryable),"ThenBy",newType[]{typeOfT,propertyType},items.Expression,Expression.Quote(orderExpression));返回items.Provider.CreateQuery(expression);}公众号taticIQueryableThenByDescending(thisIQueryableitems,stringpropertyName){vartypeOfT=typeof(T);varparameter=Expression.Parameter(typeOfT,"parameter");varpropertyType=typeOfT.GetProperty(propertyName).PropertyType;varpropertyAccess=Expression.PropertyOrField(parameter,propertyName);varorderExpression=Expression.Lambda(propertyAccess,parameter);varexpression=Expression.Call(typeof(Queryable),"ThenByDescending",newType[]{typeOfT,propertyType},items.Expression,Expression.Quote(orderExpression));返回items.Provider.CreateQuery(expression);}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: