Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#表达式树-组合多个方法调用_C#_Linq_.net Core_Expression Trees - Fatal编程技术网

C#表达式树-组合多个方法调用

C#表达式树-组合多个方法调用,c#,linq,.net-core,expression-trees,C#,Linq,.net Core,Expression Trees,我正在使用.Net核心和表达式树 我有一个Product类,其中LstProp属性包含由“;”分隔的值列表,比如“val1;val2;val3;”: 我想通过这个属性过滤产品,并使用表达式树包含任何条件。 我试过这个,但不管用 var value="val1;val2" var productItem = Expression.Parameter(typeof(Product), "product"); var prop = Expression.Property(productItem,

我正在使用.Net核心和表达式树

我有一个Product类,其中LstProp属性包含由“;”分隔的值列表,比如“val1;val2;val3;”:

我想通过这个属性过滤产品,并使用表达式树包含任何条件。 我试过这个,但不管用

 var value="val1;val2"
 var productItem = Expression.Parameter(typeof(Product), "product");
 var prop = Expression.Property(productItem, "LstProp");

 MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
 var values = value.ToString().Split(';');
 Expression predicate = null;
 foreach (var val in values)
 {
    var listPropExpression = Expression.Constant(val);
    var containsExpresion=Expression.Call(listPropExpression, method, property);
    predicate = predicate != null ? Expression.Or(predicate, containsExpresion) : containsExpresion;
 }
因此,我尝试为列表中的每个值组合对Contains函数的调用,但得到了关于“BinaryExpression和MethodCallExpression之间没有转换”的错误

如何将多个方法调用与表达式树结合起来?

我找到了解决方案。 我有两个问题:

  • 参数顺序不正确。 应该是
    Expression.Call(属性、方法、ListPropertExpression)Expression.Call(listPropExpression、方法、属性)

  • 通过简单铸造解决了主要问题:

    谓词=谓词!=无效的(表达式)表达式。或(谓词,containsPresion):containsPresion

  • 因此,我得到的表达式类似于
    product=>product.LstProp.Contains(“val1”)或product.LstProp.Contains(“val2”)

     var value="val1;val2"
     var productItem = Expression.Parameter(typeof(Product), "product");
     var prop = Expression.Property(productItem, "LstProp");
    
     MethodInfo method = typeof(string).GetMethod("Contains", new[] { typeof(string) });
     var values = value.ToString().Split(';');
     Expression predicate = null;
     foreach (var val in values)
     {
        var listPropExpression = Expression.Constant(val);
        var containsExpresion=Expression.Call(listPropExpression, method, property);
        predicate = predicate != null ? Expression.Or(predicate, containsExpresion) : containsExpresion;
     }