質問: **これは状況です:** 2つのエンティティタイプが存在するアプリケーションがあるとします。 * `Company` * `Person` さらに、 `Person`は、 `Person.employer`を介して`Company`への参照があります。これは、従業員が雇用されている会社を示します。 私のアプリケーションでは、私は私のビジネスモデル関連サービスからデータベース操作を分離するため*のリポジトリを*使用しています:私は持っている`PersonRepository.findOne(id)`取得するメソッド`Person`エンティティと`CompanyRepository.findOne(id)`取得するメソッド`Company` 。ここまでは順調ですね。 **これはジレンマです:** `Person`を取得するために`PersonRepository.findOne(id)`を呼び出すと、 `Person.employer`プロパティを使用して完全に解決された`Company`にインラインを含める必要があります。これが、私が持っているジレンマに直面しています。最適ではない2つの実装オプション: **オプションA)** *リポジトリ全体で冗長クエリを実行しますが、データベースのラウンドトリップは少なくなります。* `PersonRepository`内では、ユーザーを選択して単一のクエリで会社を選択するクエリを作成できますが、会社の`select`式は難しく、会社を正しく組み立てるためにいくつかの結合が含まれています。 `CompanyRepository`すでにこのロジックが含まれており、会社を`select`して`UserRepository`書き直すことは冗長です。したがって理想的には、2つのリポジトリに同じクエリ式を重複してコーディングする必要がないようにするために、 `CompanyRepository`が会社選択ロジックを`CompanyRepository`することが`CompanyRepository`だけです。 **オプションB):** *クエリコードの冗長性を持たない懸念を分離するが、追加のdbラウンドトリップとリポジトリ依存の代償を払う。* 内`PersonRepository`私は参照することができ`CompanyRepository`フェッチするの世話をするために`Company`オブジェクトを、その後、私は、このエンティティを追加します`Person.employer`内のプロパティ`PersonRepository` 。このようにして、 `CompanyRepository`中にカプセル化された会社に照会するロジックを維持し、 `CompanyRepository`によって懸念が`CompanyRepository`分離されました。これの欠点は、2つの別のクエリが2つのリポジトリによって実行されるため、データベースへの追加のラウンドトリップを行うことです。 だから一般的に言えば、このジレンマに対処するための好ましい方法は何ですか? また、ASP.NETコアとEFコアでこのような状況を処理するにはどうすればよいでしょうか? **編集:**私は強調したい意見ベースの回答を避けるために:私は上に示した2つのオプションの賛否両論を探しているのではなく、両方のオプションの良い部分を統合する解決策に挑戦しようとしています。間違ったトラックはここに2つのオプションがあります私はそのような統合的な解決策がない理由を説明する答えでうまくいっているので、私はよく眠ることができます。
回答: IDで会社を検索するには、 `Person`のデータを読み込み、会社のIDを取得する必要があります。したがって、会社のクエリロジックを1か所にまとめたい場合は、会社IDを取得するための2つのラウンドトリップ( `Person`が持つ他の属性と一緒に)と会社を取得するもう1つのラウンドトリップになります。 あなたはから会社になり、コード再利用することができ`DbDataReader` 、しかし人+会社のクエリは、おそらく「フォワード」の人の参加に必要となる`companyId`に`Company`のクエリなので、これらのクエリのテキストが異なるなければならないであろう。 クエリロジックをストアドプロシージャに移動すると、両方向(1回のラウンドトリップ、繰り返しクエリなし)にすることができます。この方法で`person_sp`は`company_sp`を実行し、すべての関連データを返します。必要に応じて、C#コードは`reader.NextResult()`を使用して複数部分の結果セットを収穫することができます。今では企業IDの「引き渡し」がRDBMS側で行われるため、2回目の往復は不要です。ただし、このアプローチでは、RDBMS側でストアドプロシージャを維持する必要があり、C#コードベースからリポジトリロジックを効果的に出荷する必要があります。