我在表格中有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做不到。如果没有完全从表中获取数据,它就无法运行IndexOf
或RowNumber
之类的功能。
这个变种:
var indexed = myDataSource.Select( (x,n) => new { Value = x, RowNumber = n } );
Not suported exception during execute query
答案 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 。