获取元素页码

本文关键字:元素 获取 | 更新日期: 2023-09-27 18:32:04

>我在一个表中有 10,000 个项目,在客户端每页显示 20 个项目(项目可以额外过滤)

我需要在所有元素中找到项目。然后我需要获取页码,元素所在的位置,然后在客户端上转到该页面并选择它

我之前的问题是 获取项目索引(行数)。

但我没有得到答案。

可能还有另一种方法可以在不获取所有表数据的情况下找到项目所在的页码?

我正在使用Linq到Nhibernate,数据库 - Oracle。

编辑:感谢您的回复,但这并不容易

例:

在表 db 中,我有

 ID          NAME 
 1           Item1 
 2           
 3
 4
 5
 20
 31
 .....        ....
 5000

在客户端,我过滤了数据

query = query.Where(...).Where(...).Where(...).OrderBy(...)

并得到结果

 ID                                         ROW_NUM_IN_QUERY
 4                                          1
 300                                        2
 2                                          3
 31                                         4
 .....        ....
 402                                        50
 800                                        51

我无法链接到查询中的字段ID或其他字段,因为它们的顺序可能不同

我可以在简单的SQL上得到rownum。但Linq to NHibernate做不到。如果没有从表中完全获取数据,它就无法像IndexOfRowNumber那样运行。

此变体:

var indexed = myDataSource.Select( (x,n) => new { Value = x, RowNumber = n } );
Not suported exception during execute query

获取元素页码

首先,如果你不提供任何排序,那么索引的整个概念就毫无意义。 接下来,没有简单易行的方法来获得您想要的东西;它需要在某种程度上取决于特定的查询。

例如,如果您根据创建日期对数据进行排序,则可以执行以下操作:

var someItem = queryToFetchIndividualItem;
var indexOfItem = table.OrderBy(item => item.CreatedDate)
//any other filtering provided on your query goes here, i.e. other where statements
.Where(item => item.CreateDate < someItem.CreatedDate)
.Count()

如果您正在对"标题"进行排序,那么您可以执行以下操作:

var indexOfItem = table.OrderBy(item => item.Title)
//any other filtering provided on your query goes here, i.e. other where statements
.Where(item => item.Title < someItem.Title)
.Count()

我假设你在这里看到了模式。 如果我们获取查询中相关项目之前的项目计数,我们将获得索引。 数据库可以针对我们只对计数感兴趣的事实来优化查询。

您可以使用 select (http://msdn.microsoft.com/en-us/library/bb534869.aspx) 的索引重载:

var indexed = myDataSource.Select( (x,n) => new { Value = x, RowNumber = n } );

这为您提供了包含行号的匿名类的枚举。 从那里,您可以获得特定记录:

var specificRecord = indexed.FirstOrDefault( x => x.Value.Key == "SomeKey" );

假设这没有返回null(即,您的密钥已找到),然后您可以通过一些简单的数学运算来获取它所在的页面:

var page = (int)Math.Floor( (double)specificRecord.RowNumber / pageSize );

注意:您必须测试此方法以查看它是否在数据库中得到处理,或者必须将一万条记录拉入内存;我只在没有数据库的情况下测试过它,所以它可能不是很有效。 如果这不起作用,那么我建议在数据库中创建一个返回行号和页码的存储过程。

我放弃了这个想法,因为我无法用 Nhibernate Linq 实现它。

但我使用更简单的变体。

我使用搜索作为快速过滤器 - 在网格中显示所有找到的数据,而无需转到第一个找到的元素的页面。

感谢所有回复和评论。