过滤实体框架中的通用包含实体 6

问题描述 投票:0回答:1

我想知道以下情况是否可行:我创建了一个通用的repo,用于处理对多个实体的CRUD操作。鉴于我在实体上有软删除的实现,对于某个与其他实体相关的实体,我想根据一个属性,比如说IsDeleted,来过滤包含的实体。

public abstract class Repository<T, TOrderBy> where T : BaseEntity
{
   ...
    protected IQueryable<T> Get(Expression<Func<T, bool>> filter = null,
        params Expression<Func<T, object>>[] includes)
    {
        var query = Set.AsQueryable();

        if (filter != null)
        {
            query = query.Where(x => !x.DeletedAt.HasValue).Where(filter);
        }

        if (includes != null)
        {
            foreach (var include in includes)
            {
                query = query.Include(include); // In here i would like to also filter the included entities based on the IsDeleted property
            }
        }

        return query;
     }
}

BaseEntity类是这样的,所有的类(包括我想在Include方法中过滤的类)都继承自它。

 public abstract class BaseEntity
 {
     public bool IsDeleted { Get; Set; }
 }

我知道包含的实体可以在具体实体可用的层次上进行过滤,但我想知道这是否可以在通用存储库类上实现,这样我就不需要为具体存储库中的每个查询检查IsDeleted属性了。

谢谢。

c# entity-framework generics
1个回答
0
投票

假设你有两个类 FooFooContainer 像这样。

    public class Foo : BaseEntity
    {
        public int Id { get; set; }
    }
    public class FooContainer : BaseEntity
    {
        public int Id { get; set; }
        public virtual Foo Foo { get; set; }
    }

和一个回购。

    public class FooContainerRepository : Repository<FooContainer, object>
    {
        public IQueryable<FooContainer> GetFooContainers(Expression<Func<FooContainer, bool>> filter = null,
         params Expression<Func<FooContainer, object>>[] includes) => base.Get(filter, includes);
    }

为了得到 FooContainer 的实体,具有 Foo 包括你会这样称呼repo。

            var repo = new FooContainerRepository();
            repo.GetFooContainers(null, fc => fc.Foo);

移动到 Get 方法中 Repository 类。

                foreach (var include in includes)
                {
                    query = query.Include(include); // *include coment*
                }

包括coment - 这时你才知道 include 是Func,即 FooContainer 作为一个param,并返回一个 object. 即使你知道该对象有 IsDeleted 旗帜,它仍然只是一个 object - 也就是说 Get 方法签名中不能添加 Where 过滤到包括的实体。

为了做到这一点,您必须提供 Expression<Func<T, bool>> includeFilter 每一个被列入的实体

© www.soinside.com 2019 - 2024. All rights reserved.