能否在实现IAsyncCrudAppService的应用服务GetAll中使用EF Core 2.0 AsNoTracking?
在ABP的IAsyncCrudAppService重写GetAll时使用AsNoTracking的方法
当然可以用上AsNoTracking特性!不过直接调用base.GetAll(input)是没法直接加的,因为底层默认的AsyncCrudAppService实现用的是带跟踪的仓库查询。这里给你两种实用的方案:
方案一:手动构建查询逻辑
自己接管查询、排序、分页的全过程,在查询源头加上AsNoTracking:
public override async Task<PagedResultDto<PracticeDto>> GetAll(PagedAndSortedResultRequestDto input) { // 从仓库获取带AsNoTracking的查询对象 var query = Repository.AsNoTracking(); // 应用ABP内置的排序逻辑 query = ApplySorting(query, input); // 统计总数+分页查询 var totalCount = await query.CountAsync(); var items = await query.PageBy(input).ToListAsync(); // 映射为DTO并返回分页结果 return new PagedResultDto<PracticeDto>( totalCount, await ObjectMapper.Map<List<PracticeDto>>(items) ); }
方案二:利用ABP仓库的GetPagedListAsync方法
这个方法更简洁,ABP已经帮你封装了排序、分页逻辑,你只需要传入带AsNoTracking的查询委托:
public override async Task<PagedResultDto<PracticeDto>> GetAll(PagedAndSortedResultRequestDto input) { var pagedList = await Repository.GetPagedListAsync( sorting: input.Sorting, maxResultCount: input.MaxResultCount, skipCount: input.SkipCount, includeDetails: false, // 根据你的需求调整是否包含关联数据 queryFunc: q => q.AsNoTracking() ); return new PagedResultDto<PracticeDto>( pagedList.TotalCount, await ObjectMapper.Map<List<PracticeDto>>(pagedList.Items) ); }
注意点
- 如果你的实体用到了ABP的内置过滤器(比如软删除、多租户),这两种方案都会自动继承这些过滤规则,不用额外处理。
- 尽量避免全局给DbContext的实体配置AsNoTracking,除非你确定这个实体全程不需要变更跟踪,否则可能影响其他写操作。
内容的提问来源于stack exchange,提问作者jazb
相关产品推荐
相关产品推荐

