C#分页不适用于添加到表中的新行

时间:2013-10-08 07:49:54

标签: sql sql-server entity-framework ado.net wcf-data-services

UI上有一个GRID,它将逐页信息显示为“>>”单击按钮。此按钮使用row_number()概念使用存储过程从数据库中获取数据。我从我的UI传递起始行号和结束行号,并相应地传递给存储过程,查询返回表中的值。可以考虑sql查询(200和300是样本凝视和结束行号):

with y 
as 
(
    select 
      version, 
      Id ,
      row_number() over (order by Id,version) r 
    from 
      X
)
select 
  Id,
  version 
from 
   y 
where 
   r>200 and r<300

这一切正常,直到现有Id的新版本进入表格。在这种情况下,现有行的row_number()会发生变化,并且分页函数会搞乱。

请帮忙!!!需要明天的截止日期。

1 个答案:

答案 0 :(得分:0)

假设:您只想显示每个ID的最新版本。

好的,你可以确保'X'是过滤的结果列表,因此它只包含每个ID的最新版本。

示例数据

例如,如果您有以下数据 -

ID | Version
1    1
2    1
3    1
4    1
1    2

要获取所有数据,只需从该表返回所有数据,这将返回所有5行(您现在正在执行的操作)。

X的必需结果

您真正想要的是返回以下内容 -

ID | Version
1    2
2    1
3    1
4    1

有很多方法可以获取表中的最新记录,以及数百个stackoverflow的答案。

最新记录查询的示例查询

一种方式(可以改进)是

WITH Y
AS
(
  SELECT
    t.Id,
    MAX(OriginalTable.Ver) as [Verson], 
    ROW_NUMBER() over (ORDER BY t.Id) as rowNumber
  FROM
    (SELECT DISTINCT ID FROM @OriginalTable) AS t
  INNER JOIN
    OriginalTable ON (t.ID = OriginalTable.ID)   
  GROUP BY
    t.Id
)
SELECT
  Id, [Verson]
FROM
  Y
WHERE
  rowNumber > 2 AND rowNumber < 8

诀窍是确保上面查询中的“X”排除重复的行,然后在该列表上实现分页。

替代选项

说了这么多,你可以重新设计你的表,这样你就有了一个只有ID的表(以及你需要的不受版本控制影响的任何其他细节),然后是另一个包含每个版本记录的表。但那是另一个问题!