在 Linq to Entities 中使用包含的分页不起作用
Paging using include in Linq to Entities does not work
我创建了一个扩展方法来分享我的分页方法,扩展方法是:
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 集合 不包含任何 "include" 这工作正常,但是,如果我使用任何 "Include" 我只可以获取第一页的数据,但是,对于以下页面,这不是 return 数据。我得到了生成的查询,我看到子查询中出现了最上面的子句,我认为这就是问题所在!
好电话:
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
谁能帮帮我?
我希望 Take 在 Skip 之后。在 tip bij @Hogan 之后编辑。
你试过这个吗:
var results = orderBy(collection)
.Skip(parameters.Page * parameters.Rows)
.Take(parameters.Rows)
.ToList();
我创建了一个扩展方法来分享我的分页方法,扩展方法是:
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 集合 不包含任何 "include" 这工作正常,但是,如果我使用任何 "Include" 我只可以获取第一页的数据,但是,对于以下页面,这不是 return 数据。我得到了生成的查询,我看到子查询中出现了最上面的子句,我认为这就是问题所在!
好电话:
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
谁能帮帮我?
我希望 Take 在 Skip 之后。在 tip bij @Hogan 之后编辑。
你试过这个吗:
var results = orderBy(collection)
.Skip(parameters.Page * parameters.Rows)
.Take(parameters.Rows)
.ToList();