1

リポジトリでプリコンパイルされたlinqクエリを使用することは可能ですか? ObjectContextは、Iコンテキスト:現在の私のリポジトリは、私は私の実際のコンテキストクラスMyEntitiesを使用することにより、以下のようにしてプリコンパイルされたクエリを作成することができるだろうEFのリポジトリパターンを使用したプリコンパイルされたlinqクエリの使用

public class CustomerRepository : EntityRepository 
{ 
    private readonly IContext _context; 
    public CustomerRepository(UnitOfWork uow) 
     { 
      _context = uow.context; 
     } 
} 

のように設定しています。

static Func<ObjectContext, int, Customer> _custByID; 

public static Customer GetCustomer(int ID) 
{ 
    if (_custByID == null) 
    { 
    _custByID = CompiledQuery.Compile<MyEntities, int, Customer> 
    ((ctx, id) => ctx.Customers.Where(c => c.CustomerID == id).Single()); 
    } 
    return _custByID.Invoke(_context, ID); 
} 

問題は、TArg0のコンパイル方法がObjectContextから派生した型であることです。 IContextでリポジトリを使用する私の全目的が、上記の意味を使ってエンティティフレームワーク関連のコードを隠すことでした。プリコンパイルされたlinqクエリの使用方法はどうすればよいですか?私はそれらを私のモデルとエンティティフレームワークを参照する別のクラスライブラリに移動すべきか、リポジトリを間違って理解していますか?私はASP.netアプリケーションでEF4を使用しています。

答えて

3

リポジトリの実装には、データアクセステクノロジの知識が必要です。リポジトリの責任は、契約を満たすために基礎となるデータソースと話すことです。 ObjectSetがすでにリポジトリであるため、このような最適化を実行できない場合は、リポジトリを持つことは無意味です。リポジトリとEF間の間接参照の別の層を作成することは、無用な抽象化です。

+0

意味があります。私は主な懸念がテストであると信じています。私は私のリポジトリ機能をテストするために偽のコンテキストを使用していました。私は、私は私のリポジトリ機能をテストすることができないと信じています今すぐデータストロークを打つことなく、プリコンパイルされたlinqクエリを使用して? – nighthawk457

+0

@ nighthawk457 EFに関連するコードは単体テストではなく、統合テストされています。 [この質問](http://stackoverflow.com/questions/5609508/asp-net-mvc3-andentity-framework-code-first-architecture)を参照してください。 – Eranga

関連する問題