linq - 寻求 Entity Framework 中 3 层 LINQ 查询的建议

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

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

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

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

如果出于性能原因它很重要,这是用 .net MVC-3 编写的。

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

最佳答案

I like this approach because it makes the code in my View simple -- basically I have a @foreach for the responses nested inside a @foreach for the questions.

就我个人而言,我不会对此感到满意。当您可以使用 Display Temapltes 时,为什么还要在您的 View 中编写循环?至于你关于包括今天的票数、本周的票数和总体票数的问题,答案一如既往地是使用专门针对 View 需求量身定制的 View 模型:

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>

现在,这是一个清晰的 View 。

现在让我们转到 Controller :

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

在这里,我们将数据访问抽象到存储库中,这样 Controller 就永远不会知道有关 EF 或您正在使用的任何数据访问技术的任何信息。 Controller 应该只知道您的模型、 View 模型和如何操作模型的抽象(在本例中为存储库接口(interface))。

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

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

关于linq - 寻求 Entity Framework 中 3 层 LINQ 查询的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4752259/

相关文章:

sql - 在一个查询中对多个表进行多个左连接

c# - 列表相交返回 null

c# - LINQ 中的数据冲突

c# - 使用 Linq 将数据分区到数组中

entity-framework - EF 4.1 CF : CREATE DATABASE permission denied in database 'master'

mysql - 订购两个合并查询

c# - 我如何动态构建一个 linq OR 查询,其中多个列之一可以匹配搜索字符串?

.net - Entity Framework 中使用代码优先的 TVF(表值函数)

c# - 是什么导致 EF 插入比普通 ADO.NET 慢得多?

php - 选择加入mysql 2个数据库