モデルエンティティに適合しない、または一部を拡張する、リポジトリからアドホック(ケースバイケースのカスタム)データを返すための推奨される方法は何ですか?
101の例は、ユビキタスなhellowordアプリケーションであるブログシステムです。投稿エントリに投稿エンティティに存在しない追加情報が含まれている投稿のリストをロードするとします。コメントの数と最後のコメントの日時だとしましょう。単純な古いSQLを使用し、データベースから直接データを読み取る場合、これは非常に簡単です。各投稿のコメントのコレクション全体をロードする余裕がなく、1回のデータベースヒットでそれを実行したい場合、リポジトリパターンを使用して最適に実行するにはどうすればよいですか?この状況で一般的に使用されるパターンはありますか?ここで、各ページにわずかに異なるカスタムデータが必要であり、完全な階層(パフォーマンス、メモリ要件など)をロードできない、適度に複雑なWebアプリケーションがあるとします。
いくつかのランダムなアイデア:
カスタムデータで入力できるプロパティのリストを各モデルに追加します。
サブクラスモデルエンティティはケースバイケースで、サブクラスごとにカスタムリーダーを作成します。
LINQを使用して、アドホッククエリを作成し、匿名クラスを読み取ります。
注:最近、同様の質問をしましたが、一般的すぎるようで、あまり注目されていませんでした。
例:
以下の回答の提案に基づいて、より具体的な例を追加します。これが私が説明しようとしていた状況です:
IEnumarable<Post> posts = repository.GetPostsByPage(1);
foreach (Post post in posts)
{
// snip: push post title, content, etc. to view
// determine the post count and latest comment date
int commentCount = post.Comments.Count();
DateTime newestCommentDate = post.Comments.Max(c => c.Date);
// snip: push the count and date to view
}
余分なことを何もせずに既成のORMを使用すると、n + 1クエリ、または1つのクエリですべての投稿とコメントが読み込まれる可能性があります。ただし、最適には、投稿のタイトル、本文など、コメント数、最新のコメント日付を含む投稿ごとに1行を返すSQLを1つだけ実行できるようにしたいと思います。これはSQLでは簡単です。問題は、私のリポジトリがこのタイプのデータを読み取ってモデルに適合させることができないことです。最大日付とカウントはどこに行きますか?
私はそれをどのように行うかを尋ねていません。リポジトリにメソッドを追加したり、新しいクラスや特別なエンティティを追加したり、 LINQを使用したりするなど、いつでもそれを行うことができますが、私の質問は次のとおりです。どうしてリポジトリパターンと適切なモデル駆動型開発が広く受け入れられているのか、それでも、この一見非常に一般的で基本的なケースに対処していないようです。