2011-10-26 8 views
0

エンティティデータモデルには、すべてstart_dateやend_dateなどのいくつかの共通フィールドがある約20種類のレポートテーブルがあります。レポートアプリケーションが特定のレポートのデータを取得するとき、最初に行うことは今日の日付のテーブルをフィルタリングすることです。これは私が私のコード(VB)を通じて、このようなコードブロックを持っていることを意味:複数のエンティティオブジェクトに同じロジックを適用する方法

Dim data = 
    From r in _context.Rpt1 
    Where 
     r.start_date <= Now And 
     r.end_date >= Now 

私は任意のテーブルをフィルタリングできるようになる関数にこのロジックを置くための方法があるはずのように思えますが、私ができます」それをどのように構造化するかを理解する。

Public Function FilterByDate(data As IEnumerable) As IEnumerable 
    Return From d In data Where d.start_date <= Now And d.end_date >= Now 
End Function 

をしかし、戻り値はジェネリックのIEnumerableあるので、私は早く、特定のレポート列に結合のすべての利点を失う:私はこれを行うことができます。

いくつかのロジックを異なるオブジェクトに適用し、その特定のオブジェクトを汎用オブジェクトの代わりに返すことができる1つの汎用関数を作成する方法はありますか?あるいは、戻り値を特定のエンティティオブジェクト型にキャストする方法はありますか?このタイプの問題を攻撃するもう1つの方法はありますか?アイデアや問題を見るさまざまな方法を探しています。

答えて

1

あなたはstart_dateend_dateなどの「共通」のプロパティを公開するインターフェイスを実装IFoo(彼らは法案を収まる場合、またはすべての)生成されたエンティティがいずれかを有することにより、部分クラスであるという事実を利用することができます。

あなたは、その後、一般的なフィルタリング方法(C#でコード、申し訳ありません)を書き込むことができます。

public IQueryable<T> Filter<T>(IQueryable<T> queryable) where T : IFoo 
{ 
    var now = DateTime.Now; 
    return queryable.Where(q => q.start_date <= now && q.end_date >= now); 
} 

これは、一般的なパラメータの型制約に照会可能感謝の意味のあるタイプを受け入れますが、まだあなたが返すことができますジェネリック引数型控除のおかげで渡されたものとまったく同じ型。

関連する問題