C# 基于实体类型的通用存储库应用筛选器
我有一个通用存储库:C# 基于实体类型的通用存储库应用筛选器,c#,repository-pattern,C#,Repository Pattern,我有一个通用存储库: public class Repository<T> : IRepository<T> where T : class, IEntity { public List<T> GetAllList(Expression<Func<T, bool>> filter) { return GetQueryable().Where(filter).ToList(); } p
public class Repository<T> : IRepository<T> where T : class, IEntity
{
public List<T> GetAllList(Expression<Func<T, bool>> filter)
{
return GetQueryable().Where(filter).ToList();
}
private IQueryable<T> GetQueryable()
{
IQueryable<T> query = Context.Set<T>().AsQueryable();
query = ApplyTagFilter(query)
return query;
}
private IQueryable<T> ApplyTagFilter(IQueryable<T> query)
{
//if T is ITagableEntity filter by token somehow
if(typeof(ITagableEntity).IsAssignableFrom(typeof(T)))
{
//does not work and looks ugly :(
return (query as IQueryable<ITagableEntity>)
.Where(q => q.tagtoken > 10) as IQueryable<T>;
}
else
{
return query;
}
}
}
如何在ApplyTagFilter方法中实现if条件?最好的方法是什么?我尝试的方式不起作用,看起来很难看。泛型参数T的类型为IEntity,但ItagableEntity继承自IEntity,因此我必须来回转换才能应用过滤器
任何帮助都将是非常感谢的。
也许你真的考虑为可伸缩的实体创建一些特定的存储库。
但是如果你想让这段代码正常工作,你可以使用castreturn query.Cast<ITagableEntity>()
.Where(q => q.tagtoken > 10)
.Cast<T>();
我通过实施FCin和VOR1326提出的想法解决了这个问题。我将GetQueryable标记为受保护的虚拟,并在TagableRepository类中重写它
那么更具体的存储库呢:公共类TagableEntityRepository:IRepository,其中T:ITagableEntity。特定于实体的方法越多,存储库就越多,但它们都是从主方法派生出来的。@FCin并非我的所有实体都是ITagableEntity。只有一部分。是的,这就是为什么您只会将此存储库用于ITagableEntity。对于实体,您将使用存储库。您将有两个存储库。@FCin,谢谢您的想法。我会试试。将来你可能想处理IClonableEntity或ISavableEntity,这会使你的存储库变得巨大,所以将它划分为许多特定的存储库可能会有所帮助。顺便说一句,如果您使用的是实体框架,您可能希望转储存储库并切换到编写服务。
return query.Cast<ITagableEntity>()
.Where(q => q.tagtoken > 10)
.Cast<T>();
public class TagableRepository<T> : Repository<T> where T : class, ITagableEntity
{
protected override IQueryable<T> GetQueryable()
{
return base.GetQueryable().Where(q => q.tagtoken > 10);
}
}