データアクセス層の次のアーキテクチャがあります。
DB テーブルにマップされるクラス。としましょう
Order
。Status
タイプのプロパティがありますstring
。何らかの列挙型の
OrderContract
プロパティを持つデータ コントラクト クラス。Status
(DB には、この列挙型の文字列表現が含まれています)内部で を取得し、それらをvia
Order
に変換してこれらの を返すEntity Framework を利用したリポジトリ。OrderContract
AutoMapper
OrderContract
そして今、このリポジトリにメソッドを実装するタスクがあります。これは、任意の基準 (述語) を使用して注文を照会できるようにするものです。リポジトリが だけOrder
を返す場合、次のようなメソッドを追加します。
public List<Order> FilterBy( Expression<Func<Order, bool> predicate );
残念ながら、リポジトリはOrderContract
s を返します。
の式を取得してsOrderContract
を返すことができるようなメソッドを実装する標準的または便利な方法はありますか?OrderContract
私たちが持っている2つのアイデアを挙げることができます:
Expression<Func<OrderContract, bool>>
入力式を に変換する式リライターを作成しExpression<Func<Order, bool>>
ます。しかし、このリライタは、列挙比較を文字列比較などに変換する方法を知っている必要があります。Select.ById( someId )
さまざまなクエリ ( など) の実行方法を認識し、ByNumber( someNumber )
必要な式を作成できる一連の仕様を作成しますOrder
。