2015-12-21 66 views
0

我創建了一個擴展方法分享我的分頁方法,擴展方法是:尋呼使用包括在LINQ到實體不起作用

public static CustomPaginateResult<TEntity> Paginate<TEntity>(this IPagination pagination, 
      PaginateQueryParameters parameters, IQueryable<TEntity> collection, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy) 
      where TEntity : class 
{ 
    var totalRows = collection.Count(); 
    var totalPages = (int)Math.Ceiling((double)totalRows/parameters.Rows); 

    var query = collection.Take(parameters.Rows); 

    var results = orderBy(query) 
     .Skip(parameters.Page * parameters.Rows) 
     .ToList(); 

    var result = new CustomPaginateResult<TEntity>() 
    { 
     PageSize = parameters.Rows, 
     TotalRows = totalRows, 
     TotalPages = totalPages, 
     CurrentPage = parameters.Page, 
     Results = results 
    }; 

    return result; 
} 

當我把這種方法,如果IQueryable的集合不包括任何「包含」這工作正常,但是,如果我使用任何「包含」,我只能獲取第一頁的數據,但對於下面的頁面,這不會返回數據。我得到的是生成的查詢,並且我發現在子查詢中存在頂級的clausule,我認爲這是問題!

良好的通話:

var data = _programRepository.Paginate(new PaginateQueryParameters(page, rows),_programRepository.GetAll(), order => order.OrderBy(c => c.Id)); 

壞電話:

var data = _programRepository.Paginate(new PaginateQueryParameters(page, rows),_programRepository.GetAll("CategoriaPrograma"), order => order.OrderBy(c => c.Id)); 

而且一個查詢例如對於不好的情況下:

SELECT * 
    FROM (SELECT TOP (50) * 
     FROM [dbo].[Sesion] AS [c]) AS [Limit1] 
    LEFT OUTER JOIN [dbo].[Modulo] AS [Extent2] ON [Limit1].[ModuloId] = [Extent2].[Id] 
    ORDER BY [Limit1].[Id] ASC 

任何人都可以幫我嗎?

+0

你確定parameters.Rows定義? – Hogan

+0

@GertArnold orderBy不是一個序列,它是一個函數。 – Hogan

+0

嗨@霍根,是的,參數。行被定義並且具有值 –

回答

0

我期待Take在跳過之後。在提示bij @Hogan之後編輯。

你有沒有嘗試過這樣的:

var results = orderBy(collection) 
    .Skip(parameters.Page * parameters.Rows) 
    .Take(parameters.Rows) 
    .ToList(); 
+0

嗨@MarkHasper,是的,我試試這個,但沒有解決我的問題 –

+1

這段代碼錯了應該是'orderby(collection)' – Hogan

+0

嗨@Hogan謝謝,orderBy(collection)工作! –