public virtual LambdaExpression CompareValue(ExpressionValue left, ExpressionValue right) { if (!right.IsConst) { // TODO .. // throw } if (right.ValueInfo.ConstantValue is IList list) { var parameter = Expression.Parameter(left.SourceType); var leftExpression = left.GetLambda(parameter); var listType = typeof(List <>).MakeGenericType(leftExpression.ReturnType); var method = GetListContainsMethod(listType); var data = ConvertListItems(listType, leftExpression.ReturnType, list); if (data.Count == 0) { return(Expression.Lambda(Expression.Constant(false), parameter)); } return(Expression.Lambda( Expression.Call(Expression.Constant(data !), method, leftExpression.Body), parameter)); } else { // TODO .. // throw } throw new NotImplementedException(); }
public LambdaExpression CompareValue(ExpressionValue left, ExpressionValue right) { if (left.IsConst && !right.IsConst) { var parameter = Expression.Parameter(left.SourceType); var rightLambda = right.GetLambda(parameter); // ensure both right and left use the same parameter var leftLambda = left.GetLambda(parameter, rightLambda.ReturnType); var expression = CompareValue(leftLambda.Body, rightLambda.Body, rightLambda.ReturnType); return(Expression.Lambda(typeof(Func <,>).MakeGenericType(left.SourceType, typeof(bool)), expression, parameter)); } else { var parameter = Expression.Parameter(left.SourceType); var leftLambda = left.GetLambda(parameter); // ensure both right and left use the same parameter var rightLambda = right.GetLambda(parameter, leftLambda.ReturnType); var expression = CompareValue(leftLambda.Body, rightLambda.Body, leftLambda.ReturnType); return(Expression.Lambda(typeof(Func <,>).MakeGenericType(left.SourceType, typeof(bool)), expression, parameter)); } }