如何改进这个Linq Multiple OrderBy Generic方法?

时间:2012-05-11 03:55:08

标签: linq generics lambda sql-order-by expression

以下多个OrderBy会起作用吗?

products.OrderBy<MyType>(sortPrm[0], sortPrm[1]).OrderBy<MyType>(sortPrm[3],sord);

我使用下面显示的自定义OrderBy泛型方法,它不返回IOrderedQueryable,因此我无法调用ThenBy方法。 sortPrm只是一个字符串数组,它保存我的排序列和排序方向信息,这些信息是从使用分隔符分割成数组的字符串输入创建的

    public static IQueryable<T> OrderBy<T>(this IQueryable<T> query, string sortColumn, string direction)
    {
        string methodName = string.Format("OrderBy{0}",
            direction.ToLower() == "asc" ? "" : "descending");

        ParameterExpression parameter = Expression.Parameter(query.ElementType, "p");

        MemberExpression memberAccess = null;
        foreach (var property in sortColumn.Split('.'))
            memberAccess = MemberExpression.Property
               (memberAccess ?? (parameter as Expression), property);

        LambdaExpression orderByLambda = Expression.Lambda(memberAccess, parameter);

        MethodCallExpression result = Expression.Call(
                  typeof(Queryable),
                  methodName,
                  new[] { query.ElementType, memberAccess.Type },
                  query.Expression,
                  Expression.Quote(orderByLambda));
        return query.Provider.CreateQuery<T>(result);
    }

EDITED: 它似乎与生成的查询一起工作如下: 唯一奇怪的是,orderby列在生成的查询中是相反的;所以我只是颠倒了我把它们的顺序:

products.OrderBy<MyType>(sortPrm[3],sord ).OrderBy<MyType>(sortPrm[0],sortPrm[1]);

这是生成的查询:

   {SELECT [t1].[value] // all the columns selected
...
...
    FROM (
        SELECT CONVERT(Int,[t0]. // all the columns selected
...
... AS [t0]
        ) AS [t1]
    ORDER BY [t1].[/*my LAST orderby column*/], [t1].[[/*my FIRST orderby column*/] //Note the order is reversed
    }   System.Linq.IQueryable</*my iqueryable class*/> {System.Data.Linq.DataQuery</*my iqueryable class*/>}

0 个答案:

没有答案