我想知道以下情况是否可行:我创建了一个通用的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属性了。
谢谢。
假设你有两个类 Foo
和 FooContainer
像这样。
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
每一个被列入的实体