Reputation: 13367
I have created a static method that only shows items where Deleted = false
and it looks like this:
public static IQueryable<T> OnlyActive<T>(this IQueryable<T> items, bool active = true) where T: BaseModel => items.Where(m => m.Deleted != active);
I use this throughout my application:
return _databaseContext.Categories.OnlyActive()
I have since realised that that works fine, but if I use an include, then it doesn't. I have this method:
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);
}
}
As you can see, it lists a model. If there are no includes, it only lists the active ones. If there are includes, it only lists the active models, but not the includes.
I would like to write a method that checks the includes and makes sure they are not deleted also. Does anyone know how I can do this?
Upvotes: 0
Views: 407
Reputation: 27282
You can use Global Query Filters https://learn.microsoft.com/en-us/ef/core/querying/filters which will filter out deleted entities automatically.
For disabling query filter, just add IgnoreQueryFilters()
function to your query.
Upvotes: 3