我创建了一个静态方法,它只显示Deleted = false
所在的项目,看起来像这样:
public static IQueryable<T> OnlyActive<T>(this IQueryable<T> items, bool active = true) where T: BaseModel => items.Where(m => m.Deleted != active);
我在整个应用程序中都使用这个:
return _databaseContext.Categories.OnlyActive()
我后来意识到这很好,但如果我使用include,那就不行了。我有这样的方法:
public class GenericListHandler<TContext, T, TKey> : IRequestHandler<GenericList<T, TKey>, Attempt<IQueryable<T>>>
where TContext: DbContext
where T : BaseModel, IKey<TKey>
{
private readonly TContext _databaseContext;
public GenericListHandler(TContext databaseContext) => _databaseContext = databaseContext;
public async Task<Attempt<IQueryable<T>>> Handle(GenericList<T, TKey> request, CancellationToken cancellationToken)
{
var query = request.Take > 0 ? _databaseContext.Set<T>().OnlyActive().OrderBy(m => m.Id).Skip(request.Skip).Take(request.Take) : _databaseContext.Set<T>().OnlyActive();
var includes = request.Includes;
if (includes.Length == 0) return Attempt<IQueryable<T>>.Succeed(query);
query = includes.Aggregate(query, (current, include) => current.Include(include));
return Attempt<IQueryable<T>>.Succeed(query);
}
}
正如您所看到的,它列出了一个模型。如果没有include,则只列出活动的include。如果包含,则仅列出活动模型,而不列出包含。
我想写一个方法来检查includes,并确保它们不会被删除。有人知道我该怎么做吗?
您可以使用全局查询过滤器https://learn.microsoft.com/en-us/ef/core/querying/filters其将自动过滤掉已删除的实体。
要禁用查询过滤器,只需在查询中添加IgnoreQueryFilters()
函数即可。