Pat*_*ick 1 c# entity-framework-core ef-core-2.2
我在服务层中名为“ GetBaseEntity”的所有对象上有一个通用方法。这基本上具有以下定义:
public IQueryable<TEntity> GetBaseEntity(bool includeNavigation = true, bool isAdmin = false)
{
var objBase = _context.EntityName;
if (isAdmin)
{
return objBase;
}
return objBase.Where(x => x.IsActive == true && x.IsDeleted == false);
}
Run Code Online (Sandbox Code Playgroud)
这将返回类型为TEntity的IQueryable。我想在一种方法中动态传递分页选项,因此我以这种方式实现了它:
public async Task<IEnumerable<EntityDto>> LoadResources(PagingOptions pagingOptions)
{
var baseQuery = GetBaseEntity();
if (pagingOptions != null)
{
baseQuery
.Skip(pagingOptions.Page.Value * pagingOptions.Limit.Value)
.Take(pagingOptions.Limit.Value);
}
// I can actually return from this part but I just
// set it to a variable to see how many rows the query will return
var query = await baseQuery
.ProjectTo<EntityDto>(_mappingConfiguration)
.ToListAsync();
return query;
}
Run Code Online (Sandbox Code Playgroud)
但是,查询仍然返回整个集合。我的假设是GetBaseEntity()只是设置查询,但是执行应用于LoadResourcesMethod,在这里我在LoadResources方法中应用了ToListAsync()。
我尝试了以下方法,但是没有用:
1)不链接查询(带有实体框架的IQueryable-顺序,其中,跳过和采用无效)
if (pagingOptions != null) {
baseQuery.Skip(pagingOptions.Page.Value * pagingOptions.Limit.Value);
baseQuery.Take(pagingOptions.Limit.Value);
}
Run Code Online (Sandbox Code Playgroud)
2)添加“ OrderBy”(WEB API IQueryable skip()take())
var query = await baseQuery
.OrderBy(x => x.Id)
.ProjectTo<EntityDto>(_mappingConfiguration)
.ToListAsync();
return query;
Run Code Online (Sandbox Code Playgroud)
从IQueryable来源建立动态分页有任何帮助吗?
You are not updating your query in case of pagination. Skip and Take return a new IEnumerable as a result, instead of modifying the existing one in place.
So, you should replace this line:
baseQuery
.Skip(pagingOptions.Page.Value * pagingOptions.Limit.Value)
.Take(pagingOptions.Limit.Value);
Run Code Online (Sandbox Code Playgroud)
with:
baseQuery = baseQuery
.Skip(pagingOptions.Page.Value * pagingOptions.Limit.Value)
.Take(pagingOptions.Limit.Value);
Run Code Online (Sandbox Code Playgroud)
This way, you assign the new query value to the baseQuery and then when you enumerate it, it will return the expected entities.
| 归档时间: |
|
| 查看次数: |
122 次 |
| 最近记录: |