在实体框架中寻求3层LINQ查询的建议

时间:2011-01-20 20:32:59

标签: linq entity-framework join asp.net-mvc-3

我目前有一个LINQ查询,可以正确检索所有相关的民意调查问题及其相关的答案。在此查询中,我使用.Include()方法来检索响应。我喜欢这种方法,因为它使我的View中的代码变得简单 - 基本上我有一个@foreach用于嵌套在@foreach中的响应问题。

现在,我想添加特定于回复的信息,例如今天的投票数,本周的投票数和总票数。同样,这些将被检索并显示每个问题的每个响应。

是否有一个高效的LINQ解决方案可以让我继续使用我的.Include()方法和我的嵌套@foreach循环,还是我需要废弃.Include()方法并使用连接将所有内容拉到一起?

如果由于性能原因而重要,则使用.net MVC-3编写。

提前感谢您的意见/建议。

1 个答案:

答案 0 :(得分:0)

  

我喜欢这种方法,因为它使我的View中的代码变得简单 - 基本上我有@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>

现在,这是一个干净的观点。

现在让我们转到控制器:

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);
    }
}

在这里,我们已将数据访问抽象到存储库中,以便控制器永远不会知道有关EF或您正在使用的任何数据访问技术的任何信息。控制器应该只知道您的模型,视图模型以及如何操作模型的抽象(在这种情况下是存储库接口)。

就您的模型与视图模型之间的转换而言,您可以使用AutoMapper(我的示例中的Mapper.Map<TSource, TDest>部分)。

就存储库而言,这是一个实现细节:您是否对数据库执行了一次或三次查询,这取决于您。所需要的只是您能够汇总所需的信息。