如何在分页之前在两个实体之间进行映射
本文关键字:实体 两个 之间 映射 分页 | 更新日期: 2023-09-27 17:57:31
考虑以下代码:
public ActionResult Index(int? page)
{
List<ProviderViewModel> viewModel = new List<ProviderViewModel>();
List<Provider> businessModel = db.Providers
.OrderBy(t => t.Name);
foreach (Provider provider in businessModel)
{
viewModel.Add(new ProviderViewModel(provider));
}
int pageSize = 9;
int pageNumber = (page ?? 1);
return View(viewModel.ToPagedList(pageNumber, pageSize));
}
我使用的是PagedList.MVC(来自NuGet)以及业务模型和视图模型之间的转换。我使用foreach在两个实体之间进行映射,但我知道这存在性能问题。如何在两种型号之间进行映射?我不能使用自动映射器。我的替代方法不起作用:
.Select(t => new ProviderViewModel(t))
您只需要确保不会从数据库中提取超出需要的记录。
由于您不能在LINQ to Entities中使用ProviderViewModel构造函数,因此在创建视图模型对象之前,您必须自己检索请求的页面:
public ActionResult Index(int? page)
{
List<ProviderViewModel> viewModel = new List<ProviderViewModel>();
List<Provider> businessModel = db.Providers
.OrderBy(t => t.Name);
int pageSize = 9;
int pageNumber = (page > 0 ? page : 1);
int totalCount = businessModel.Count();
foreach (Provider provider in businessModel.Skip(pageSize * (pageNumber - 1))
.Take(pageSize))
{
viewModel.Add(new ProviderViewModel(provider));
}
return View(new StaticPagedList(viewModel, pageNumber, pageSize, totalCount));
}
StaticPagedList从一页项目而不是整个集合创建列表。
如果ProviderViewModel
构造函数很简单,则可以直接投影到类中。这将使您不必迭代整个表。例如:
var viewModel = from p in db.Providers
orderby p.Name
select new ProviderViewModel
{
Prop1 = p.Prop1,
Prop2 = p.Prop2 + " " + p.prop3
etc...
};
int pageSize = 9;
int pageNumber = (page ?? 1);
return View(viewModel.ToPagedList(pageNumber, pageSize));