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。您可以编写表达式并保存它们以供以后使用。这取决于你想做什么。