以下多个 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*/>}