多个linq查询的顺序由单一

时间:2013-02-19 11:57:12

标签: c# linq delegates

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

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

等等。任何方式动态地做这件事。

3 个答案:

答案 0 :(得分:3)

您可以做的是更好地管理用于排序的列选择,例如使用一些包含Func<>的集合对于KeySelector。

E.g。如果您有一个具有四个属性的类名'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();

这是一种不那么动态的方法,但它是一种类型安全的方法。

答案 1 :(得分:0)

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

enum1在某处设置:

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

答案 2 :(得分:0)

我使用了以下扩展方法。

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);
        }
    }