2011-01-20 8 views
3

関連するすべての質問と関連する応答を正しく取得しているLINQクエリがあります。このクエリでは、応答を取得するために.Include()メソッドを使用しています。私はこのアプローチが気に入っています。なぜなら、私のビュー内のコードを単純にしているからです。基本的に質問のために@foreachの中にネストされたレスポンスに対して@foreachがあります。Entity Frameworkでの3層LINQクエリの推奨を求める

ここでは、今日の投票数、今週の投票数、投票総数などの回答固有の情報を追加したいと思います。この場合も、これらはそれぞれの質問の回答毎に検索されて表示されます。

.Include()メソッドとネストされた@foreachループの使用を継続できる効率的なLINQソリューションがあるか、.Include()メソッドをスクラップしてジョインを使用してすべてを一緒にプルする必要がありますか?

パフォーマンス上の理由で問題が発生した場合、これは.NET MVC-3で記述されています。

ご意見/ご提案をいただきありがとうございます。

答えて

0

私はこのアプローチが好きです。なぜなら、私のビュー内のコードを単純にするからです。質問のために@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つのクエリを実行するかどうかは、あなたの責任です。必要なのは、必要な情報を集約できることだけです。

+0

ありがとうございました。私はあなたが私がそれを理解していると正直に言うことができる前に、あなたの例を再加工する必要があります。1つは、 "Votes Today、etc"は、ResponseViewModelの中にあるように、質問ではなく応答の値であるようです。 1つの質問には多くの回答があり、それぞれの回答にはそれらの値があります。つまり、私はあなたの一般的な考えに従っていると思いますが、私はDisplayForModel()やMapper.Mapを使用したことはありませんので、調査する必要があります。あなたのアプローチを考えれば、私の元の質問に答えられたのか、それとももはや当てはまらないのか分かりません。あなたのアプローチを試し、何が起こるかを見てみましょう。再度、感謝します。 – karman

+0

私はあなたの応答を理解すると思うが、私はそれが私の最初の質問に答えたとは思わない。あなたは「あなたのデータベースに1つまたは3つのクエリを実行するかどうかはあなた次第です」と言いました。それは私の質問の中心です。どのように私は単一のクエリでそれを行うだろう。どのように3つのクエリで効率的に行うのですか?私はあなたの応答に感謝し、私はそのアプローチを試みるつもりですが、私はまだデータ取得のステップに固執しています。最高、 – karman

+0

@ karman、私はEFの専門家ではなく、3つではなく1つのクエリを実行する方法に答えることができません。考え方は、SQL結合を実行することです。これはEF固有の質問であり、MVCとはまったく関係ありません。私の答えでは、MVCアプリケーションからデータアクセスロジックを抽象化する方法を示しました。 –

関連する問題