public override DynamicMetaObject BindInvokeMember( InvokeMemberBinder binder, DynamicMetaObject[] args) { FunctionMapping mapping; if (FunctionMapping.SupportedFunctions.TryGetValue(new ExpressionFunction.FunctionCall(binder.Name, args.Count()), out mapping)) { var expression = Expression.New(CtorWithFilterExpressionAndExpressionFunction, new[] { Expression.Constant(this.Value), Expression.Constant(new ExpressionFunction(binder.Name, args.Select(x => x.Value))) }); return new DynamicMetaObject( expression, BindingRestrictions.GetTypeRestriction(Expression, LimitType)); } else { return base.BindInvokeMember(binder, args); } }
public override DynamicMetaObject BindInvokeMember( InvokeMemberBinder binder, DynamicMetaObject[] args) { if (FunctionMapping.ContainsFunction(binder.Name, args.Count())) { var expression = Expression.New(CtorWithExpressionAndExpressionFunction, new[] { Expression.Constant(this.Value), Expression.Constant(new ExpressionFunction(binder.Name, args.Select(x => x.Value))) }); return new DynamicMetaObject( expression, BindingRestrictions.GetTypeRestriction(Expression, LimitType)); } else if (string.Equals(binder.Name, ODataLiteral.Any, StringComparison.OrdinalIgnoreCase) || string.Equals(binder.Name, ODataLiteral.All, StringComparison.OrdinalIgnoreCase)) { var expression = Expression.New(CtorWithExpressionAndExpressionFunction, new[] { Expression.Constant(this.Value), Expression.Constant(new ExpressionFunction(binder.Name, args.Select(x => x.Value))) }); return new DynamicMetaObject( expression, BindingRestrictions.GetTypeRestriction(Expression, LimitType)); } else if (string.Equals(binder.Name, ODataLiteral.IsOf, StringComparison.OrdinalIgnoreCase) || string.Equals(binder.Name, ODataLiteral.Is, StringComparison.OrdinalIgnoreCase) || string.Equals(binder.Name, ODataLiteral.Cast, StringComparison.OrdinalIgnoreCase) || string.Equals(binder.Name, ODataLiteral.As, StringComparison.OrdinalIgnoreCase)) { var functionName = string.Equals(binder.Name, ODataLiteral.Is, StringComparison.OrdinalIgnoreCase) ? ODataLiteral.IsOf : string.Equals(binder.Name, ODataLiteral.As, StringComparison.OrdinalIgnoreCase) ? ODataLiteral.Cast : binder.Name; var expression = Expression.New(CtorWithExpressionAndExpressionFunction, new[] { Expression.Constant(this.Value), Expression.Constant(new ExpressionFunction( functionName, new [] { (this.Value as ODataExpression).IsNull ? null : this.Value, args.First().Value })) }); return new DynamicMetaObject( expression, BindingRestrictions.GetTypeRestriction(Expression, LimitType)); } else { return base.BindInvokeMember(binder, args); } }