请考虑以下代码:
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在两种权限之间进行映射,但我知道这有性能问题。我怎么能在两个模型之间映射?我无法使用AutoMapper。我的替代方法不起作用:
.Select(t => new ProviderViewModel(t))
答案 0 :(得分:1)
您只是想确保不再从数据库中提取超出需要的记录。
由于您无法在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从一页项目而不是整个集合创建一个列表。
答案 1 :(得分:0)
如果您的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));