Entity framework 使用EF和性能自动映射和延迟加载

Entity framework 使用EF和性能自动映射和延迟加载,entity-framework,automapper,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; se

我有一个这样的模型

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.Mapper.CreateMap<Exam, ExamViewModel>();
还有像这样的视图模型

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.Mapper.CreateMap<Exam, ExamViewModel>();
我确实是这样做的

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.Mapper.CreateMap<Exam, ExamViewModel>();
AutoMapper.Mapper.CreateMap();
在ActionResult中,我使用Automapper如下:

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

        return View(examViewModel);
    }
public ActionResult考试()
{
var examsDb=分贝检查;
IEnumerable examViewModel=AutoMapper.Mapper.Map(examdb);
返回视图(examViewModel);
}
在视图中,我循环通过它

     @model IEnumerable<AraParsESOL.ViewModels.ExamViewModel>
       <ul>
      @foreach (var e in Model)
        { 
           <li>
              @Html.ActionLink(e.Title, "Type", "Exam")
            </li>
          }
      </ul>
@model IEnumerable
    @foreach(模型中的var e) {
  • @ActionLink(例如标题,“类型”,“考试”)
  • }
我的问题是: 如您所见,在模型中有4个属性,但在viewModel中只有2个属性

如何在viewModel中仅获取这两个属性而不获取整个模型

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

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

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

不要使用AutoMapper。它不适用于
IQueryable
。相反,请使用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);
}
public ActionResult考试()
{
var examsDb=分贝检查;
IEnumerable examViewModel=
从数据库中的e开始
选择新的ExamViewModel
{
NewsId=e.NewsId,
头衔
};
返回视图(examViewModel);
}

如果查看生成的SQL,您将看到只返回
NewsId
Title
列,但从这以后我就再也没有听说过

每个循环从数据库中获取所需的列,但我只需要这两个属性,而不返回数据库,这是什么意思?您的模型中没有延迟加载-延迟加载只影响相关实体,但您的模型没有任何延迟加载。另外,您的代码应该执行与调用
db.Exam.ToList()
相同的操作。我的意思是在每次循环后的视图中,数据库被命中,所需的数据被返回。对于每一行,select命令都会进入数据库并选择这两个属性,而不是只进入数据库一次,然后选择所有行并返回所需的数据。有没有其他方法可以替代此模式?嗯,您可以直接编写SQL。您可以编写表达式并保存它们以供以后使用。这取决于你想做什么。