Expression<Func<T, TProperty>>
要素の順序付けに使用されるコレクションを格納し、オブジェクトに対して格納されたリストを実行する方法を探していIQueryable<T>
ます (基になるプロバイダーは Entity Framework です)。
たとえば、次のようなことをしたいと思います (これは疑似コードです)。
public class Program
{
public static void Main(string[] args)
{
OrderClause<User> orderBys = new OrderClause<User>();
orderBys.AddOrderBy(u => u.Firstname);
orderBys.AddOrderBy(u => u.Lastname);
orderBys.AddOrderBy(u => u.Age);
Repository<User> userRepository = new Repository<User>();
IEnumerable<User> result = userRepository.Query(orderBys.OrderByClauses);
}
}
order by 句 (順序付けするプロパティ):
public class OrderClause<T>
{
public void AddOrderBy<TProperty>(Expression<Func<T, TProperty>> orderBySelector)
{
_list.Add(orderBySelector);
}
public IEnumerable<Expression<Func<T, ???>>> OrderByClauses
{
get { return _list; }
}
}
私のクエリメソッドを含むリポジトリ:
public class Repository<T>
{
public IEnumerable<T> Query(IEnumerable<OrderClause<T>> clauses)
{
foreach (OrderClause<T, ???> clause in clauses)
{
_query = _query.OrderBy(clause);
}
return _query.ToList();
}
}
私の最初のアイデアはExpression<Func<T, TProperty>>
、 を文字列 (並べ替えるプロパティ名) に変換することでした。したがって、基本的には、型付きリスト (TProperty が定数ではないため、これは不可能です) を格納する代わりに、並べ替えるプロパティを含む文字列のリストを格納します。
しかし、バックを再構築できないため、これは機能しません(IQueryable.OrderBy がas パラメーターExpression
を取るため必要です)。Expression<Func<T, TKey>>
また、(Expression.Convert を使用して) Expression を動的に作成しようとしましたExpression<Func<T, object>>
が、エンティティ フレームワークから、Expression.Convert ステートメントを処理できないという例外が発生しました。
可能であれば、 Dynamic Linq Libraryのような外部ライブラリを使用したくありません。