Search code examples
c#entity-frameworksoft-delete

How do I use soft delete in include Property of generic repository (Entity Framework)?


I have used generic repository and UnitOfWork patterns in my project and it works well.

I decided to change my project with a soft-delete concept. Everything is fine but in generic repository IncludesProperty, it returned all records consist of soft deleted records!

As you see below I don't know how do I change

query = query.Include(includeProperty)

or any line of my code to ignore in "Include" records that flagged by

IsDeleted == true

Here is my repository:

 public virtual TEntity GetFirstBy(
        Expression<Func<TEntity, bool>> filter = null,
        Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
        string includeProperties = "")
    {
        IQueryable<TEntity> query = dbSet.Where(e => e.IsDeleted == false);

        if (filter != null)
        {
            query = query.Where(filter);
        }

        foreach (var includeProperty in includeProperties.Split
            (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
        {
            query = query.Include(includeProperty); /// this line was first section that I changed to query.Include(includeProperty).Where(q => q.IsDeleted == false); but doesn't work!
        }

        if (orderBy != null)
        {
            // orderBy(query);
            query = orderBy(query);
        }

        return query.FirstOrDefault();
    }

    public IEnumerable<TEntity> GetAll()
    {
        return dbSet.AsEnumerable().Where(e => e.IsDeleted == false);
    }

    public virtual TEntity GetByID(long id)
    {
        // return dbSet.Find(id).Where(e => e.IsDeleted == false);
        return context.Set<TEntity>().Where(e => e.IsDeleted == false).SingleOrDefault(e => e.Id == id);
    }

    public virtual void Insert(TEntity entity)
    {
        entity.CreatedTime = DateTime.Now;
        entity.IsDeleted = false;
        dbSet.Add(entity);
    }

Solution

  • As @David said, I change my way of soft-delete, and use Global Query Filters in OnModelCreating.

    modelBuilder.Entity().HasQueryFilter(p => !p.IsDeleted);

    It automatically is applied to any LINQ queries involving those Entity Types, including Entity Types referenced indirectly, such as through the use of Include or direct navigation property references.

    if I decide to ignore soft-deleted for any temporary reason simplly I use IgnoreQueryFilters like bellow

    blogs = db.Blogs
    .Include(b => b.Posts)
    .IgnoreQueryFilters()
    .ToList()