在单个列表中分配不同的项目

时间:2016-02-09 22:07:28

标签: c# sql .net nhibernate

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

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

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

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

我正在寻找你可能有一些经验的概念甚至伪代码描述,或者建议我可以建立这样的东西?他们是否依赖.NET级别的东西,NHibernate或SQL。

2 个答案:

答案 0 :(得分:0)

如果您可以摆弄数据库,为什么不实现这些类型的共同点呢?我的想法是创建另一个名为' JournalEntry' (名称是任意的)两个项目都具有1:1的连接。那些JournalEntries会对其父类型(文档或附件或其他内容)进行反向引用:

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

然后你可以

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

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

答案 1 :(得分:0)

您可以使用SQL Union all选项,如下所述,并使用C#代码

处理分页逻辑

或者

你可以使用打击查询并在此基础上实现分页。可能是您可以在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