【问题标题】:Filter generic included entities in Entity Framework 6在 Entity Framework 6 中过滤通用包含的实体
【发布时间】:2020-05-10 01:38:44
【问题描述】:

我想知道以下情况是否可能: 我创建了一个通用存储库来处理多个实体上的 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 属性在特定的存储库中。

谢谢。

【问题讨论】:

  • 你可以在 ef core 中使用 QueryFilters。
  • @Neil 很遗憾,我需要使用 EF 6。

标签: c# entity-framework generics


【解决方案1】:

假设您有两个类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);
    }

为了获得包含FooFooContainer 实体,您可以这样调用repo:

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

转到Repository 类中的Get 方法:

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

包含注释 - 此时您只知道 include 是 Func,即 FooContainer 作为参数并返回 object。即使您知道该对象具有IsDeleted 标志,它仍然只是一个object - 这意味着使用当前的Get 方法签名不可能将Where 过滤添加到包含的实体。

为此,您必须为每个包含的实体提供Expression&lt;Func&lt;T, bool&gt;&gt; includeFilter

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2013-12-25
    • 1970-01-01
    • 2014-01-13
    • 2021-01-15
    • 2016-09-13
    • 2014-09-29
    相关资源
    最近更新 更多