我们有一个项目列表,这些项目可能有也可能没有子项目的集合。我们的报告需要包含除子项目的父项目之外的所有项目。
我需要将其分页,例如 25 行。但是,如果子项目出现在该页面上,则该项目的所有子项目都必须出现在同一页面上。因此,如果需要,可能会出现超过 25 个项目。
我已经做到了
var pagedProjects = db.Projects.Where(x => !x.SubProjects.Any()).Skip(
(pageNo -1) * pageSize).Take(pageSize);
显然,这不符合要求的第二部分。
更麻烦的是,我需要对报告进行寻呼机控制。所以我需要能够计算总页数。
我可以遍历整个项目表,但性能会受到影响。任何人都可以提出分页解决方案吗?
编辑 - 我可能应该提到子项目通过自引用外键重新连接到项目上,所以所有的项目,父项目,子项目等等,都以 IQueryable<Project>
的形式返回。 .
最佳答案
也许尝试对父项目进行分页,但只显示其子项目。
var pagedParentProjects = db.Projects.Where(x => x.SubProjects.Any()).Skip(pageNo-1) * pageSize).Take(pageSize);
然后在显示数据时循环遍历该项目的子项目。
@model IEnumerable<Project>
@foreach (Project project in Model)
{
<div>
@foreach (Project subProject in project.SubProjects)
{
<span>subProject.Name</span>
}
</div>
}
现在所有具有相同父项目的子项目都将在同一页面上。
关于c# - 复杂的 LINQ 分页算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5156084/