大致的需求如下:
如果某个实体实现了ILogicDelable(逻辑删除接口)
我就在全局的查询条件中 制动加上 条件 让所有的查询数据都查询没有删除的情况
public interface ILogicDelable { bool IsDel { get; set; } }
查询语句如下:
public virtual IQueryable<TEntity> Get( Expression<Func<TEntity, bool>> filter = null, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, string includeProperties = "") { IQueryable<TEntity> query = dbSet; if (filter != null) { query = query.Where(filter); // bool judeg = typeof(TEntity).IsAssignableFrom(typeof(ILogicDelable)); 判断是否继承 // 如果 TEntity 继承 ILogicDelable 添加条件 where (p=>p.IsDel == false) } foreach (var includeProperty in includeProperties.Split (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) { query = query.Include(includeProperty); } if (orderBy != null) { return orderBy(query); } else { return query; } }
注释部分就是我要写代码的位置。
bool IsSubclassOf(Type c):判断当前类是否是类c的子类。不知道是否适用于接口 你可以试试
我会判断 但是怎么加条件?
把函数入口的Expression<Func<TEntity, bool>> filter改为
List<Expression<Func<TEntity, bool>>> filters,调用filters.Add就可以了
改了以后,你就需要
foreach(var filter in filters)
query = query.where(filter);
@沧海一杰: 这里的问题是
因为我不知道TEntity 是不是ILogicDelable的 就算 我通过反射 知道 当前实体是TEntity类型的
我也无法写 where (p=>p.IsDel == false) 因为c#并不知道 我当前类型是否有IsDel 这个属性
这里我使用的是 强制限定 多态 TEntity 的类别完成的
但是实际上可以不用这种方式