获取元素页码

时间:2012-04-23 17:45:31

标签: c# linq oracle nhibernate linq-to-nhibernate

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

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

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

但我没有得到答案。

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

我正在使用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对NHibernate做不到。如果没有完全从表中获取数据,它就无法运行IndexOfRowNumber之类的功能。

这个变种:

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

Not suported exception during execute query

3 个答案:

答案 0 :(得分:3)

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

例如,如果您按照日期创建的数据订购数据,则可以执行以下操作:

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

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

答案 1 :(得分: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 );

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

答案 2 :(得分:1)

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

但我使用更简单的变体。

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

所有回复和评论

Thx