0

私はそのようなPredicateBuilderものを返す式を持っていますIQueryable(不自然な例):

var predicate = PredicateBuilder.True<CoolEntity>();
predicate = predicate.And(x => x.id > 0);
IQueryable<CoolEntity> results = CoolEntityRepository
                                    .FindBy(predicate)
                                    .OrderByDescending(x => x.id);

CoolEntity次に、これを使用して、次のようなエンティティの MVC インデックス コントローラーを使用して、特定のページの結果のみを含むページ分割されたリストを生成します。

int total = results.Count(); //Used by my controller to show the total number of results
int pageNumber = 2;
int pagesize = 20;
//Only get the entities we need for page 2, where there are 20 results per page
List<CoolEntity> resultList = results
                                .Skip(pageNumber * pageSize)
                                .Take(pageSize)
                                .ToList()

リポジトリを介して SQL データベースから返される何千ものレコードがあるため、このクエリにより、各ページに関連する結果のみが返されることが保証されます。それはうまく機能しています。

問題は、インデックスのページ分割されたページのどれを特定のエンティティに返す必要があるかを確認できるようにしたいということです。たとえば、私の CoolEntity オブジェクトの 1 つが 5 の ID を持っているとpageNumberします。そのエンティティがインデックス コントローラーに表示されるページ分割されたページをロードしたい場合、必要な値をどのように判断できますか?

具体的には、resultsID 5 のエンティティが 651 行目であることを確認するにはどうすればよいでしょうか。その結果、この番号を使用してpageNumber(つまりMath.Ceiling(651/pagesize)、同様のことを) 判断できますか? これに対するより良いアプローチはありますか?

4

1 に答える 1

0

私の同僚は、これに対する非常に高速な解決策を思いつきました。

results 
   .Select( x => x.id)
       .ToList()
       .Select((entry, index) => new { ID = entry, Rank = index + 1, PageNumer = ((index+ 1) / pagesize ) + 1 })
       .Where(x => x.id== 5)

Linqpad でテストすると、約 00:00.191 秒で ~100000 レコードの結果が見つかりました。もっと効率の良い方法があれば教えてください。

于 2012-11-29T23:57:09.497 に答える