2016-07-14 1 views
0

Мне нужно иметь такой метод, где я могу применять Where(x =>x. ...) и Include(x => x.RelatedEntity) и OrderBy(x=>x. ...) на данном объекте. Что-то вроде этого:Динамически применять фильтры для сущности фреймворка сущности, используя выражение лямбда

public List<TEntity> ApplyFilter<TEntity>(TEntity entity, 
              List<filters> filters /* List of filters: 'filters' */) 
              where TEntity : BaseEntity 
    { 
     using (var db = new MyDbContext()){ 
     var query = db.Set<TEntity>().AsQuaryable; 
    //apply filters to 'query' 
     query.include(/*multiple related entities*/); 
     query.applyfilters(/*filters*/); 

     return query.ToList(); 
    } 
    } 

И мне нужно, чтобы передать то, что мне нужно быть отфильтрованы/включены как лямбда-выражения.

ПРИМЕЧАНИЕ: Я много искал, как я могу это сделать, но я действительно ничего не смог найти. Я новичок в этой части C#/entity-framework, и я действительно даже не знал, какие ключевые слова искать.

Благодарим за помощь

ответ

1

Вы хотите использовать выражение LINQ

public List<TEntity> ApplyFilter<TEntity>(   
     Expression<Func<TEntity, bool>> filter, 
     Expression<Func<TEntity, object>> orderBy, 
     params Expression<Func<TEntity, object>>[] includes) where TEntity : BaseEntity 
    { 
     using (var db = new MyDbContext()) 
     { 
      var query = db.Set<TEntity>().AsQueryable(); 
      query = query.Where(filter); 
      query = query.OrderBy(orderBy); 

      if (includes != null) 
      { 
       foreach (var include in includes) 
       { 
        query = query.Include(include); 
       } 
      } 

      return query.ToList(); 
     } 
    } 

Для использования метода:

 ApplyFilter<TestObject>(
      x => x.Prop1 == "foo", 
      x => x.Prop2, 
      x => x.Prop3, x => x.Prop4); 
+0

Некоторые это точные выражения, используя фильтр, где, например, однако orderby должен использовать что-то еще для работы. Тип должен быть 'Func , IOrderedQueryable > orderby', а использование должно быть' query = orderby (query) '. –

0

Нравится?

var result = Repository.PurchaseProposalItem.GetDbSet(); 

     if (filters.FilterByBrand) result = result.Where(p => p.GS_Product.GS_ProductBrand.PBr_Id == filters.BrandId); 
     if (filters.FilterByFamily) result = result.Where(p => p.GS_Product.GS_ProductFamily.PFa_Id == filters.FamilyId); 
     if (filters.FilterBySubFamily) result = result.Where(p => p.GS_Product.GS_ProductSubFamily.PSu_Id == filters.SubFamilyId); 
     if (filters.FilterByProductType) result = result.Where(p => p.GS_Product.Pro_Type == filters.ProductTypeEnum); 

    return result;