加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – T的通用存储库过滤器数据

发布时间:2020-12-15 22:45:53 所属栏目:百科 来源:网络整理
导读:我有一个通用的存储库,我想过滤通用存储库中的Get数据.此方法获取数据,然后调用其他get方法并返回数据 private IQueryableT fetchData(ExpressionFuncT,bool filter){ IQueryableT query = dbSet; if (filter != null) query = query.Where(filter);} 这是Db
我有一个通用的存储库,我想过滤通用存储库中的Get数据.此方法获取数据,然后调用其他get方法并返回数据

private IQueryable<T> fetchData(Expression<Func<T,bool>> filter)
{
    IQueryable<T> query = dbSet;

    if (filter != null) query = query.Where(filter);
}

这是DbSet

private readonly IDbSet<T> dbSet;

而班级实施是

public class Repository<T> : IRepository<T> where T : class

这些是Model类的类和接口

public interface IEntity<T>
{
    T Id { get; set; }
}
public interface IAuditableEntity
{
    bool IsDeleted { get; set; }
}
public abstract class Entity<T> : IEntity<T>
{
    [Key]
    public virtual T Id { get; set; }
}
public abstract class AuditableEntity : Entity<string>,IEntity<string>,IAuditableEntity
{
    public bool IsDeleted { get; set; }

}
[Table("Contact")]
public class Contact : AuditableEntity
{
    [Required]
    [StringLength(250)]
    public string FirstName { get; set; }

    [StringLength(250)]
    public string MiddleName { get; set; }

    [Required]
    [StringLength(250)]
    public string LastName { get; set; }
}

现在我想过滤fetchData方法中的数据,以便只返回那些被删除= = false的记录,因为这是一个常见的功能,应该在存储库基础级别而不是在单个存储库或业务逻辑类上实现.

问题是,一旦我投射了IQueryable< T>查询到IQueryable< IAuditableEntity>查询我无法将其转换回IQueryable或进一步过滤数据并返回.我尝试了这些,但没有奏效

var dbSetIAuditableEntity = dbSet as IQueryable<AuditableEntity>;

if (dbSetIAuditableEntity != null)
{
    dbSetIAuditableEntity = dbSetIAuditableEntity.Where(d => d.IsDeleted == false);
    query = (IQueryable<T>)((object)dbSetIAuditableEntity);

    query = dbSet.Where(d => ((IAuditableEntity)d).IsDeleted == false);
}

实现此功能的任何建议都是通用存储库

编辑

实际上所有实体都没有实现AuditableEntity,有些实现只有IEntity< String>或IEntity< int>有些人什么都不实施.这不是很好的方法,但情况就是这样.

编辑2

这就是我通过Autofac实例化Generic repository的方法

builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>));

解决方法

如果您想为所有实体支持此功能,那么您需要将T限制为AuditableEntity:

public class Repository<T> : IRepository<T> 
    where T : AuditableEntity
{
}

否则,如果不是所有实体都可以被约束,则从存储库< T>得到.并限制一个:

public class AuditableRepository<T> : Repository<T> 
    where T : AuditableEntity
{
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读