次の複数の OrderBy は機能しますか?
products.OrderBy<MyType>(sortPrm[0], sortPrm[1]).OrderBy<MyType>(sortPrm[3],sord);
IOrderedQueryable を返さない以下のカスタム OrderBy ジェネリック メソッドを使用しているため、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*/>}