C# 在linq中的ORDERBY子句内动态设置键
我需要使用linq在OrderBy子句中设置键,其中键是对象的属性。我身上只带着酒店的名字。如何动态设置属性C# 在linq中的ORDERBY子句内动态设置键,c#,linq,reflection,C#,Linq,Reflection,我需要使用linq在OrderBy子句中设置键,其中键是对象的属性。我身上只带着酒店的名字。如何动态设置属性 class Obj { string Level { get; set; } } List<Obj> objList; objList.OrderByDescending(x => x.Level); => "here i only have property name." 类Obj { 字符串级别 {
class Obj
{
string Level
{
get;
set;
}
}
List<Obj> objList;
objList.OrderByDescending(x => x.Level); => "here i only have property name."
类Obj
{
字符串级别
{
得到;
设置
}
}
列表对象列表;
objList.OrderByDescending(x=>x.Level);=>“这里我只有财产名称。”
希望有人能帮忙
谢谢
Sunil您可以通过和动态地像
public static IOrderedQueryable<T> OrderByDescending<T>(this IQueryable<T> enumerable, string sortColumn)
{
var param = Expression.Parameter(typeof(T), "x");
var mySortExpression = Expression.Lambda<Func<T, object>>(Expression.Property(param, sortColumn), param);
return enumerable.OrderByDescending(mySortExpression);;
}
公共静态IOrderedQueryable OrderByDescending(此IQueryable可枚举,字符串sortColumn)
{
var param=表达式参数(类型(T),“x”);
var mySortExpression=Expression.Lambda(Expression.Property(param,sortColumn),param);
返回可枚举的.OrderByDescending(mySortExpression);;
}
订购人呢
public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> enumerable, string sortColumn)
{
var param = Expression.Parameter(typeof(T), "x");
var mySortExpression = Expression.Lambda<Func<T, object>>(Expression.Property(param, sortColumn), param);
return enumerable.OrderBy(mySortExpression);;
}
public static IOrderedQueryable OrderBy(此IQueryable可枚举,字符串sortColumn)
{
var param=表达式参数(类型(T),“x”);
var mySortExpression=Expression.Lambda(Expression.Property(param,sortColumn),param);
返回可枚举的.OrderBy(mySortExpression);;
}
你可以把这两者结合在一起,就像
public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> enumerable, string sortColumn, string direction)
{
var param = Expression.Parameter(typeof(T), "x");
var mySortExpression = Expression.Lambda<Func<T, object>>(Expression.Property(param, sortColumn), param);
IOrderedQueryable<T> iQuery;
switch(direction)
{
case "desc":
iQuery = enumerable.OrderByDescending(mySortExpression);
break;
case "asc":
default :
iQuery = enumerable.OrderBy(mySortExpression);
break;
}
return iQuery;
}
public static IOrderedQueryable OrderBy(此IQueryable可枚举,字符串sortColumn,字符串方向)
{
var param=表达式参数(类型(T),“x”);
var mySortExpression=Expression.Lambda(Expression.Property(param,sortColumn),param);
可查询的iOrdered iQuery;
开关(方向)
{
案例“desc”:
iQuery=enumerable.OrderByDescending(mySortExpression);
打破
案例“asc”:
违约:
iQuery=enumerable.OrderBy(mySortExpression);
打破
}
回归方程;
}
然后您可以像调用升序的那样调用它,如objList.OrderBy(“Level”,“asc”)
//
objList.OrderBy(“Level”、“desc”)
//用于降序
希望这将有助于对救援的反思。请注意,这可能会很慢。是的,我找到了获取属性名称的方法,键入了,但找不到我需要的内容。可能是因为我不熟悉反射…谢谢你的帮助..但很遗憾,我在.net 3.5中工作,而它不在其中工作。@Sunil,更新了答案,所有方法都适用于.net 3.5..但我使用的是List。3.5中的List是IQueryable还是IEnumerable..我找不到扩展方法。我将该方法添加到静态类中的项目中。但仍然没有显示在列表类中。您是否在文件中包含扩展方法类、命名空间?