3

エンティティのユーザー指定のプロパティを OrderBy する Expression を構築するための構文を誰かが説明できますか?

この MSDN の記事は非常に役立ちますが、単純な文字列のリストを扱っており、私のデータ セットには独自のカスタム オブジェクトが含まれています。

http://msdn.microsoft.com/en-us/library/bb882637.aspx

4

1 に答える 1

13

コードを先に、説明は後で。

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 を使用しました。

ルーク

于 2012-08-31T16:40:52.780 に答える