在单个列表中对不同的项目进行分页

本文关键字:项目 分页 单个 列表 | 更新日期: 2023-09-27 18:33:52

我很难在这里发布这样的问题,因为我没有遇到寻求帮助的特定错误。虽然我确实认为问题应该与代码相关(甚至是伪代码(,但我认为在 StackOverflow 上发布帮助之前,您不必有错误代码,所以在这里。

我正在寻找一种方法,将来自两个不同数据源的项目合并到单个集合中,并应用分页,以便它们按创建顺序显示。执行每个单独的现有逻辑非常简单,可以直接通过SQL完成,甚至可以使用Linq表达式在C#中完成(在我的情况下,NHibernate DAL会将其解析为SQL,但这超出了我认为的问题范围(

我的方案是我在业务应用程序中有一个注释概念和一个文档/附件概念。两者目前是分开的,我希望将它们组合到一种"日记"实现中,其中注释和文档按它们在合并列表中的添加顺序列出,并且只是有条件地显示注释或文档的显示信息根据当前枚举中的项目在构建 UI 时

问题是分页。合并来自两个数据源的前 X 个,然后应用相同的 X 限制适用于第 1 页(虽然有点浪费(,但在后续页面上完全崩溃。我无法在 DAL 抽象中直接联接这两个对象,因为它们是完全不同的类型。我考虑过使用日期范围作为每个页面的开始和结束,而不是页面索引,但它在概念上似乎很脆弱。我考虑过使用原始 SQL 来获取跨两个表工作的组合查询,按 DateCreate 排序,并且只返回分页返回的行 (guid( 的 ID,然后仅对与这些 ID 匹配的行执行后续查询,但我不确定这也是最好的方法。

我正在寻找您可能有一些经验的概念甚至伪代码描述,或者我可以为这样的事情建立的建议?无论他们依赖于.NET级别,NHibernate还是SQL。

在单个列表中对不同的项目进行分页

如果你可以摆弄数据库,为什么不实现这些类型通用的东西呢?我的想法是创建另一个名为"JournalEntry"(名称是任意的(的数据库表,这两个项目都与该表有 1:1 的连接。这些日记条目将具有对其父类型(文档或附件或其他内容(的反向引用:

JounrnalEntry {
  Int Id,
  DateTime DateCreated
  EnumEntryType (Doc / Attachment)
}

然后你可以

JournalEntries
.OrderBy(e => e.DateCreated)
.Skip(page * pageSize)
.Take(pageSize)
.Select( ... )

问题再次出现在此选择中(因为您不能在一个集合中存储不同的类型( - 您可能会在代码中添加一些常见类型或坚持使用此 JournalEntry 类型,直到您确定需要有关该项目的详细信息。

可以使用 SQL Union all 选项,如下所述,并在 C# 代码中处理分页逻辑

您可以使用 BLOW 查询并在此基础上实现分页。也许您可以在 SQL 中使用 CTE 进行分页

select id, datecreated, recType, comments, document From (
Select id, datecreated, 'DOC' as recType, '' comments, document from table_one
union all
select id, datecreated, 'COM' as recType, comments, null as dcoument from table_two
) as joined_table
order by datecreated