コード例 #1
0
        public static bool TryCreate(string name, SimpleReference argument, out object functionReference)
        {
            if (!KnownFunctionNames.Contains(name.ToLowerInvariant()))
            {
                functionReference = null;
                return false;
            }

            functionReference = new FunctionReference(name, argument);
            return true;
        }
コード例 #2
0
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            if (base.TryInvokeMember(binder, args, out result))
            {
                return(true);
            }

            if (_dataStrategy != null)
            {
                // Probably a table...
                var table = new DynamicTable(_name, _dataStrategy);
                if (table.TryInvokeMember(binder, args, out result))
                {
                    _dataStrategy.SetMemberAsTable(this, table);
                    return(true);
                }

                // Or it could be a schema reference...
                var schema = new DynamicSchema(_name, _dataStrategy);
                if (schema.TryInvokeMember(binder, args, out result))
                {
                    _dataStrategy.SetMemberAsSchema(this);
                    return(true);
                }
            }

            var dataStrategy = FindDataStrategyInHierarchy();

            if (dataStrategy != null)
            {
                var command = CommandFactory.GetCommandFor(binder.Name);
                if (command != null)
                {
                    var schema = dataStrategy.SetMemberAsSchema(_owner);
                    var table  = schema.GetTable(_name);
                    result = command.Execute(dataStrategy, table, binder, args);
                }
                else
                {
                    if (dataStrategy.IsExpressionFunction(binder.Name, args))
                    {
                        result = new SimpleExpression(this, new SimpleFunction(binder.Name, args), SimpleExpressionType.Function);
                    }
                    else
                    {
                        result = new FunctionReference(binder.Name, this, args);
                    }
                }
                return(true);
            }
            throw new InvalidOperationException();
        }
コード例 #3
0
        private string TryFormatAsFunctionReference(FunctionReference functionReference)
        {
            if (ReferenceEquals(functionReference, null)) return null;

            var odataName = _functionNameConverter.ConvertToODataName(functionReference.Name);
            var columnArgument = FormatColumnClause(functionReference.Argument);

            if (functionReference.AdditionalArguments.Any())
            {
                var additionalArguments = FormatAdditionalArguments(functionReference.AdditionalArguments);
                if (odataName == "substringof")
                    return string.Format("{0}({1},{2})", odataName, additionalArguments, columnArgument);
                else
                    return string.Format("{0}({1},{2})", odataName, columnArgument, additionalArguments);
            }
            else
            {
                return string.Format("{0}({1})", odataName, columnArgument);
            }
        }
コード例 #4
0
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            if (base.TryInvokeMember(binder, args, out result))
            {
                return(true);
            }

            if (_dataStrategy != null)
            {
                var table = new DynamicTable(_name, _dataStrategy);
                try
                {
                    if (table.TryInvokeMember(binder, args, out result))
                    {
                        _dataStrategy.SetMemberAsTable(this, table);
                        return(true);
                    }
                }
                catch (InvalidOperationException ex)
                {
                    if (!ex.Message.StartsWith("Method"))
                    {
                        throw;
                    }
                }

                // Or it could be a schema reference...
                var schema = new DynamicSchema(_name, _dataStrategy);
                try
                {
                    if (schema.TryInvokeMember(binder, args, out result))
                    {
                        _dataStrategy.SetMemberAsSchema(this);
                        return(true);
                    }
                }
                catch (KeyNotFoundException)
                {
                    throw new InvalidOperationException(string.Format("Method {0} not recognised", binder.Name));
                }
            }

            var dataStrategy = FindDataStrategyInHierarchy();

            if (dataStrategy != null)
            {
                var command = CommandFactory.GetCommandFor(binder.Name);
                if (command != null)
                {
                    if (!ReferenceEquals(_owner, null))
                    {
                        var schema = dataStrategy.SetMemberAsSchema(_owner);
                        var table  = schema.GetTable(_name);
                        table.TryInvokeMember(binder, args, out result);
                    }
                    else
                    {
                        throw new InvalidOperationException(string.Format("Method {0} not recognised", binder.Name));
                    }
                    //result = command.Execute(dataStrategy, table, binder, args);
                }
                else
                {
                    if (dataStrategy.IsExpressionFunction(binder.Name, args))
                    {
                        result = new SimpleExpression(this, new SimpleFunction(binder.Name, args), SimpleExpressionType.Function);
                    }
                    else
                    {
                        result = new FunctionReference(binder.Name, this, args);
                    }
                }
                return(true);
            }
            throw new InvalidOperationException(string.Format("Method {0} not recognised", binder.Name));
        }