4

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

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

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

但我没有得到答案。

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

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

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

例子:

在表分贝中,我有

 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
4

3 回答 3

4

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

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

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()

我假设你看到了这里的模式。如果我们得到查询中感兴趣的项目之前的项目计数,我们就会得到索引。数据库可以优化查询,因为我们只对计数感兴趣。

于 2012-04-23T17:55:25.147 回答
2

您可以使用 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 );

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

于 2012-04-23T18:17:58.683 回答
1

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

但我使用更简单的变体。

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

感谢所有回复和评论。

于 2012-05-14T15:13:00.750 回答