我在一个表中有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 to NHibernate无法做到这一点。如果没有从表中完全获取数据,它就无法运行像IndexOf或RowNumber这样的功能。
这一变式:
var indexed = myDataSource.Select( (x,n) => new { Value = x, RowNumber = n } );
Not suported exception during execute query发布于 2012-05-14 15:13:00
我放弃了这个想法,因为我无法用Nhibernate Linq实现它。
但我用的是更简单的变体。
我使用search作为快速筛选器()--在网格中显示所有已找到的数据,而不转到第一个查找元素的页面。
所有回复和评论的Thx。
发布于 2012-04-23 17:55:25
首先,如果不提供任何排序,那么索引的整个概念就没有意义了。接下来,没有简单、简单的方法来获得您想要的东西;它需要在某种程度上依赖于特定的查询。
如果,比方说,您是根据按日期创建的数据排序的话,您可以这样做:
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-23 18:17:58
您可以使用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 );注意事项:您必须测试此方法,以查看它是否在数据库中得到处理,或者必须将一万条记录提取到内存中;我只是在没有数据库的情况下测试过它,所以它可能不是很有效。如果这不起作用,那么我建议在数据库中创建一个返回行号和页码的存储过程。
https://stackoverflow.com/questions/10285529
复制相似问题