4

クライアント側でページごとに 20 個のアイテムを表示するテーブルに 10,000 個のアイテムがあります (アイテムはさらにフィルター処理できます)

すべての要素の中からアイテムを見つける必要があります。次に、要素が配置されているページ番号を取得し、クライアントでそのページに移動して選択する必要があります

私の前の質問は Get item index (rownum)です。

しかし、私はそれについて答えがありませんでした。

おそらく、すべてのテーブル データを取得せずにアイテムが配置されているページ番号を見つける別の方法がありますか?

私はLinqをNhibernate、Database - 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
4

3 に答える 3

4

まず、順序を指定しないと、インデックスの概念全体が無意味になります。次に、欲しいものを手に入れる簡単で簡単な方法はありません。特定のクエリに多少依存する必要があります。

たとえば、作成日に基づいてデータを並べ替える場合は、次のようにすることができます。

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-23T17:55:25.147 に答える
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 );

: このメソッドをテストして、データベースで処理されるかどうかを確認するか、1 万件のレコードをメモリにプルする必要があります。データベースなしでテストしただけなので、あまり効率的ではないかもしれません。これが機能しない場合は、データベースに行とページ番号を返すストアド プロシージャを作成することをお勧めします。

于 2012-04-23T18:17:58.683 に答える
1

Nhibernate Linq で実装できなかったため、このアイデアを放棄しました。

しかし、私はより簡単なバリアントを使用します。

検索をクイック フィルターとして使用します。最初に見つかった要素のページに移動せずに、見つかったすべてのデータをグリッドに表示します。

すべての返信とコメントにthx 。

于 2012-05-14T15:13:00.750 に答える