親IDが1に等しいすべてのアイテムをフェッチする必要があるとしましょう。
まず、この方法でデータアクセスのニーズについて考えるのをやめます。
「親IDが1に等しいすべてのアイテムをフェッチする」必要はありません。このようなデータ指向の方法で考えるのをやめようとするのに役立ちます。
必要なのは、特定の親を持つすべてのアイテムをフェッチすることです。これは、問題空間(アプリケーションのドメイン)に存在する概念です。
これをデータベースで外部キーとparentidという名前のフィールドを使用してモデル化するという事実は、実装の詳細です。これをカプセル化し、アプリケーション全体にリークしないでください。
1つの方法は、IQueryable List()を使用してすべてのドキュメントを取得し、where句を追加して、parentidが1に等しいアイテムを選択することです。RavenDBではインデックス機能を使用できないため、これは悪い考えのようです。したがって、もう1つのアプローチは、リポジトリにIEnumerable Find(string index、Func predicate)のようなものを含めることですが、これも悪い考えのようです。
これらは両方とも悪い考えです。あなたが提案しているのは、リポジトリまたはクエリを呼び出すコードがスキーマの知識を持っていることを要求することです。
リポジトリの利用者が親のフィールドがあることを気にかけたり、知ったりする必要があるのはなぜですか?これが変更された場合、問題空間の特定の概念の定義が変更された場合、コード内の何箇所を変更する必要がありますか?
特定の親を持つアイテムをフェッチするすべての場所。
これは悪いことです、それはカプセル化のアンチテーゼです。
私の意見では、クエリを明示的な概念としてモデル化する必要があります。ラムダや文字列が渡されて使用されるのではありません。
仕様パターン、リポジトリ上の名前付きクエリメソッド、クエリオブジェクトパターンなどを使用して、クエリを明示的にモデル化できます。
これは十分に一般的ではなく、RavenDBから一般的なSQLサーバーに変更する場合に備えてこのメソッドを実装する必要があります。
まあ、それFunc
はあまりにも一般的です。繰り返しになりますが、このようなクエリ方法を使用するために、消費するコードが何を知る必要があるかを考えてください。これを行うことで、コードの上位層をDBスキーマに直接結び付けることになります。
また、あるストレージエンジンから別のストレージエンジンに変更する場合、パフォーマンスがストレージエンジン固有の支援(たとえば、Ravenのインデックス)を使用するのに十分な要素であるクエリの再実装を回避することはできません。