ソートのために動的に式ツリーを構築しようとしています。並べ替えは、私のWeb APIのアクションフィルターで行われます。したがって、実行時までオブジェクトのタイプは不明です。
アクションフィルタのレベルでは:動的オブジェクトのlinq式ツリーの作成
ここで概要を説明します
IEnumerable<object> model = null;
context.Response.TryGetContentValue(out model);
model=model.OrderByExtension(orderByField, orderDirection);
context.Response.Content=new ObjectContent<IEnumerable<object>>(model, new JsonMediaTypeFormatter());
と拡張方法:Expression.Callオン
public static IQueryable<T> OrderByExtension<T>(this IQueryable<T> source, string sortProperty, Sorting.SortingOption sortOrder)
{
var type = source.FirstOrDefault().GetType(); //Gets the type of object passed, since typeof(T) is only object at this point
var property = type.GetProperty(sortProperty);
var parameter = Expression.Parameter(type, "p");
var propertyAccess = Expression.MakeMemberAccess(parameter, property);
var orderByExp = Expression.Lambda(propertyAccess, parameter);
var typeArguments = new Type[] { typeof(T), property.PropertyType };
var methodName = sortOrder == Sorting.SortingOption.Asc ? "OrderBy" : "OrderByDescending";
var resultExp = Expression.Call(typeof(Queryable), methodName, typeArguments, source.Expression, Expression.Quote(orderByExp));
return source.Provider.CreateQuery<T>(resultExp);
}
- 私はエラーを取得します: 'System.Linq.Queryable'型の汎用メソッド 'OrderByDescending'は、指定された型引数および引数と互換性がありませんts。
OrderByメソッドが呼び出されたときに、「オブジェクト」タイプと実際のタイプとの間に不一致があると仮定しています。
これを動作させる方法はありますか?
ありがとうございます。 ps:.MakeGenericMethod経由でOrderByの汎用メソッドを作成しようとしましたが、成功しませんでした。
この回答[Entity FrameworkでOrder By Expressionを動的に構築する方法](http://stackoverflow.com/a/34908081/296861)を参照してください。 – Win
私はそれを見ました。しかし、これらすべてのシナリオでは、タイプTはDTOのタイプと正しく認識されます。残念ながら、私の場合、typeof(T)はオブジェクトになります。 – Newbee