T的通用存储库过滤数据

时间:2017-07-20 09:12:22

标签: c# generics casting

我有一个通用存储库,我想在通用存储库中过滤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方法中的数据,以便只返回那些deleted == false的记录,因为这是一个常见功能,应该在存储库基础级别而不是单个存储库或业务上实现逻辑类。

问题是,一旦我将IQueryable<T> query转换为IQueryable<IAuditableEntity> query,我就无法将其转换回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<>));

1 个答案:

答案 0 :(得分:1)

如果您想为所有实体提供支持,那么您需要将T约束为AuditableEntity

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

否则,如果不是所有实体都可以这样约束,则从Repository<T>派生并约束那个:

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