2012-11-29 42 views
0

我有一個PredicateBuilder表達它返回一個IQueryable像這樣(人爲的例子)內找到匹配的行的索引:C#實體框架和謂詞生成器 - 一個IQueryable /分頁文檔版本

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

我然後使用此生成包含給定頁面使用MVC指數控制器CoolEntity實體,像這樣只有結果的分頁列表:

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對象的ID爲5,如果我想加載該實體將用於我的索引控制器的分頁頁面,我怎麼才能確定pageNumber的值?

具體來說,我怎麼能找出了results,ID爲5的實體是第651行,因此使用這個號碼,以確定pageNumber(即Math.Ceiling(651/pagesize)或類似的東西)?有沒有更好的方法呢?

回答

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) 

這約00找到的結果來自〜10萬次的記錄:00.191秒在Linqpad測試時。請讓我知道,如果你有一個更有效的方式做到這一點。

+0

不要認爲「ToList()」成千上萬的記錄是最佳的。 – Nirman