具有EF和性能的自动映射和延迟加载

时间:2012-07-12 12:46:43

标签: entity-framework automapper

我有这样的模型

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>

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

我怎样才能在viewModel中获得这两个属性而不是整个模型?

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

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

我知道我可以通过anonymouse类型和select命令从数据库中获取数据,但是后者有什么用途? 什么是最好的解决方案?

1 个答案:

答案 0 :(得分:2)

不要使用AutoMapper。这不适合IQueryable<T>。相反,使用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,但自那以后我没有听到任何关于它的消息。