背景内容:
我有一个名为Project的数据库表和一个具有相同架构的名为ProjectHistory的表。我正在使用nhibernate,所以我也有一个名为Project的域对象和一个名为ProjectHistory(从Project派生)的域对象。
目标
我的目标是检索这些表中的数据,并按发生的事件顺序将它们放回原处,并让C#代码输出最近n次更改的典型审核跟踪屏幕
细节
两个表都具有以下字段和数据类型
ID-(int)-Project中的主键,注意:历史记录表中没有PK
LastUpdated(日期时间)
名称(varchar)
说明(varchar)
时间戳记(timestamp)
Projecthistory表的目标是,每当我对Project表进行更新时,ProjectHistory表都会插入带有旧记录的新行,这样我就可以获得完整的审核记录。
我通过使用以下触发器来完成此操作:
ALTER TRIGGER ProjectTrigger
ON Project
AFTER UPDATE
AS
SET NOCOUNT ON
insert into ProjectHistory
select * from deleted
我的问题是,我现在需要一些C#代码来组合审核历史记录,用户可以在其中选择最近的n个事件。
例:
这是事件的示例:
1月10日-建立专案1(史无前例)
1月11日-建立专案2
1月15日-编辑项目2(将条目添加到项目2的历史记录表中,日期为1月11日,最新更新为)
1月25日-编辑项目1(将在项目1的历史记录表中输入1月10日的日期)
因此,如您所见,如果我按历史记录表中的lastupdated字段进行降序排序,则它是将事件4的结果放在事件3的结果之前,而这是乱序的。
码
我已经尝试了以下代码来尝试将它们组合在一起,但是我将在下面解释该缺陷:
public IEnumerable<Project> GetHistory<Project, ProjectHistory>(int numberOfChanges)
{
IEnumerable<Project> current;
IEnumerable<Project> history;
current = Session.Query<Project>()
.OrderByDescending(r => r.LastUpdated)
.Take(numberOfChanges);
history = Session.Query<ProjectHistory>()
.OrderByDescending(r => r.LastUpdated).Cast<Project>();
IEnumerable<Project> all = current.Concat(history);
return all.OrderByDescending(r => r.Id).ThenByDescending(r => r.LastUpdated);
}
}
上述代码的主要问题是:
历史记录上的LastUpdated时间将反映以前项目更新的LastUpdated时间,因此我无法在历史记录表中的该字段上对desc进行排序,并假定我将获得正确的事件降序。
我可以使用timestamp字段进行排序(因为这是输入记录的实际时间),但似乎无法使用C#nhibernate在该字段上进行排序,因为该字段只是一个binary(8),因此它可以翻译到不支持IComparable的C#中的byte []。
我可以在Project表上使用lastUpdated字段,因为按lastupdate字段排序将使我获得最新的最近事件。我想到了只遍历项目表,然后对每个项目进行单独的查询以获取最新的历史项目,但是它们不支持对同一项目ID进行多次更改的情况。问题是我想不出一种以正确顺序获取数据的方法。
我的主要观点是,我想完成我认为是必须解决的相当普通的事情,因此我必须在这里错过基本模式。
我已经有可以将一个Project对象与另一个Project对象进行比较并返回字段diffs的代码(效果很好),但是我只需要一个建议,就如何确定我如何以正确的顺序从这些表中从数据库中获取此数据( (从我的查询或事后的代码中)),这样我就可以显示“最后n个更改”,然后使用逻辑显示每个更改的字段差异。
最佳答案
这是我针对一个类似项目的解决方案。创建一个视图以合并项目和项目历史表。让SQL Server做繁重的工作。
这是一个例子:
CREATE view [dbo].[VwProjectHistory] as select
OtherFieldName,
LastUpdated
from
[dbo].[Project]
union all
select
OtherFieldName,
LastUpdated
from
[dbo].[ProjectHistory]
关于c# - 如何在两个SQL Server表之间检索审核跟踪,然后以正确的顺序放回它们?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5595045/