代码之家  ›  专栏  ›  技术社区  ›  koryakinp

基于实体类型的通用存储库应用过滤器

  •  0
  • koryakinp  · 技术社区  · 7 年前

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

    public interface ITagableEntity : IEntity
    {
        int tagtoken { get; set; }
    }
    

    我如何在中实现if条件 ApplyTagFilter 方法最好的方法是什么?我尝试的方式不起作用,看起来很丑。泛型参数T是IEntity类型,但ITagableEntity继承自IEntity,因此我必须来回转换才能应用过滤器。

    任何帮助都将不胜感激。

    2 回复  |  直到 7 年前
        1
  •  1
  •   VorobeY1326    7 年前

    也许您真的考虑为可标记的实体创建一些特定的存储库。

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

    return query.Cast<ITagableEntity>()
                    .Where(q => q.tagtoken > 10)
                    .Cast<T>();
    
        2
  •  0
  •   koryakinp    7 年前

    FCin VOR 1326 GetQueryable() protected virtual TagableRepository

    public class TagableRepository<T> : Repository<T> where T : class, ITagableEntity
    {
        protected override IQueryable<T> GetQueryable()
        {
            return base.GetQueryable().Where(q => q.tagtoken > 10);
        }
    }