C# order by的多个linq查询到单个linq查询

C# order by的多个linq查询到单个linq查询,c#,linq,delegates,C#,Linq,Delegates,我有多行订单条件,如下所示 if (enum1) { var = itemlist.orderby(r => r.column1) } else if (emum2) { var = itemlist.orderby(r => r.column2) } 等等。。动态执行此操作的任何方法。假设您的枚举只能有两个值: 枚举yourEnum(X=0,Y} enum1设置在以下位置: itemlist = enum1==Enum.X? itemlist.Orderby(

我有多行订单条件,如下所示

if (enum1)
{
     var = itemlist.orderby(r => r.column1)
}
else if (emum2)
{
     var = itemlist.orderby(r => r.column2)
}

等等。。动态执行此操作的任何方法。

假设您的枚举只能有两个值: 枚举yourEnum(X=0,Y}

enum1设置在以下位置:

itemlist = enum1==Enum.X? itemlist.Orderby(r => r.column1): itemlist.Orderby(r => r.column2)

假设您的枚举只能有两个值: 枚举yourEnum(X=0,Y}

enum1设置在以下位置:

itemlist = enum1==Enum.X? itemlist.Orderby(r => r.column1): itemlist.Orderby(r => r.column2)

我使用了下面的扩展方法

public static class IQueryableExtensions
    {
        public static IQueryable<T> OrderBy<T>(this IQueryable<T> items, string propertyName)
        {
            var typeOfT = typeof(T);
            var parameter = Expression.Parameter(typeOfT, "parameter");
            var propertyType = typeOfT.GetProperty(propertyName).PropertyType;
            var propertyAccess = Expression.PropertyOrField(parameter, propertyName);
            var orderExpression = Expression.Lambda(propertyAccess, parameter);

            var expression = Expression.Call(typeof(Queryable), "OrderBy", new Type[] { typeOfT, propertyType }, items.Expression, Expression.Quote(orderExpression));
            return items.Provider.CreateQuery<T>(expression);
        }
    }
公共静态类IQueryableExtensions
{
公共静态IQueryable OrderBy(此IQueryable项,字符串属性名称)
{
var typeOfT=typeof(T);
var参数=表达式参数(typeOfT,“参数”);
var propertyType=typeOfT.GetProperty(propertyName).propertyType;
var propertyAccess=Expression.PropertyOrField(参数,propertyName);
var orderExpression=Expression.Lambda(propertyAccess,参数);
var expression=expression.Call(typeof(Queryable),“OrderBy”,新类型[]{typeOfT,propertyType},items.expression,expression.Quote(orderExpression));
返回items.Provider.CreateQuery(表达式);
}
}

我使用了下面的扩展方法

public static class IQueryableExtensions
    {
        public static IQueryable<T> OrderBy<T>(this IQueryable<T> items, string propertyName)
        {
            var typeOfT = typeof(T);
            var parameter = Expression.Parameter(typeOfT, "parameter");
            var propertyType = typeOfT.GetProperty(propertyName).PropertyType;
            var propertyAccess = Expression.PropertyOrField(parameter, propertyName);
            var orderExpression = Expression.Lambda(propertyAccess, parameter);

            var expression = Expression.Call(typeof(Queryable), "OrderBy", new Type[] { typeOfT, propertyType }, items.Expression, Expression.Quote(orderExpression));
            return items.Provider.CreateQuery<T>(expression);
        }
    }
公共静态类IQueryableExtensions
{
公共静态IQueryable OrderBy(此IQueryable项,字符串属性名称)
{
var typeOfT=typeof(T);
var参数=表达式参数(typeOfT,“参数”);
var propertyType=typeOfT.GetProperty(propertyName).propertyType;
var propertyAccess=Expression.PropertyOrField(参数,propertyName);
var orderExpression=Expression.Lambda(propertyAccess,参数);
var expression=expression.Call(typeof(Queryable),“OrderBy”,新类型[]{typeOfT,propertyType},items.expression,expression.Quote(orderExpression));
返回items.Provider.CreateQuery(表达式);
}
}

您可以做的是更好地管理用于排序的列选择,例如,使用保存Func for KeySelect的某个集合

例如,如果您有一个具有四个属性的类名“SomeDTO”,Prop1、2、3和4。以及四个相应的枚举成员

var searchByMapping = new Dictionary<SearchByEnum,Func<SomeDTO, object>>();
searchByMapping.Add(SearchByEnum.Prop1, x => x.Prop1);
searchByMapping.Add(SearchByEnum.Prop2, x => x.Prop2);
searchByMapping.Add(SearchByEnum.Prop3, x => x.Prop3);

coll = coll.OrderBy(searchByMapping[searchByEnumParam]).ToList();
var searchByMapping=newdictionary();
添加(SearchByEnum.Prop1,x=>x.Prop1);
添加(SearchByEnum.Prop2,x=>x.Prop2);
添加(SearchByEnum.Prop3,x=>x.Prop3);
coll=coll.OrderBy(searchByMapping[searchByEnumParam]).ToList();

这不是一种动态的方法,而是一种类型安全的方法。

您可以做的是更好地管理列选择以进行排序,例如,使用一些保存Func for KeySelect的集合

例如,如果您有一个具有四个属性的类名“SomeDTO”,Prop1、2、3和4。以及四个相应的枚举成员

var searchByMapping = new Dictionary<SearchByEnum,Func<SomeDTO, object>>();
searchByMapping.Add(SearchByEnum.Prop1, x => x.Prop1);
searchByMapping.Add(SearchByEnum.Prop2, x => x.Prop2);
searchByMapping.Add(SearchByEnum.Prop3, x => x.Prop3);

coll = coll.OrderBy(searchByMapping[searchByEnumParam]).ToList();
var searchByMapping=newdictionary();
添加(SearchByEnum.Prop1,x=>x.Prop1);
添加(SearchByEnum.Prop2,x=>x.Prop2);
添加(SearchByEnum.Prop3,x=>x.Prop3);
coll=coll.OrderBy(searchByMapping[searchByEnumParam]).ToList();

这不是一种动态的方法,而是一种类型安全的方法。

使用switch语句?你的意思是什么?动态性如何?@Keyur你的意思是枚举的数量是动态确定的吗?嗨,我的意思是说,如果到那时我有15个以上的顺序,我希望我的单order by在linq中使用我的条件枚举或列名字符串。使用switch语句?你怎么办你的意思是?多动态?@Keyur你是说枚举的数量是动态确定的吗?嗨,我的意思是说,如果我有15个以上的顺序,那么我希望我的单个order by在linq中使用我的条件枚举或列名字符串。