我有这样的模型
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命令从数据库中获取数据,但是后者有什么用途? 什么是最好的解决方案?
答案 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,您会看到只有NewsId
和Title
列被撤消。 It looks like the AutoMapper folks were interested in addressing this shortcoming,但自那以后我没有听到任何关于它的消息。