public static IDbSelectable[] ProcessSelection(IDbObject dbObj, IDbObjectFactory factory)
        {
            var dbList = dbObj as IDbList <DbKeyValue>;

            if (dbList != null)
            {
                var keyVals = dbList;
                return(keyVals.SelectMany(kv => ProcessSelection(kv, factory)).ToArray());
            }

            var obj = dbObj as DbReference;

            if (obj != null)
            {
                var dbRef = obj;
                return(new IDbSelectable[] { factory.BuildRefColumn(dbRef, dbRef.RefColumnAlias) });
            }

            var dbBinary = dbObj as IDbBinary;

            if (dbBinary != null && (
                    dbBinary.Operator == DbOperator.Equal ||
                    dbBinary.Operator == DbOperator.NotEqual ||
                    dbBinary.Operator == DbOperator.GreaterThan ||
                    dbBinary.Operator == DbOperator.GreaterThanOrEqual ||
                    dbBinary.Operator == DbOperator.LessThan ||
                    dbBinary.Operator == DbOperator.LessThanOrEqual ||
                    dbBinary.Operator == DbOperator.Is ||
                    dbBinary.Operator == DbOperator.IsNot))
            {
                var dbTrue = factory.BuildConstant(true);
                var tuple  = Tuple.Create <IDbBinary, IDbObject>(dbBinary, dbTrue);
                return(new IDbSelectable[] { factory.BuildCondition(new [] { tuple }, factory.BuildConstant(false)) });
            }

            var keyValue = dbObj as DbKeyValue;

            if (keyValue == null)
            {
                return new[] { (IDbSelectable)dbObj }
            }
            ;

            var selectables = ProcessSelection(keyValue.Value, factory);

            foreach (var selectable in selectables)
            {
                selectable.Alias = keyValue.Key;
            }

            return(selectables);
        }
예제 #2
0
        protected override Expression VisitConstant(ConstantExpression c)
        {
            var entityInfo = _infoProvider.FindEntityInfo(c.Type);

            if (entityInfo != null)
            {
                var dbTable = _dbFactory.BuildTable(entityInfo);
                var dbRef   = _dbFactory.BuildRef(dbTable);

                var dbSelect = _dbFactory.BuildSelect(dbRef);
                dbRef.Alias = _nameGenerator.GenerateAlias(dbSelect, dbTable.TableName);

                _state.ResultStack.Push(dbSelect);
            }
            else if (!c.Type.IsAnonymouse())
            {
                var dbConstant = _dbFactory.BuildConstant(c.Value, true);
                _state.ResultStack.Push(dbConstant);
            }

            return(c);
        }
예제 #3
0
        public static IDbBinary ToBinary(this IDbObject dbElement, IDbObjectFactory dbFactory)
        {
            switch (dbElement)
            {
            case null:
                return(null);

            case IDbBinary dbBinary:
                return(dbBinary);
            }

            var one = dbFactory.BuildConstant(true);

            return(dbFactory.BuildBinary(dbElement, DbOperator.Equal, one));
        }
        public static IDbBinary ToBinary(this IDbObject dbElement, IDbObjectFactory dbFactory)
        {
            if (dbElement == null)
            {
                return(null);
            }

            var dbBinary = dbElement as IDbBinary;

            if (dbBinary != null)
            {
                return(dbBinary);
            }

            var one = dbFactory.BuildConstant(true);

            return(dbFactory.BuildBinary(dbElement, DbOperator.Equal, one));
        }
예제 #5
0
        public static IDbSelectable[] ProcessSelection(IDbObject dbObj, IDbObjectFactory factory)
        {
            switch (dbObj)
            {
            case IDbList <DbKeyValue> dbList:
                var keyVals = dbList;
                return(keyVals.SelectMany(kv => ProcessSelection(kv, factory)).ToArray());

            case DbReference obj:
                var dbRef = obj;
                return(new IDbSelectable[] { factory.BuildRefColumn(dbRef, dbRef.RefColumnAlias) });

            case IDbBinary dbBinary when(
                    dbBinary.Operator == DbOperator.Equal ||
                    dbBinary.Operator == DbOperator.NotEqual ||
                    dbBinary.Operator == DbOperator.GreaterThan ||
                    dbBinary.Operator == DbOperator.GreaterThanOrEqual ||
                    dbBinary.Operator == DbOperator.LessThan ||
                    dbBinary.Operator == DbOperator.LessThanOrEqual ||
                    dbBinary.Operator == DbOperator.Is ||
                    dbBinary.Operator == DbOperator.IsNot):
                var dbTrue = factory.BuildConstant(true);

                var tuple = Tuple.Create <IDbBinary, IDbObject>(dbBinary, dbTrue);
                return(new IDbSelectable[] { factory.BuildCondition(new [] { tuple }, factory.BuildConstant(false)) });
            }

            if (!(dbObj is DbKeyValue keyValue))
            {
                return new[] { (IDbSelectable)dbObj }
            }
            ;

            var selectables = ProcessSelection(keyValue.Value, factory);

            foreach (var selectable in selectables)
            {
                selectable.Alias = keyValue.Key;
            }

            return(selectables);
        }