2

我有一个这样的模型

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(); 但这会导致整个数据库恢复。我想在这里使用最佳实践?

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

4

1 回答 1

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列。看起来 AutoMapper 的人对解决这个缺点很感兴趣,但从那以后我没有听说过任何关于它的消息。

于 2012-07-12T13:20:41.620 回答