1

以下多个 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);
    }

已编辑:它似乎确实适用于生成的查询,如下所示:唯一奇怪的是 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*/>}
4

0 回答 0