Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 针对SQL Server在nHibernate中分页:是否需要排序顺序?_Sql Server_Nhibernate - Fatal编程技术网

Sql server 针对SQL Server在nHibernate中分页:是否需要排序顺序?

Sql server 针对SQL Server在nHibernate中分页:是否需要排序顺序?,sql-server,nhibernate,Sql Server,Nhibernate,我们发现,在我们的.NET4.51/nHibernate/sql2008应用程序中,当我们执行一个大型查询时,我们会获得所有数据,但当我们针对某些大型结果集进行分页时,会丢失行 (在我们的测试中,当我们对1000行或更多行的结果集进行每页200页的测试时,我们看到了问题。) 我们尝试了使用SQL2000和SQL2005 nHibernate方言的应用程序,没有发现行为上的差异。(在SQL2005中,查询语法确实演变为使用较新的结构,但在使用SQL2005方言时,相同的数据丢失。) nHibern

我们发现,在我们的.NET4.51/nHibernate/sql2008应用程序中,当我们执行一个大型查询时,我们会获得所有数据,但当我们针对某些大型结果集进行分页时,会丢失行

(在我们的测试中,当我们对1000行或更多行的结果集进行每页200页的测试时,我们看到了问题。)

我们尝试了使用SQL2000和SQL2005 nHibernate方言的应用程序,没有发现行为上的差异。(在SQL2005中,查询语法确实演变为使用较新的结构,但在使用SQL2005方言时,相同的数据丢失。)

nHibernate生成SQL查询。 我们正在做寻呼。 如果按100分页,nHibernate生成后续SQL查询的方式是:

  • 前100名//给我们第一个100名
  • TOP 200//为我们提供了该街区的第二个100
上述操作在nHibernate级别没有ORDER BY/排序,最终导致某些行永远不会出现在nHibernate上。我们推测这是由于SQL的任意排序造成的,因此行在页面中“移动”(从而对应用程序代码“隐藏”)

如果我们将nHibnerate查询作为一个单一的快照(返回所有行),我们将看到所有的数据。(以下查询由nhibernate生成。)

添加ORDERBY子句(又名nHibernate排序)会有帮助吗

选择前33名
...  
从…起
salesOrder此u2;左外部联接[Item]Item2 2;在此2;.ItemId=Item2 2;.ItemId上
其中,这个u.AccountId=@p0
而这个uu.ModifiedAt>@p1
这个函数修改了1000行并被分页


Order By子句(nHibernate级别的排序)是解决方案,还是我们需要采取其他路径?

答案是:
Order By
是必需的


注意,在nHibernate查询中使用排序顺序(在索引字段上获得最佳结果!)。

@RadimKöhler我们看到分页工作,几乎在所有情况下。。。除非它没有。该问题是由大型数据库上的大型数据集引起的。这里的问题是:如何使它100%可靠?如果您正在分页,您当然应该对结果进行排序。否则,SQL server的行为是未定义的——它可以以任何顺序返回行。@RadimKöhler OPrevised@AndrewWhitaker操作revised@Jonesome:我很确定答案是“是”,如果添加一个
OrderBy
子句,您将看到所有数据。
SELECT top 33 
 ... <field list> 
FROM 
  salesOrder this_ left outer join [Item] Item2_ on this_.ItemId=Item2_.ItemId 
WHERE this_.AccountId = @p0 
and this_.ModifiedAt > @p1 
and this_.ModifiedAt <= @p2