示例#1
0
 public SimpleQuery LeftJoin(DynamicTable dynamicTable, out dynamic queryObjectReference)
 {
     return(OuterJoin(dynamicTable, out queryObjectReference));
 }
示例#2
0
 public SimpleQuery LeftJoin(DynamicTable dynamicTable)
 {
     return(OuterJoin(dynamicTable));
 }
示例#3
0
 public SimpleQuery Join(DynamicTable dynamicTable, out dynamic queryObjectReference)
 {
     return(Join(dynamicTable, JoinType.Inner, out queryObjectReference));
 }
示例#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));
        }
示例#5
0
 private bool NewDynamicTable(GetMemberBinder binder, out object result)
 {
     result = new DynamicTable(binder.Name, this);
     return true;
 }
示例#6
0
 internal DynamicTable SetMemberAsTable(ObjectReference reference, DynamicTable table)
 {
     if (reference == null) throw new ArgumentNullException("reference");
     _members.TryUpdate(reference.GetName(), table, reference);
     return (DynamicTable) _members[reference.GetName()];
 }