/// <inheritdoc /> public Expression GenerateComparisonExpression(string navigationPropertyName, LinqExpressionListOperator expressionListOperator, ParameterExpression parameter, LambdaExpression lambda) { // Parse property name Expression member = GenerateMemberExpression(parameter, navigationPropertyName); MethodInfo methodInfo = null; switch (expressionListOperator) { case LinqExpressionListOperator.AnyLambda: // Get a reference to Enumerable.Any() method methodInfo = typeof(Enumerable).GetMethods().First(m => m.Name == "Any" && m.GetParameters().Length == 2); break; case LinqExpressionListOperator.FirstLambda: // Get a reference to Enumerable.First() method methodInfo = typeof(Enumerable).GetMethods().First(m => m.Name == "First" && m.GetParameters().Length == 2); break; default: return(null); } // Create new method and return a call to it Type type = parameter.Type.GetProperty(navigationPropertyName)?.PropertyType.GetGenericArguments()[0]; methodInfo = methodInfo.MakeGenericMethod(type); return(Expression.Call(methodInfo, member, lambda)); }
/// <inheritdoc /> public Expression GenerateComparisonExpression <T>(NewArrayExpression leftArrayExpression, LinqExpressionListOperator expressionListOperator, LambdaExpression lambda) { // Get a reference to Enumerable.Any() method MethodInfo anyMethodInfo = typeof(Enumerable).GetMethods().First(m => m.Name == "Any" && m.GetParameters().Length == 2); // Create new method and return a call to it anyMethodInfo = anyMethodInfo.MakeGenericMethod(typeof(T)); return(expressionListOperator switch { LinqExpressionListOperator.AnyLambda => Expression.Call(anyMethodInfo, leftArrayExpression, lambda), _ => null });