2015-03-25 2 views
0

Я хочу добавить фильтр CompanyID в мой запрос всей структуры сущности. Потому что каждый пользователь должен видеть только свои записи. Я не хочу добавлять фильтр (x => x.CompanyID == cID) все методы в бизнес-уровень. Как я могу добавить автоматический фильтр для запросов.Добавить фильтр ко всем структурам сущности запроса

Мой метод GetList в DAL

 public List<TEntity> GetList(Expression<Func<TEntity, bool>> filter) 
    { 
     using (var context = new TContext()) 
     { 

      return filter == null 
       ? context.Set<TEntity>().ToList() 
       : context.Set<TEntity>().Where(filter).ToList(); 
     } 
    } 

Бизнес

public List<FinanceData> GetAll() 
     { 
      return _financeDal.GetList(filter:x=>x.CompanyID==_cID); 
     } 
+0

Это 'ASP.NET' или нет? –

+0

C# Class Library – user1924375

+0

Вы используете шаблон репозитория? –

ответ

2

Вы можете реализовать IHasCompanyId интерфейс в таких лиц. А затем реализовать хранилище шаблон как:

public class MyRepository<T> 
{ 
    public MyRepository(DbContext dbContext, int companyID) 
    { 
     if (dbContext == null) 
      throw new ArgumentNullException("Null DbContext"); 
     DbContext = dbContext; 
     DbSet = DbContext.Set<T>(); 

     CompanyID = companyID; 
    } 

    protected DbContext DbContext { get; set; } 
    protected int CompanyID { get; set; } 

    protected DbSet<T> DbSet { get; set; } 

    // Add filter here 
    public virtual IQueryable<T> GetAll() 
    { 
     if(typeof(IHasCompanyID).IsAssignableFrom(typeof(T))) 
      return DbSet.Where(x => x.CompanyID == CompanyID); 
     else 
      return DbSet; 
    } 
} 

И инициализировать _financeDal как:

var _financeDal = new MyRepository<TEntity>(dbContext, companyID); 
+1

может отсутствовать что-то вроде 'где T: IHasCompanyId' – tschmit007

+0

@ tschmit007 Спасибо за комментарий. У меня есть chekec, если объект реализует этот интерфейс или нет. –

+0

if (T is IHasCompanyId) не работает - я использую это if (typeof (IHasCompanyID) .IsAssignableFrom (typeof (TEntity))) – user1924375

0

Вы также можете расширить object context и добавить метод расширения, который возвращает IQueryable

Как

public class CustomdbContext : DbContext 
{  
    public IQueryable<TEntity> ApplyCustomerFilter<TEntity>(IQueryable<TEntity> query) where TEntity : Customer 
    { 
     return query.Where(x => x.CustomerId == customerctxId); 
    } 
} 
Смежные вопросы