Consider the code below:
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));
}
I'm using PagedList.MVC (from NuGet) and this conversion between business model and view model. I'm using the foreach to map between both entitities, but I understand this has a performance issue. How could I map between both models? I can't use AutoMapper. My alternative approach doesn't work:
.Select(t => new ProviderViewModel(t))
Best How To :
You just want to make sure you don't pull anymore records out of the database than you need.
As you can't use your ProviderViewModel constructor in LINQ to Entities you will have to retrieve the requested page yourself before creating your view model objects:
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 creates a list from one page of items rather than the whole collection.