如何在分页之前在两个实体之间进行映射

本文关键字:实体 两个 之间 映射 分页 | 更新日期: 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));
相关文章: