【发布时间】:2020-10-13 19:15:41
【问题描述】:
我继承了一个项目,并要求在我们所有的存储库中实现分页(500 多种方法),以便在 Web 前端仅显示数据片段。
当前存储库如下。它们返回任务列表、IEnumerables 等。
我们将如何完成并为以下存储库示例实现分页?
如果我实现以下分页列表答案,则存储库返回 IList,而不是 IQueryable。所以答案仍然是先检索所有数据(导致性能问题),然后过滤它。
https://stackoverflow.com/a/5036023/12425844
存储库:
public Task<List<Product>> GetProductListByProductNumber(int bkProductNumber)
{
var productData = _context.Product
.Include(c => c.LkProducttype)
.Where(c => c.BkProductnumber == bkProductNumber).ToListAsync();
return productData ;
}
public Task<List<Product>> GetProductListByProductDescription(string productDescription)
{
var productData = _context.Product
.Include(c => c.LkProducttype)
.Where(c => c.ProductDescription == productDescription).ToListAsync();
return productData;
}
页面列表答案
public PagedList<T> Find(Expression<Func<T,bool>> predicate, int pageNumber, pageSize)
{
return repository
.Find()
.Where(predicate)
.ToPagedList(pageNumber, pageSize);
}
*寻找一种有效的方法,所以如果可能的话,不必重新复制和粘贴所有 500 多种分页方法
如果将所有 Repos 方法更改为 IQueryable,这可能会解决问题。但是,阅读 Repos should Not return IQueryable per article here Entity Framework Repository Pattern why not return Iqueryable?
【问题讨论】:
-
你可以用 ToPagedList() 代替对 ToListAsync() 的调用
-
嗨@EnasOsama 那么我该如何处理不需要分页的原始存储库?我也需要它们,谢谢
-
要处理分页,返回的对象必须不同以保存有关总计数和当前页面的信息。你打算如何处理这个问题,以便我可以尝试提供帮助:)
-
也许放置一个参数作为存储库名称,寻找任何解决方案,试图了解自己? @EnasOsama
-
好吧,我现在唯一能想到的就是也许你可以编辑 .ToPagedList() 扩展方法来处理这个问题。它可以采用可选的分页参数。如果存在,则使用分页版本,否则使用常规 ToListAsync()。唯一的问题是你必须有一个包装对象来处理这两种情况或使用动态作为返回对象
标签: c# .net linq .net-core repository