【问题标题】:I can dynamically create an Expression<Func<T, bool>> predicate ,but how do i create Expression<Func<T1,T2,bool>>我可以动态创建一个 Expression<Func<T, bool>> 谓词,但是我如何创建 Expression<Func<T1,T2,bool>>
【发布时间】:2019-03-10 04:59:42
【问题描述】:

来自this link我可以动态创建一个表达式>谓词

这段代码可以动态创建s=>s.Id == 1

ParameterExpression argParam = Expression.Parameter(typeof(User), "s");
var propertyExp = Expression.Property(parameterExp, "Id");
var constExp = Expression.Constant(1);

var body = Expression.Equal(propertyExp, constExp);
var lambda = Expression.Lambda<Func<User, bool>>(body, parameterExp);

但是我如何创建表达式 > 和 表达式 >

如何像这样动态创建:(a,b)=> a.Id== 1 && b.Name == "name"

【问题讨论】:

  • 这个表达式应该做什么?请edit您的问题并添加一个示例(使用静态 lambda 或伪代码)
  • 像这样动态创建:(a,b)=> a.Id== 1 && b.Name == "name"

标签: c# linq expression-trees linq-expressions


【解决方案1】:

Func&lt;T, bool&gt;Func&lt;T1, T2, bool&gt;的区别在于第二个接受两个参数,所以你需要用Expression.Parameter创建两个参数。

下面的代码将创建一个表达式

(t1, t2) => t1.Id == 1 && t2.Name == 名称;

private static Expression<Func<T1, T2, bool>> CreateExpression<T1, T2>()
{
    var t1 = Expression.Parameter(typeof(T1), "t1");
    var t2 = Expression.Parameter(typeof(T2), "t2");

    var idProp = Expression.PropertyOrField(t1, "Id");
    var nameProp = Expression.PropertyOrField(t2, "Name");

    var body = Expression.AndAlso(
        Expression.Equal(idProp, Expression.Constant(1)),
        Expression.Equal(nameProp, Expression.Constant("name"))
    );

    var lambda = Expression.Lambda<Func<T1, T2, bool>>(body, t1, t2);
    return lambda;
}

【讨论】:

    猜你喜欢
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    相关资源
    最近更新 更多