エンティティのユーザー指定のプロパティを OrderBy する Expression を構築するための構文を誰かが説明できますか?
この MSDN の記事は非常に役立ちますが、単純な文字列のリストを扱っており、私のデータ セットには独自のカスタム オブジェクトが含まれています。
エンティティのユーザー指定のプロパティを OrderBy する Expression を構築するための構文を誰かが説明できますか?
この MSDN の記事は非常に役立ちますが、単純な文字列のリストを扱っており、私のデータ セットには独自のカスタム オブジェクトが含まれています。
コードを先に、説明は後で。
IQueryable<T> data = this.Database.ObjectsOfType<T>();
var eachItem = Expression.Parameter(typeof(T), "item");
var propertyToOrderByExpression = Expression.Property(eachItem, propertyName);
var runMe = Expression.Call(
typeof(Queryable),
"OrderBy",
new Type[] { data.ElementType, typeof(IComparable) },
data.Expression,
Expression.Lambda<Func<T,IComparable>>(propertyToOrderByExpression, new ParameterExpression[] { eachItem }));
そのため、まずデータを Queryable オブジェクトとして取得します。これには一種の「ルート」式プロパティがあり、それが必要です。
eachItem は、Lambda の引数プレースホルダーを表す式であり、その中の記号は、必要に応じて、to に移動します。
次に、propertyName でユーザーが指定したプロパティ名の読み取り操作を行う式を作成します。
最後に、Queryable データで OrderBy メソッドを呼び出す式を作成します。私たちは言っています(議論の順序で):
Expression.Call(
[what's the type on which we want to call a method?],
[what's the name of the method we're calling?],
[if this method is generic, what are the types it deals with?],
{
[expression representing the data],
[expression for the lambda using the reader exp + each item exp]
})
実際にはパラメーター配列であるため、最後の 2 つは { } にあります。プロパティは任意の型である可能性がありますが、並べ替えるには明らかに比較可能である必要があるため、IComparable を使用しました。
ルーク