r3plica
r3plica

Reputation: 13367

c# linq Include with parameter value

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

Answers (1)

Svyatoslav Danyliv
Svyatoslav Danyliv

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

Related Questions