2016-07-14 50 views
0

我需要一個像這樣的方法,我可以在給定的實體上應用Where(x =>x. ...)Include(x => x.RelatedEntity)OrderBy(x=>x. ...)。 事情是這樣的:使用lambda表達式在實體框架的實體上動態應用過濾器

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(); 
    } 
    } 

,我需要通過我需要的東西被過濾/列爲lambda表達式。

注意: 我搜索了很多關於如何做到這一點,但我真的無法找到任何東西。我不熟悉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;