2017-07-17 121 views
0

我有這個查詢組所有通過UniqueGroupId如何正確使用List <IGrouping <string,Product >>創建分頁?

result = ProductList1.Except(productlist3).Union(ProductList2).GroupBy(a => a.UniqueGroupId).OrderByDescending(a=>a.Key).ToList(); 
項目

它返回一個List<IGrouping<string,Product>>

它工作正常,每個產品都是正確分組,當它發現有不UniqueGroupId集的元素,它會返回一個包含沒有獲得適當的UniqueGroupId集合的每個產品的空關鍵字的巨集。

然後將此查詢結果提供給顯示內容的視圖。

現在,由於結果越來越大,我希望實現分頁以更好地顯示內容,其中每個組都被計爲頁面的1個元素,除了具有鍵值null的組以外,該組的元素應被視爲1元素。

我想用跳一步,但很明顯的問題是,如果我跳過(50)也都包含在主要空的元素被跳過,這不是我想實現什麼..

我該如何解決這個問題?謝謝

+0

視圖如何顯示結果?在顯示之前,視圖是否將分組的元素進行拼合然後展平? – bazz

+0

內存集合中是否涉及'ProductList'變量(例如'List ')或'IQueryable'?此外,Product' PK屬性(例如'Id'?)和類型(例如'int'?)的名稱是什麼 –

+0

@bazz,是的,視圖正在獲取分組元素的列表。 – Oper

回答

2

有點具有挑戰性,但可能。

你以這樣的方式使非空UniqueGroupId產生正常分組而空UniqueGroupId生成單個元件分組爲每個元件需要(1)基團由複合鍵,然後(2)的分組進行排序, (3)應用分頁,(4)弄平結果和(5)將其再分組UniqueGroupId

var result = ProductList1.Except(productlist3).Union(ProductList2) 
    .GroupBy(e => new { K1 = e.UniqueGroupId, K2 = e.UniqueGroupId == null ? e.Id : null }) // (1) 
    .OrderBy(g => g.Key.K1).ThenBy(g => g.Key.K2) // (2) 
    .Skip(...).Take(...) // 3 
    .SelectMany(g => g) // 4 
    .GroupBy(e => e.UniqueGroupId); // 5 
+0

嗨伊萬,我試過你的解決方案,它似乎工作!但是,我如何檢索這種方法的總頁數? – Oper

+1

您可以在變量的'Skip'之前存儲零件,例如'var query = ...;'。然後你可以使用'var pageCount = query.Count(); var result = query.Skip(...)....;' –

+0

一切正常!驚人 !謝謝! – Oper

0

你可以做一些你的小組重新排序嗎?如果是這樣,請考慮這個想法:將您的最大羣組置於收集結束並重新計算skip計數。這裏是例子:

var result = list.GroupBy(p => p.UniqueGroupId).ToList(); 

var ordered = result.OrderBy(g => g.Key != null ? 0 : 1); 

if (skip < result.Count - 1) 
    return ordered.Skip(skip).Take(take); 

return ordered.Last().Skip(skip - result.Count - 1) 
    .Take(take).GroupBy(p => p.UniqueGroupId); 
+0

如果我使用這個返回的元素將不再被分組,.SelectMany()返回一個IEnumerable ,我想維護元素分組 – Oper

+0

@Oper請參閱我的更新答案。現在它返回'IEnumerable >' –

相關問題