c# - 复杂的 LINQ 分页算法

标签 c# linq linq-to-sql

我们有一个项目列表,这些项目可能有也可能没有子项目的集合。我们的报告需要包含除子项目的父项目之外的所有项目。

我需要将其分页,例如 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/

相关文章:

c# - JavaScriptSerializer : Serialize a list + a string into JSON

c# - 在 ASP.Net MVC3 中使用 HtmlHelper 和分页呈现 View

c# - 使用以前排序的列表中的位置

asp.net-mvc - ASP MVC : When is IController Dispose() called?

linq-to-sql - 执行这两个 foreach 循环的最有效方法是什么?

java - 需要帮助将代码片段从 java 翻译为等效的 C#

c# - 如何在 WPF 中为组合框启用自由文本

c# - Distinct() 是否保留始终取列表中的第一个元素

c# - 使用 Comparer 按不同字段对 C# 中的 IEnumerable 进行排序

LINQ To SQL 实体对象作为域对象