【发布时间】:2021-08-06 08:13:16
【问题描述】:
我为我的项目创建了一个使用 EfCore5 的 DataLayer,我将我的 DbContext 配置为处理 softDelete 记录:
//DbContext
modelBuilder.Entity<EntityName>().HasQueryFilter(p => !p.Deleted);
在我的存储库中:
// Repository Interface
public interface IRepository<T,TKey> where T : class
{
ICollection<T> FindAll(Expression<Func<T, bool>> filter = null, Func<IQueryable<T>, IIncludableQueryable<T, object>> include = null, bool hideDeleted = true);
}
// Repository
public class Repository<TEntity, TKey> : IRepository<TEntity, TKey> where TEntity : class, IEntity<TKey>
{
public ICollection<TEntity> FindAll(Expression<Func<TEntity, bool>> filter = null, Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>> include = null, bool hideDeleted = true)
{
using var db = new TEGVContext();
IQueryable<TEntity> query = db.Set<TEntity>();
if (!hideDeleted)
query = query.IgnoreQueryFilters();
if (include != null)
query = hideDeleted ? include(query) : include(query).IgnoreQueryFilters();
return filter == null
? query.ToList()
: query.Where(filter).ToList();
}
}
在控制器中:
var model = _Repo.FindById(id, include: a => a
.Include(x => x.Entity2).ThenInclude(l => l.Entity2_1)
.Include(x => x.Entity3).ThenInclude(l => l.Entity3_1), false);
在我的代码中,IgnoreQueryFilters 适用于主实体,但不适用于 Include 和 ThenInclude,include 中的被调用实体仍适用 queryFilter。
如何使我的代码能够忽略所选包含的查询过滤器?有没有更好的方法来做到这一点?
【问题讨论】:
-
您是为所有实体还是只为根实体注册了查询过滤器?
-
我在 DbContext 中为所有必需的实体注册了查询过滤器,就像我在上面添加的一样。
标签: c# entity-framework asp.net-core