2012-04-23 75 views
3

我有一个显示20个项目每页上客户端的表1万件(项目可以额外过滤)获取元素页码

我需要找到所有元素中的项目。然后,我需要获取页码,在哪里找到元素,然后选择该页面并选择它

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

但我没有得到答案。

也许还有另一种方法找到项目所在的页码而不是获取所有表格数据?

我正在使用Linq到Nhibernate,Database - 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。但是NHibernate的Linq无法做到这一点。它不能从IndexOfRowNumber这样的功能中完全没有从表中获取数据。

这个变体:

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

Not suported exception during execute query 

回答

1

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

但我使用更容易的变种。

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

Thx对于所有的回复和评论。

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

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

+0

但是,您如何知道特定物品的索引?我认为OP的要求是,如果他选择了一个任意的项目(可能通过某种过滤器),他怎么知道它将会在哪个页面上? – villecoder 2012-04-23 18:01:26

+0

@villecoder这正是这个查询所做的事情,或者至少是它打算做的。我在评论中进行了编辑,使其更加清晰。这个想法是,你需要采取任何相关的查询,并在“当前项目之前的项目出现在哪里”,然后抓取计数。 – Servy 2012-04-23 18:03:25

+0

Thx,我编辑过,请看 – Kronos 2012-04-23 19:09:21

2

你可以使用的选择索引超载(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); 

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

+0

Thx,I edited,请看 – Kronos 2012-04-23 19:09:11

+0

OP将需要t est,但我怀疑这将被转换成数据库查询。 – Servy 2012-04-23 19:11:09

+0

是的。它不能翻译成sql – Kronos 2012-04-23 19:22:19