次の式を 1 つの式に結合しようとしています: item => item.sub, sub => sub.key を item => item.sub.key にします。これを行う必要があるのは、アイテム セレクターをキー セレクターに個別に渡す OrderBy メソッドを作成できるようにするためです。これは、OrderBy のオーバーロードの 1 つを使用して を提供することで実現できますが、IComparer<T>
SQL には変換されません。
以下は、私が達成しようとしていることをさらに明確にするためのメソッド シグネチャと、機能しないがポイントを説明する必要がある実装です。
public static IOrderedQueryable<TEntity> OrderBy<TEntity, TSubEntity, TKey>(
this IQueryable<TEntity> source,
Expression<Func<TEntity, TSubEntity>> selectItem,
Expression<Func<TSubEntity, TKey>> selectKey)
where TEntity : class
where TSubEntity : class
{
var parameterItem = Expression.Parameter(typeof(TEntity), "item");
...
some magic
...
var selector = Expression.Lambda(magic, parameterItem);
return (IOrderedQueryable<TEntity>)source.Provider.CreateQuery(
Expression.Call(typeof(Queryable), "OrderBy", new Type[] { source.ElementType, selector.Body.Type },
source.Expression, selector
));
}
これは次のように呼び出されます。
.OrderBy(item => item.Sub, sub => sub.Key)
これは可能ですか?より良い方法はありますか?このように動作する OrderBy メソッドが必要な理由は、さまざまな方法で公開されますが、多くのエンティティに適用される複雑なキー選択式をサポートするためです。また、深いプロパティの文字列表現を使用してこれを行う方法を認識していますが、強く型付けしたままにしようとしています。