diff --git a/benchmark/RulesEngineBenchmark/RulesEngineBenchmark.csproj b/benchmark/RulesEngineBenchmark/RulesEngineBenchmark.csproj
index fa35dcd..07c60a3 100644
--- a/benchmark/RulesEngineBenchmark/RulesEngineBenchmark.csproj
+++ b/benchmark/RulesEngineBenchmark/RulesEngineBenchmark.csproj
@@ -7,6 +7,7 @@
+
diff --git a/src/RulesEngine/ExpressionBuilders/RuleExpressionParser.cs b/src/RulesEngine/ExpressionBuilders/RuleExpressionParser.cs
index d089c75..04bf936 100644
--- a/src/RulesEngine/ExpressionBuilders/RuleExpressionParser.cs
+++ b/src/RulesEngine/ExpressionBuilders/RuleExpressionParser.cs
@@ -36,16 +36,18 @@ namespace RulesEngine.ExpressionBuilders
}
- private Expression> WrapExpression(Expression expression, ParameterExpression[] parameters){
+ private Expression> WrapExpression(LambdaExpression expression, ParameterExpression[] parameters){
var argExp = Expression.Parameter(typeof(object[]),"args");
- var paramExps = parameters.Select((c,i) => {
- var arg = Expression.ArrayAccess(argExp,Expression.Constant(i));
- return Expression.Convert(arg,c.Type);
+ IEnumerable paramExps = parameters.Select((c, i) => {
+ var arg = Expression.ArrayAccess(argExp, Expression.Constant(i));
+ return (Expression)Expression.Assign(c, Expression.Convert(arg, c.Type));
});
- var invokeExp = Expression.Invoke(expression,paramExps);
- return Expression.Lambda>(invokeExp, argExp);
+ var blockExpSteps = paramExps.Concat(new List { expression.Body });
+ var blockExp = Expression.Block(parameters, blockExpSteps);
+ return Expression.Lambda>(blockExp, argExp);
}
+
public T Evaluate(string expression, RuleParameter[] ruleParams)
{
var func = Compile(expression, ruleParams);
diff --git a/src/RulesEngine/RulesEngine.csproj b/src/RulesEngine/RulesEngine.csproj
index 9e7e0e7..43bfe8b 100644
--- a/src/RulesEngine/RulesEngine.csproj
+++ b/src/RulesEngine/RulesEngine.csproj
@@ -2,7 +2,7 @@
netstandard2.0
- 3.0.0-preview.2
+ 3.0.0-preview.3
Copyright (c) Microsoft Corporation.
LICENSE
https://github.com/microsoft/RulesEngine
diff --git a/test/RulesEngine.UnitTest/BusinessRuleEngineTest.cs b/test/RulesEngine.UnitTest/BusinessRuleEngineTest.cs
index 75b0b89..481900a 100644
--- a/test/RulesEngine.UnitTest/BusinessRuleEngineTest.cs
+++ b/test/RulesEngine.UnitTest/BusinessRuleEngineTest.cs
@@ -62,6 +62,44 @@ namespace RulesEngine.UnitTest
Assert.Contains(result,c => c.IsSuccess);
}
+ [Theory]
+ [InlineData("rules2.json")]
+ public async Task ExecuteRule_ManyInputs_ReturnsListOfRuleResultTree(string ruleFileName)
+ {
+ var re = GetRulesEngine(ruleFileName);
+
+ dynamic input1 = GetInput1();
+ dynamic input2 = GetInput2();
+ dynamic input3 = GetInput3();
+
+ dynamic input4 = GetInput1();
+ dynamic input5 = GetInput2();
+ dynamic input6 = GetInput3();
+
+ dynamic input7 = GetInput1();
+ dynamic input8 = GetInput2();
+ dynamic input9 = GetInput3();
+
+ dynamic input10 = GetInput1();
+ dynamic input11 = GetInput2();
+ dynamic input12 = GetInput3();
+
+ dynamic input13 = GetInput1();
+ dynamic input14 = GetInput2();
+ dynamic input15 = GetInput3();
+
+
+ dynamic input16 = GetInput1();
+ dynamic input17 = GetInput2();
+ dynamic input18 = GetInput3();
+
+ List result = await re.ExecuteAllRulesAsync("inputWorkflow", input1, input2, input3,input4, input5, input6, input7, input8, input9, input10, input11, input12, input13, input14, input15, input16, input17, input18);
+ Assert.NotNull(result);
+ Assert.IsType>(result);
+ Assert.Contains(result, c => c.IsSuccess);
+ }
+
+
[Theory]
[InlineData("rules2.json")]
public async Task ExecuteRule_CalledMultipleTimes_ReturnsSameResult(string ruleFileName)