c# - 如何创建动态 Lambda 表达式

标签 c# expression lambda

我有一个问题,如何添加另一个过滤器并且我必须验证它是否已被选中?

private Expression < Func < Entity.Modelos.Flux, bool >> Filter() {
    var dateStart = dtpDateStart.Value.Date;
    var dateEnd = dtpDateEnd.Value.Date;

    Expression < Func < Entity.Modelos.Flux, bool >> expr = null;

    expr = f = > f.DatFlux >= dateStart.Date && f.DatFlux <= dateEnd.Date;

    if (txtDescription.Text != String.Empty) {
        //add filter
    }

    return expr;
}

更新:我将在此函数中使用表达式:

public virtual IQueryable < T > Filter(Expression < Func < T, bool >> expressao) {
    return DbSet.Where(expressao).AsQueryable < T > ();
}

我想做的是这个,但是有一个表达式

public List < Users > GetUsers(int ? id, string name) {
    using(DBContext ctx = new DBContext()) {
        IQueryable query = ctx.Usuarios;
        if (id.HasValue)
            query = query.Where(x = > x.ID == id);

        if (!string.IsNullOrEmpty(name))
            query = query.Where(x = > x.Name.StartsWith(name));

        return query.ToList();

    }
}

最佳答案

继承自ExpressionVisitor

public class MyVisitor: ExpressionVisitor
{
    private LambdaExpression visitor;
    public Expression Modify(Expression expression, LambdaExpression visitor)
    {
        this.visitor = visitor;
        return Visit(expression);
    }

    protected override Expression VisitBinary(BinaryExpression b)
    {
        var binary = visitor.Body as BinaryExpression;

        return Expression.MakeBinary(ExpressionType.AndAlso, b, binary, b.IsLiftedToNull, b.Method);
    }
}

您的 Filter() 方法可能如下所示

    private Expression<Func<Entity.Modelos.Flux, bool>> Filter()
    {
        var dateStart = dtpDateStart.Value.Date;
        var dateEnd = dtpDateEnd.Value.Date;
        var description = txtDescription.Text;

        Expression<Func<Entity.Modelos.Flux, bool>> expr = null;

        expr = f => f.DatFlux >= dateStart.Date && f.DatFlux <= dateEnd.Date;

        if (description != String.Empty)
        {
            //add filter
            Expression<Func<Entity.Modelos.Flux, bool>> other = f => f.Description == description;

            var modifier = new MyVisitor();
            expr = (Expression<Func<Entity.Modelos.Flux, bool>>)modifier.Modify((Expression)expr, (LambdaExpression)other);
        }

        return expr;
    }

example

请查看以下内容以获取更多信息

How to: Modify Expression Trees (C# and Visual Basic)

关于c# - 如何创建动态 Lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15506547/

相关文章:

c# - 在IIS上托管的C#中使用USB token 打开X509证书选择

java - java中的lambda表达式是否仍然可以压缩

python - 如何在 python 中返回 lambda 中拆分的第一项?

c - 优先级在 C 表达式求值中的作用

c++ - 从一组给定的数字中求解所有可能的表达式

python - 获取列表中*计数最少的元素

c# - 配置 Asp.net MVC 项目和 EntityFramework 以使用 Redis 作为缓存提供程序

c# - 什么是单|或者 & 是什么意思?

c# - Unity - 在没有物理的情况下将变换移动到特定位置(以特定速度)的最佳方法?

r - 如何允许函数在表达式()中正常执行?