2017-01-17 2 views
1

オブジェクトがビジネスロジックから永続化される方法を分離するための良いパターンです。データベース内のオブジェクトがビジネスロジックにどのように永続化されているかを公開すると、これらのオブジェクトがどのように永続化されるかを変更するときに、ビジネスロジックを変更しなければならなくなります。エンティティフレームワークのリポジトリパターンとファンクションの検索

ビジネスロジックがFooをオブジェクトとして使用し、DAL(EFを使用)がFooDbModelを永続オブジェクトとして使用すると仮定します。リポジトリパターンを使用したCRUD操作の構築は非常に簡単です。Fooオブジェクトを取得し、FooDbModelをビルドし、必要な作業を行い、Fooをビルドして返します。

しかし、Findの機能がもう少し関与しているとき。

fはタイプ Foo(ない FooDbModel)である
Repository.Find(f => f.Name == "something"); 

:理想的には、私のような何かをしたいです。それはEFで可能ですか?私はfを渡すことは望ましくありません。これは、タイプがFooDbModelの場合、データの永続性がBLに公開されているためです。

これを行うにはトリックがありますか?

+0

フィルタ( 'Where')の前のプロジェクト(' Select')? –

+0

@IvanStoevその問題は、投影するためにすべてのデータをDBにメモリに格納する必要があることです。 Repo.GetAll()と似ていますが、どこに(...)。 dbが本当に小さい場合を除き、これはおそらく最善の方法ではありません。しかし、ありがとう。 – Husain

+0

あなたは 'IQueryable'でそれをしていません。あなたのメソッドがどれほど正確に構造化されているかはわかりませんが、私が見る 'Find'メソッドの**実装**はcontext.Set ().Select(m => new Foo {...})のようなものです。 (f => ...) 'これはSQLに変換する必要があります。 –

答えて

1

@IvanStoevが問題を解決しました。

基本的には、私は選択をしてからどこで行う必要があります。

彼を引用すると:

をあなたがのIQueryableにそれをしない場合。あなたのメソッドがどれくらい正確に構造化されているかはわかりませんが、私が見るFindメソッドの実装はcontext.Set()。Select(m => new Foo {...})です。これはSQLに変換する必要があります。

関連する問題