リポジトリにアクセスするための一般的なクエリ メカニズムを構築しようとしています。ラムダ式を使用してクエリをフィルタリングおよびソートしたいと考えています。一般的な Lambda 式のリストを渡す方法を見つけるのに苦労しています。具体的には order-by です。その際に助けていただければ幸いです。
編集:私が満たそうとしている2つの要件は、リポジトリを超えてIQueryableを公開しないことですが、データベースレベルでフィルタリングとソートを実行できることです。
これをよりよく説明するために、コードをお見せしましょう
public class Query<T>
{
public class OrderBy<T>
{
public Expression<Func<T, **int**>> Clause { set; get; } // Order By clause
public bool Descending = true;
}
public Expression<Func<T, bool>> Where { set; get; } // Where clause
public IList<OrderBy<T>> OrderBys { set; get; } // Where clause
public Query()
{
OrderBys = new List<OrderBy<T>>();
}
}
public IEnumerable<Person> FindBy(Query<Person> query)
{
IQueryable<Person> Temp = GetObjectSet();
if (query.Where != null)
Temp = Temp.Where(query.Where);
foreach (var OrderByThis in query.OrderBys)
{
if (OrderByThis.Descending)
Temp = Temp.OrderByDescending(OrderByThis.Clause);
else
Temp = Temp.OrderBy(OrderByThis.Clause);
}
return Temp.ToList<Person>();
}
これはすべて非常に優れていますが、 Expression< Func< T, int >> は一般的ではありません。次のようなことができる必要があります。
Query<Person> query = new Query<Person>();
Query<Person>.OrderBy<Person> clause1 = new Query<Person>.OrderBy<Person>();
clause1.Clause = m => m.Username;
Query<Person>.OrderBy<Person> clause2 = new Query<Person>.OrderBy<Person>();
clause2.Clause = m => m.DateOfBirth;
query.OrderBys.Add(clause1);
query.OrderBys.Add(clause2);
つまり、さまざまなタイプのさまざまなフィールドを多数追加します。
これらを一般的な Lambda 関数として保存し、リポジトリで必要な厳密に型指定された Lambda 関数に変換する方法が必要だと思います。
これどうやってするの?