使用 lambda 表达式在 Entity Framework 的实体上动态应用过滤器

Posted

技术标签:

【中文标题】使用 lambda 表达式在 Entity Framework 的实体上动态应用过滤器【英文标题】:Dynamically apply filters on Entity Framework's entity using lambda expression 【发布时间】:2016-07-14 19:34:06 【问题描述】:

我需要这样的方法,我可以在给定实体上应用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>().AsQueryable;
   //apply filters to 'query'
        query.include(/*multiple related entities*/);
        query.applyfilters(/*filters*/);

        return query.ToList();
    

我需要将需要过滤/包含的内容作为 lambda 表达式传递。

注意:我搜索了很多关于如何做到这一点,但我真的找不到任何东西。我是 C#/实体框架的这一部分的新手,我什至不知道要搜索什么关键字。

感谢您的帮助

【问题讨论】:

【参考方案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);

【讨论】:

其中一些是准确的,表达式,使用过滤器,例如,orderby 必须使用其他东西才能工作。类型需为Func&lt;IQueryable&lt;TEntity&gt;, IOrderedQueryable&lt;TEntity&gt;&gt; orderby,用途需为query = orderby(query)【参考方案2】:

像这样?

    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;

【讨论】:

以上是关于使用 lambda 表达式在 Entity Framework 的实体上动态应用过滤器的主要内容,如果未能解决你的问题,请参考以下文章

Java通过Lambda表达式根据指定字段去除重复数据(集合去重)

Java通过Lambda表达式根据指定字段去除重复数据(集合去重)

Java通过Lambda表达式根据指定字段去除重复数据(集合去重)

如何使用 Entity Framework Core 2.0 上的 lambda 语法在 LINQ 中实现 LEFT OUTER JOIN?

Entity Framework lambda 扩展方法在啥时候将查询发送到数据库?

如何使用 lambda 找到最小距离