2009-03-28 10 views
2

私は、製品のエンティティおよび製品のシリーズ、ファミリ、ブランドなどの関連エンティティを持つエンティティフレームワークコードをリファクタリングしようとしています。シリーズ、ファミリ、ブランドのエンティティはすべて、IdおよびTextプロパティ。これら2つの方法を1にリファクタリングするにはどうすればよいですか?

以下の2つのメソッドは非常に似ており、1つのメソッドにリファクタリングできるはずですが、どのエンティティからどのエンティティをクエリしているかを動的に渡す方法がわかりません。この場合、db.ProductFamiliesまたはdb.ProductSeriesSetを渡すことができる必要があります。どのようにこれらの2を作るためのアイデアは1になる?

ありがとうございます!

public DTOs.ProductCollection GetFamily(int id) 
    { 
     using (Entities db = new Entities()) 
     { 
      var fam = (from collection in db.ProductFamilies.Include("Product") 
         .Include("Product.Stuff1") 
         .Include("Product.Stuff2") 
         where collection.Id == id 
         select collection).FirstOrDefault(); 
      return ProductCollectionEFToProductCollectionDTO(fam, true); 
     } 
    } 

    public DTOs.ProductCollection GetSeries(int id) 
    { 
     using (Entities db = new Entities()) 
     { 
      var ser = (from collection in db.ProductSeriesSet.Include("Product") 
         .Include("Product.Stuff1") 
         .Include("Product.Stuff2") 
         where collection.Id == id 
         select collection).FirstOrDefault(); 
      return ProductCollectionEFToProductCollectionDTO(ser, true); 
     } 
    } 

答えて

2

もしProductCollectionEFToProductCollectionDTO(BaseClassの OBJ、ブール値)を使用する場合db.ProductFamiliesとdb.ProductSeriesSetは、その後、同じ基本クラスから継承される場合、

ジェネリックタイプです。

これらは2つの基本的なアプローチです。

+0

ProductSeriesSetまたはProductFamiliesから照会するfrom節にある違いを処理するにはどうすればよいですか? –

+0

私は気づかなかった、はい、あなたのものが私のものよりも優れています。 –

5

あなたが呼び出し側に良いエンティティコレクションの選択を委任するFunc<T, TResult>を使用することができます。ここでは

public DTOs.ProductCollection Get(int id, Func<Entities, XXX> selector) 
{ 
    using (Entities db = new Entities()) 
    { 
     var result = (from collection in selector(db).Include("Product") 
        .Include("Product.Stuff1") 
        .Include("Product.Stuff2") 
        where collection.Id == id 
        select collection).FirstOrDefault(); 
     return ProductCollectionEFToProductCollectionDTO(result, true); 
    } 
} 

、XXXはdb.ProductFamiliesdb.ProductSeriesSetの型です。

あなたはそのようにそれを呼び出すことができます。

Get(42, db => db.ProductFamilies); 
Get(12, db => db.ProductSeriesSet); 

それは動作しますか?

+0

ほぼあります。私が抱えている問題は、ProductFamiliesとProductSeriesSet(XXX)に共通の基底クラスがないため、XXXを置き換える型がないことです。私がやったのは、どちらも実装しているProductCollectionインターフェイスを追加することでした。次のコメントに続き... – EricAppel

+0

共通インターフェイスを使用することで、メソッドを実装することができましたが、呼び出し時に次の処理を行う必要がありました。 GetProductCollection(id、db =>(ObjectQuery )db.ProductFamilies.Cast ); 続き... – EricAppel

+0

キャストのために、「LINQ to Entities」は、実行時にエンティティデータモデルのプリミティブ型のキャストのみをサポートします。私はどのようにこれらのエンティティすべてで動作する共通の基底型を得ることができないのか分かりません。各エンティティは、共通のフィールドを別のテーブルから取得します。エンティティを一般的にどのように扱うことができますか? – EricAppel

関連する問題