私はこのアプローチが好きです。なぜなら、私のビュー内のコードを単純にするからです。質問のために@foreach内にネストされた応答のための@foreachがあります。
個人的に私はこれに満足しません。 Display Temapltesを使うことができるとき、あなたのビューにループを書くのはなぜですか?今日の投票数を含めることについて質問する限り、今週の投票数と投票総数は、いつものように、ビューのニーズに合わせて特別に調整されたビューモデルを使用することです。
public class QuestionViewModel
{
public int VotesToday { get; set; }
public int VotesThisWeek { get; set; }
public int TotalVotes { get; set; }
public IEnumerable<ResponseViewModel> { get; set; }
}
あなたはあなたのビューにIEnumerable<QuestionViewModel>
を渡すと、それは次のようになります。
@model IEnumerable<AppName.Models.QuestionViewModel>
@Html.DisplayForModel()
と~/Views/Shared/DisplayTemplates/QuestionViewModel.cshtml
@model AppName.Models.QuestionViewModel
<div>@Model.VotesToday</div>
<div>@Model.VotesThisWeek</div>
<div>@Model.TotalVotes</div>
@Html.DisplayFor(x => x.ResponseViewModel)
で
と~/Views/Shared/DisplayTemplates/ResponseViewModel.cshtml
:
@model AppName.Models.ResponseViewModel
<div>@Model.Body</div>
これはクリーンなビューです。
は、今度はコントローラに移動してみましょう:コントローラは、EFまたは使用しているどんなデータアクセス技術について何を知っているべきではありませんように
public class QuestionsController: Controller
{
private readonly IQuestionsRepository _repository;
public QuestionsController(IQuestionsRepository _repository)
{
_repository = repository;
}
public ActionResult Index()
{
IEnumerable<Question> model = _repository.GetQuestions();
IEnumerable<QuestionViewModel> viewModel = Mapper
.Map<IEnumerable<Question>, IEnumerable<QuestionViewModel>>(model);
return View(viewModel);
}
}
ここでは、リポジトリに離れたデータアクセスを抽象化しています。コントローラは、モデル、ビューモデル、モデルの操作方法(この場合はリポジトリインタフェース)の抽象化についてのみ知っている必要があります。
あなたのモデルとビューモデルの間の変換に関しては、AutoMapper(私の例ではMapper.Map<TSource, TDest>
の部分)を使用することができます。
リポジトリに関する限り、これは実装の詳細です。データベースに1つまたは3つのクエリを実行するかどうかは、あなたの責任です。必要なのは、必要な情報を集約できることだけです。
ありがとうございました。私はあなたが私がそれを理解していると正直に言うことができる前に、あなたの例を再加工する必要があります。1つは、 "Votes Today、etc"は、ResponseViewModelの中にあるように、質問ではなく応答の値であるようです。 1つの質問には多くの回答があり、それぞれの回答にはそれらの値があります。つまり、私はあなたの一般的な考えに従っていると思いますが、私はDisplayForModel()やMapper.Mapを使用したことはありませんので、調査する必要があります。あなたのアプローチを考えれば、私の元の質問に答えられたのか、それとももはや当てはまらないのか分かりません。あなたのアプローチを試し、何が起こるかを見てみましょう。再度、感謝します。 – karman
私はあなたの応答を理解すると思うが、私はそれが私の最初の質問に答えたとは思わない。あなたは「あなたのデータベースに1つまたは3つのクエリを実行するかどうかはあなた次第です」と言いました。それは私の質問の中心です。どのように私は単一のクエリでそれを行うだろう。どのように3つのクエリで効率的に行うのですか?私はあなたの応答に感謝し、私はそのアプローチを試みるつもりですが、私はまだデータ取得のステップに固執しています。最高、 – karman
@ karman、私はEFの専門家ではなく、3つではなく1つのクエリを実行する方法に答えることができません。考え方は、SQL結合を実行することです。これはEF固有の質問であり、MVCとはまったく関係ありません。私の答えでは、MVCアプリケーションからデータアクセスロジックを抽象化する方法を示しました。 –