首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取元素页号

获取元素页号
EN

Stack Overflow用户
提问于 2012-04-23 17:45:31
回答 3查看 816关注 0票数 4

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

我需要在所有元素中找到物品。然后,我需要获得页面编号,元素所在的位置,然后转到客户端上的页面并选择它。

我前面的问题是Get item index (rownum)

但我没有得到任何答复。

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

我正在使用Linq来实现Nhibernate,数据库- Oracle。

编辑:谢谢你的回复,但并不是那么容易

示例:

在表db中,我

代码语言:javascript
复制
 ID          NAME 
 1           Item1 
 2           
 3
 4
 5
 20
 31
 .....        ....
 5000

在客户端,我过滤了数据

代码语言:javascript
复制
query = query.Where(...).Where(...).Where(...).OrderBy(...)

并得到了结果

代码语言:javascript
复制
 ID                                         ROW_NUM_IN_QUERY
 4                                          1
 300                                        2
 2                                          3
 31                                         4
 .....        ....
 402                                        50
 800                                        51

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

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

这一变式:

代码语言:javascript
复制
var indexed = myDataSource.Select( (x,n) => new { Value = x, RowNumber = n } );

Not suported exception during execute query
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-14 15:13:00

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

但我用的是更简单的变体。

我使用search作为快速筛选器()--在网格中显示所有已找到的数据,而不转到第一个查找元素的页面。

所有回复和评论的Thx

票数 1
EN

Stack Overflow用户

发布于 2012-04-23 17:55:25

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

如果,比方说,您是根据按日期创建的数据排序的话,您可以这样做:

代码语言:javascript
复制
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()

如果您正在对“标题”进行排序,那么您可以这样做:

代码语言:javascript
复制
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()

我猜你看到这里的图案了。如果我们获得查询中的有趣项之前的项的计数,那么我们将得到索引。数据库可以优化查询,因为我们只对计数感兴趣。

票数 4
EN

Stack Overflow用户

发布于 2012-04-23 18:17:58

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

代码语言:javascript
复制
var indexed = myDataSource.Select( (x,n) => new { Value = x, RowNumber = n } );

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

代码语言:javascript
复制
var specificRecord = indexed.FirstOrDefault( x => x.Value.Key == "SomeKey" );

假设不返回null (即找到了您的键),那么您可以使用一些简单的数学方法获得它所在的页面:

代码语言:javascript
复制
var page = (int)Math.Floor( (double)specificRecord.RowNumber / pageSize );

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10285529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档