C# 如何创建动态Lambda表达式

C# 如何创建动态Lambda表达式,c#,expression,lambda,C#,Expression,Lambda,我有一个问题,我如何添加另一个过滤器,我必须验证选择的过滤器 private Expression过滤器(){ var dateStart=dtpDateStart.Value.Date; var dateEnd=dtpDateEnd.Value.Date; 表达式expr=null; expr=f=>f.DatFlux>=dateStart.Date&&f.DatFlux如果这只是您需求的演示,那么您可以使用名称空间创建和修改 但是,就您的问题而言,使用EF可能更容易: bool filter

我有一个问题,我如何添加另一个过滤器,我必须验证选择的过滤器

private Expression>过滤器(){
var dateStart=dtpDateStart.Value.Date;
var dateEnd=dtpDateEnd.Value.Date;
表达式>expr=null;

expr=f=>f.DatFlux>=dateStart.Date&&f.DatFlux如果这只是您需求的演示,那么您可以使用名称空间创建和修改

但是,就您的问题而言,使用EF可能更容易:

bool filterDescription = !String.IsNullOrEmpty( txtDescription.Text );

expr = f =>
  (
    ( f.DatFlux >= dateStart.Date && f.DatFlux <= dateEnd.Date )
    &&
    ( !filterDescription || ... add filter ... )
  )
;
boolpilterdescription=!String.IsNullOrEmpty(txtDescription.Text);
expr=f=>
(

(f.DatFlux>=dateStart.Date&&f.DatFlux f.DatFlux>=dateStart.Date&&f.DatFlux f.DatFlux>=dateStart.Date&&f.DatFlux好的,下面是一个关于如何嵌入lambda语句的示例。这不是您的示例,但您可以:

Func<int, int, EventHandler> makeHandler =
    (dx, dy) => (sender, e) => {
        var btn = (Button) sender;
        btn.Top += dy;
        btn.Left += dx;
    };

btnUp.Click += makeHandler(0, -1);
btnDown.Click += makeHandler(0, 1);
btnLeft.Click += makeHandler(-1, 0);
btnRight.Click += makeHandler(1, 0);
Func生成处理程序=
(dx,dy)=>(发送方,e)=>{
变量btn=(按钮)发送器;
btn.Top+=dy;
btn.左+=dx;
};
btnUp.Click+=makeHandler(0,-1);
单击+=makeHandler(0,1);
btnLeft.Click+=makeHandler(-1,0);
btnRight.Click+=makeHandler(1,0);

棘手的事情是调用OrderByAlias
——使用
MakeGenericMethod
可能是一种方法,如上面的链接所示。

尝试以下方法:

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

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

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

    if(txtDescription.Text != String.Empty)
    {
       expr = f => expr(f) && f.Title.Equals(txtDescription.Text); // ← Your additional filter
    }

    return f => expr(f);
}
private Expression过滤器()
{
var dateStart=dtpDateStart.Value.Date;
var dateEnd=dtpDateEnd.Value.Date;
Func expr=null;
expr=f=>f.DatFlux>=dateStart.Date和&f.DatFlux expr(f)和&f.Title.Equals(txtDescription.Text);//← 您的附加过滤器
}
返回f=>expr(f);
}
继承自

公共类MyVisitor:ExpressionVisitor
{
私人LambdaExpression访问者;
公共表达式修改(表达式表达式,LambdaExpression访问者)
{
this.visitor=访客;
回访(表达);
}
受保护的重写表达式访问二进制(二进制表达式b)
{
var binary=visitor.Body作为二进制表达式;
返回表达式.MakeBinary(ExpressionType.AndAlso,b,binary,b.IsLiftedToNLL,b.Method);
}
}
您的
Filter()
方法可能如下所示

private Expression过滤器()
{
var dateStart=dtpDateStart.Value.Date;
var dateEnd=dtpDateEnd.Value.Date;
var description=txtDescription.Text;
表达式expr=null;
expr=f=>f.DatFlux>=dateStart.Date&&f.DatFlux f.Description==Description;
var修饰符=新的MyVisitor();
expr=(表达式)修饰符.Modify((表达式)expr,(LambdaExpression)other);
}
返回表达式;
}

有关更多信息,请参阅以下内容


请用您的编程语言对此进行标记。您是说您正试图用语句传回另一个表达式,还是说您正在尝试嵌入lambda表达式?我不太清楚您到底想做什么,我正在尝试嵌入lambda表达式。好的,如果是这样的话,那么我提供了一个嵌入lambda表达式的示例da语句。但我不确定您期望返回值是什么,因此我不知道您希望如何修改示例。我添加了更新我将如何使用。我不会将表达式树分类为“简单”…(另外:这个答案可能是注释,IMO)Get error“LINQ to实体中不支持LINQ表达式节点类型“Invoke”返回错误{“值不能为空。\r\n参数名称:right”}返回表达式。MakeBinary(ExpressionType.AndAlso,b,binary,b.IsLiftedToNLL,b.Method);
private Expression<Func<Entity.Modelos.Flux, bool>> Filter()
{
    var dateStart = dtpDateStart.Value.Date;
    var dateEnd = dtpDateEnd.Value.Date;

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

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

    if(txtDescription.Text != String.Empty)
    {
       expr = f => expr(f) && f.Title.Equals(txtDescription.Text); // ← Your additional filter
    }

    return f => expr(f);
}