Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于实体类型的通用存储库应用筛选器_C#_Repository Pattern - Fatal编程技术网

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,因此我必须来回转换才能应用过滤器


任何帮助都将是非常感谢的。

也许你真的考虑为可伸缩的实体创建一些特定的存储库。

但是如果你想让这段代码正常工作,你可以使用cast

return 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);
    }
}