【问题标题】:Automapper and lazy loading with EF and performanceAutomapper 和延迟加载与 EF 和性能
【发布时间】:2012-07-12 12:46:43
【问题描述】:

我有一个这样的模型

public class Exam
{
    public int NewsId { get; set; }
    public string Title { get; set; }
    public string Description{ get; set; }
    public string Program{ get; set; }
 }

还有这样的视图模型

public class ExamViewModel
{
    public int NewsId { get; set; }
    public string Title { get; set; }
}

我确实像这样配置 Automapper

AutoMapper.Mapper.CreateMap<Exam, ExamViewModel>();

在 ActionResult 中,我使用了这样的 Automapper:

    public ActionResult Exam()
    {
        var examsDb = db.Exams;
        IEnumerable<ExamViewModel> examViewModel = AutoMapper.Mapper.Map<IEnumerable<Exam>, IEnumerable<ExamViewModel>>(examsDb);

        return View(examViewModel);
    }

在视图中我循环遍历它

     @model IEnumerable<AraParsESOL.ViewModels.ExamViewModel>
       <ul>
      @foreach (var e in Model)
        { 
           <li>
              @Html.ActionLink(e.Title, "Type", "Exam")
            </li>
          }
      </ul>

我的问题是: 正如您在 Model 中看到的那样,有 4 个属性,但在 viewModel 中只有 2 个属性。

如何在 viewModel 中只获取这 2 个属性而不是整个模型?

这里发生的情况是,在每个循环之后,它都会从数据库中获取所需的列,但我只想要这两个属性,而不是返回数据库。

我可以像这样获取数据库 db.Exam.ToList(); 但这会导致整个数据库恢复。 我想在这里使用最佳实践吗?

我知道我可以通过匿名类型和选择命令从数据库中获取数据,但是 automapper 有什么用呢? 这里最好的解决方案是什么?

【问题讨论】:

  • 每个循环都会从数据库中获取所需的列,但我只想要这两个属性而不返回数据库,这是什么意思?您的模型中没有延迟加载 - 延迟加载仅影响相关实体,但您的模型没有任何实体。此外,您的代码应该执行与调用 db.Exam.ToList() 相同的操作。
  • 我的意思是在每次循环后的视图中,数据库都会被命中并且需要的数据会被取回。对于每一行,一个选择命令会进入数据库并选择那些拖曳属性,而不是只进入一次数据库并选择所有行并返回那些所需的数据。

标签: entity-framework automapper


【解决方案1】:

不要使用 AutoMapper。它不适用于IQueryable&lt;T&gt;。相反,使用 LINQ 投影:

public ActionResult Exam()
{
    var examsDb = db.Exams;
    IEnumerable<ExamViewModel> examViewModel = 
        from e in db.Exams
        select new ExamViewModel
        {
            NewsId = e.NewsId,
            Title = e.Title
        };

    return View(examViewModel);
}

如果查看生成的 SQL,您将看到仅返回 NewsIdTitle 列。 It looks like the AutoMapper folks were interested in addressing this shortcoming,但从那以后我再也没有听说过。

【讨论】:

  • 这种模式有替代方案吗?
  • 嗯,可以直接写SQL。您可以编写表达式并将其保存以备后用。看你想做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-05
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多