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

时间:2015-06-22 20:07:21

标签: c# asp.net-mvc entity-framework

请考虑以下代码:

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))

2 个答案:

答案 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));