我正在使用 asp.net MVC 5 构建一个应用程序,并且有一个使用 IPagedList.MVC 版本 4.5.0.0、AutoMapper 和 Entity Framework 的网格。
在项目中,我有一个 BusinessLayer,这是我的 Action 与之交谈的对象,因为我不希望 Action 方法直接与 Entity Framework 交谈。所以我的BLL有以下方法:
public IPagedList<ActiveContractViewModel> GetAllContracts(string regNumFilter, int page)
{
var lstcontractViewModel = new List<ActiveContractViewModel>();
using (ActiveContractRepository activeContractRepos = new ActiveContractRepository(new UnitOfWork()))
{
var activeContractList = activeContractRepos.All.OrderByDescending(x => x.Id).Include(c => c.Contractor);
if (regNumFilter.Trim().Length > 0)
{
activeContractList = activeContractRepos.All.Where(x => x.RegistrationNumber.Contains(regNumFilter)).OrderByDescending(x => x.Id).Include(c => c.Contractor);
}
foreach (var activeContract in activeContractList)
{
Mapper.CreateMap<DomainClasses.ActiveContract, ActiveContractViewModel>().ForMember(dest => dest.ContractorModel, opts => opts.MapFrom(src => new ContractorViewModel
{
Id = src.Contractor.Id,
Name = src.Contractor.Name,
ContactPerson = src.Contractor.ContactPerson,
Phone = src.Contractor.Phone,
Fax = src.Contractor.Fax,
Address = src.Contractor.Address,
VendorNumber = src.Contractor.VendorNumber,
FederalTaxId = src.Contractor.FederalTaxId
}
));
Mapper.AssertConfigurationIsValid();
lstcontractViewModel.Add(Mapper.Map<ActiveContractViewModel>(activeContract));
}
}
return lstcontractViewModel.ToPagedList(page, 20);
}
我正在将我的 ActiveContract 类(来自 Entity Framework)映射到一个模型(ActiveContractVieWModel),它工作正常,返回数据并且分页工作。但我在调试时注意到 foreach 循环也会遍历所有记录,如果我有 2500 条记录,它会遍历所有记录,构建一个大列表,然后在 ToPageList 方法上使用。
有没有更好的方法来解决这个问题,这样我就可以构建我的模型并只用我需要的 20 条记录填充它并让 IPagedList 知道总大小?
最佳答案
我最终进一步研究了 IPageList.MVC,看到作者发布了关于此的信息: https://github.com/troygoode/pagedlist#example-2-manual-paging
“在某些情况下,您无法访问能够创建 IQueryable 的内容,例如在使用 .Net 的内置 MembershipProvider 的 GetAllUsers 方法时。此方法提供分页,但不是通过 IQueryable。幸运的是,PagedList 仍然支持您(注意使用 StaticPagedList):"
我转而使用 StaticPagedList,它现在工作得更好了,只需抓取我想要的记录数,分页也能正常工作。
关于c# - IPagedList.MVC,设置总大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23253172/