C# 如何在通用存储库(实体框架)的include属性中使用软删除?

C# 如何在通用存储库(实体框架)的include属性中使用软删除?,c#,entity-framework,soft-delete,C#,Entity Framework,Soft Delete,我在项目中使用了通用存储库和UnitOfWork模式,效果很好 我决定用软删除的概念来改变我的项目。一切正常,但在通用存储库includeProperty中,它返回了所有由软删除记录组成的记录 正如你在下面看到的,我不知道我该如何改变 query = query.Include(includeProperty) 或在标记为的“Include”记录中忽略的任何代码行 IsDeleted == true 这是我的存储库: public virtual TEntity GetFirstBy(

我在项目中使用了通用存储库和UnitOfWork模式,效果很好

我决定用软删除的概念来改变我的项目。一切正常,但在通用存储库
includeProperty
中,它返回了所有由软删除记录组成的记录

正如你在下面看到的,我不知道我该如何改变

query = query.Include(includeProperty)
或在标记为的“Include”记录中忽略的任何代码行

IsDeleted == true
这是我的存储库:

 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);
    }
公共虚拟空间GetFirstBy(
表达式筛选器=空,
Func orderBy=null,
字符串includeProperties=“”)
{
IQueryable query=dbSet.Where(e=>e.IsDeleted==false);
if(过滤器!=null)
{
query=query.Where(过滤器);
}
foreach(includeProperty.Split中的var includeProperty
(新字符[]{',},StringSplitOptions.RemoveEmptyEntries)
{
query=query.Include(includeProperty);///这一行是我更改为query.Include(includeProperty)的第一个部分,其中(q=>q.IsDeleted==false);但不起作用!
}
if(orderBy!=null)
{
//orderBy(查询);
query=orderBy(查询);
}
返回query.FirstOrDefault();
}
公共IEnumerable GetAll()
{
返回dbSet.AsEnumerable(),其中(e=>e.IsDeleted==false);
}
公共虚拟实体GetByID(长id)
{
//返回dbSet.Find(id).Where(e=>e.IsDeleted==false);
返回context.Set().Where(e=>e.IsDeleted==false).SingleOrDefault(e=>e.Id==Id);
}
公共虚拟空白插入(TEntity实体)
{
entity.CreatedTime=DateTime.Now;
entity.IsDeleted=false;
添加(实体);
}

正如@David所说,我改变了软删除的方式,并在OnModelCreating中使用了全局查询过滤器

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

它自动应用于涉及这些实体类型的任何LINQ查询,包括间接引用的实体类型,例如通过使用Include或direct navigation属性引用

如果我出于任何临时原因决定忽略软删除,我会简单地使用像bellow这样的IgnoreQueryFilter

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

您可以使用EF核心和查询过滤器吗?