C# 获取元素页码
我在一个表中有10000个项目,在客户端每页显示20个项目(项目可以额外过滤) 我需要在所有元素中找到项目。然后我需要得到页码,元素所在的位置,然后转到客户机上的那个页面并选择它 我先前的问题是 但我没有得到答案 也许还有另一种方法可以在不获取所有表数据的情况下找到项目所在的页码 我正在使用Linq到Nhibernate,数据库-Oracle 编辑:感谢您的回复,但这并不容易 例如: 在表db中,我有C# 获取元素页码,c#,linq,oracle,nhibernate,linq-to-nhibernate,C#,Linq,Oracle,Nhibernate,Linq To Nhibernate,我在一个表中有10000个项目,在客户端每页显示20个项目(项目可以额外过滤) 我需要在所有元素中找到项目。然后我需要得到页码,元素所在的位置,然后转到客户机上的那个页面并选择它 我先前的问题是 但我没有得到答案 也许还有另一种方法可以在不获取所有表数据的情况下找到项目所在的页码 我正在使用Linq到Nhibernate,数据库-Oracle 编辑:感谢您的回复,但这并不容易 例如: 在表db中,我有 ID NAME 1 Item1 2
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。但是林克和尼伯内特不能这么做。在没有从表中获取完整数据的情况下,它没有像IndexOf
或RowNumber
这样的功能
此变体:
var indexed = myDataSource.Select( (x,n) => new { Value = x, RowNumber = n } );
Not suported exception during execute query
首先,如果不提供任何排序,那么索引的整个概念就毫无意义。其次,要得到你想要的东西,没有简单易行的方法;它需要在某种程度上依赖于特定的查询 比如说,如果您根据created by date对数据进行排序,您可以执行以下操作:
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()
var someItem=queryToFetchIndividualItem;
var indexOfItem=table.OrderBy(item=>item.CreatedDate)
//查询中提供的任何其他筛选都会转到此处,即其他where语句
.Where(item=>item.CreateDate
如果您在“标题”上排序,则可以执行以下操作:
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()
var indexOfItem=table.OrderBy(item=>item.Title)
//查询中提供的任何其他筛选都会转到此处,即其他where语句
.Where(item=>item.Title
我想你看到这里的模式了。如果我们得到了在查询中位于感兴趣项之前的项的数量,我们就得到了索引。数据库可以优化查询,因为我们只对计数感兴趣。您可以使用select的索引重载(http://msdn.microsoft.com/en-us/library/bb534869.aspx): 这将为您提供包含行号的匿名类的枚举。从那里,您可以获得特定的记录:
var specificRecord = indexed.FirstOrDefault( x => x.Value.Key == "SomeKey" );
假设它没有返回null
(即找到了您的密钥),那么您可以通过一些简单的数学运算得到它所在的页面:
var page = (int)Math.Floor( (double)specificRecord.RowNumber / pageSize );
注意:您必须测试此方法,以查看它是否在数据库中得到处理,或者是否必须将一万条记录拉入内存;我只是在没有数据库的情况下测试了它,所以它可能不是很有效。如果这不起作用,那么我建议在数据库中创建一个存储过程,返回行和页码。我放弃了这个想法,因为我无法用Nhibernate Linq实现它 但我使用更简单的变体 我使用search asquick filter-在网格中显示所有找到的数据,而不转到第一个找到的元素页面
Thx用于所有回复和评论。但您如何知道特定项目的索引?我想OP要问的是,如果他选择了一个任意的项目(可能是通过一些过滤器),他怎么知道它将出现在哪个页面上?@villecoder这正是这个查询所做的,或者至少是它打算做的。我编辑了一条评论,使之更加清晰。我们的想法是,不管相关的查询是什么,在“项目在‘当前项目’之前的位置”上加上一个大头钉,然后抓住计数。@Kronos虽然编辑还不错,但我已经有了这样的理解。你试过使用这个解决方案吗?将此概念应用于您的查询是否存在一些特殊问题?@Servy。不,但这是个好主意。这完全取决于订单。在我的解决方案中,我可以在任何字段排序,也可以不排序sort@Kronos正如我之前所说,如果没有排序,那么就没有可以使用的有意义的索引。如果你不知道你在排序什么,那么没有通用的方法可以在不实际获取之前的每个项目的情况下找到项目的索引。OP需要测试,但我怀疑这会转化为DB查询。是的。它无法转换为sqlBummer。我想情况会是这样,但有时我对LINQ能翻译成SQL感到惊讶。无论如何,听起来您最好的选择是存储过程。。。。