private Expression MakeSubquery(Expression expression)
        {
            TableAlias               alias   = new TableAlias();
            HashSet <TableAlias>     set     = DeclaredAliasGatherer.Gather(expression);
            List <ColumnDeclaration> columns = new List <ColumnDeclaration>();

            foreach (TableAlias alias2 in set)
            {
                foreach (ColumnExpression expression2 in this.columns[alias2])
                {
                    ColumnDeclaration item = new ColumnDeclaration(columns.GetAvailableColumnName(expression2.Name), expression2, expression2.QueryType);
                    columns.Add(item);
                    ColumnExpression expression3 = new ColumnExpression(expression2.Type, expression2.QueryType, alias, expression2.Name);
                    this.map.Add(expression2, expression3);
                }
            }
            return(new SelectExpression(alias, columns, expression, null));
        }
示例#2
0
 private ColumnProjector(QueryLanguage language, Expression expression, IEnumerable <ColumnDeclaration> existingColumns, TableAlias newAlias, IEnumerable <TableAlias> existingAliases)
 {
     this.language        = language;
     this.newAlias        = newAlias;
     this.existingAliases = new HashSet <TableAlias>(existingAliases);
     this.map             = new Dictionary <ColumnExpression, ColumnExpression>();
     if (existingColumns != null)
     {
         this.columns     = new List <ColumnDeclaration>(existingColumns);
         this.columnNames = new HashSet <string>(from c in existingColumns select c.Name);
     }
     else
     {
         this.columns     = new List <ColumnDeclaration>();
         this.columnNames = new HashSet <string>();
     }
     this.candidates = Nominator.Nominate(language, expression);
 }
        private bool GetEquiJoinKeyExpressions(Expression predicate, TableAlias outerAlias, List <Expression> outerExpressions, List <Expression> innerExpressions)
        {
            if (predicate.NodeType == ExpressionType.Equal)
            {
                BinaryExpression expression       = (BinaryExpression)predicate;
                ColumnExpression columnExpression = this.GetColumnExpression(expression.Left);
                ColumnExpression expression3      = this.GetColumnExpression(expression.Right);
                if ((columnExpression != null) && (expression3 != null))
                {
                    if (columnExpression.Alias == outerAlias)
                    {
                        outerExpressions.Add(expression.Left);
                        innerExpressions.Add(expression.Right);
                        return(true);
                    }
                    if (expression3.Alias == outerAlias)
                    {
                        innerExpressions.Add(expression.Left);
                        outerExpressions.Add(expression.Right);
                        return(true);
                    }
                }
            }
            bool flag = false;

            Expression[] expressionArray = predicate.Split(new ExpressionType[] { ExpressionType.And, ExpressionType.AndAlso });
            if (expressionArray.Length > 1)
            {
                foreach (Expression expression4 in expressionArray)
                {
                    if (ReferencedAliasGatherer.Gather(expression4).Contains(outerAlias))
                    {
                        if (!this.GetEquiJoinKeyExpressions(expression4, outerAlias, outerExpressions, innerExpressions))
                        {
                            return(false);
                        }
                        flag = true;
                    }
                }
            }
            return(flag);
        }
示例#4
0
        protected virtual DeclarationCommand GetGeneratedIdCommand(MappingEntity entity, List <MemberInfo> members, Dictionary <MemberInfo, Expression> map)
        {
            List <ColumnDeclaration>   columns   = new List <ColumnDeclaration>();
            List <VariableDeclaration> variables = new List <VariableDeclaration>();
            TableAlias alias = new TableAlias();

            foreach (MemberInfo info in members)
            {
                Expression generatedIdExpression = this.translator.Linguist.Language.GetGeneratedIdExpression(info);
                string     name       = info.Name;
                QueryType  columnType = this.GetColumnType(entity, info);
                columns.Add(new ColumnDeclaration(info.Name, generatedIdExpression, columnType));
                variables.Add(new VariableDeclaration(info.Name, columnType, new ColumnExpression(generatedIdExpression.Type, columnType, alias, info.Name)));
                if (map != null)
                {
                    VariableExpression expression2 = new VariableExpression(info.Name, King.Framework.Linq.TypeHelper.GetMemberType(info), columnType);
                    map.Add(info, expression2);
                }
            }
            return(new DeclarationCommand(variables, new SelectExpression(alias, columns, null, null)));
        }
        public override Expression GetInsertExpression(MappingEntity entity, Expression instance, LambdaExpression selector)
        {
            if (this.mapping.GetTables(entity).Count < 2)
            {
                return(base.GetInsertExpression(entity, instance, selector));
            }
            List <Expression> commands = new List <Expression>();
            Dictionary <string, List <MemberInfo> > dependentGeneratedColumns = this.GetDependentGeneratedColumns(entity);
            Dictionary <MemberInfo, Expression>     map = new Dictionary <MemberInfo, Expression>();

            using (IEnumerator <MappingTable> enumerator = this.GetDependencyOrderedTables(entity).GetEnumerator())
            {
                while (enumerator.MoveNext())
                {
                    List <MemberInfo> list3;
                    Func <MappingEntity, MemberInfo, bool> fnIncludeColumn = null;
                    MappingTable    table      = enumerator.Current;
                    TableAlias      alias      = new TableAlias();
                    TableExpression expression = new TableExpression(alias, entity, this.mapping.GetTableName(table));
                    if (fnIncludeColumn == null)
                    {
                        fnIncludeColumn = (e, m) => (this.mapping.GetAlias(e, m) == this.mapping.GetAlias(table)) && !this.mapping.IsGenerated(e, m);
                    }
                    IEnumerable <ColumnAssignment> assignments = this.GetColumnAssignments(expression, instance, entity, fnIncludeColumn, map).Concat <ColumnAssignment>(this.GetRelatedColumnAssignments(expression, entity, table, map));
                    commands.Add(new InsertCommand(expression, assignments));
                    if (dependentGeneratedColumns.TryGetValue(this.mapping.GetAlias(table), out list3))
                    {
                        CommandExpression item = this.GetDependentGeneratedVariableDeclaration(entity, table, list3, instance, map);
                        commands.Add(item);
                    }
                }
            }
            if (selector != null)
            {
                commands.Add(this.GetInsertResult(entity, instance, selector, map));
            }
            return(new BlockCommand(commands));
        }
 public SelectExpression(TableAlias alias, IEnumerable <ColumnDeclaration> columns, Expression from, Expression where, IEnumerable <OrderExpression> orderBy, IEnumerable <Expression> groupBy) : this(alias, columns, from, where, orderBy, groupBy, false, null, null, false)
 {
 }
        public static SelectExpression AddRedundantSelect(this SelectExpression sel, QueryLanguage language, TableAlias newAlias)
        {
            IEnumerable <ColumnDeclaration> columns = from d in sel.Columns
                                                      let qt = (d.Expression is ColumnExpression) ? ((IEnumerable <ColumnDeclaration>)((ColumnExpression)d.Expression).QueryType) : ((IEnumerable <ColumnDeclaration>)language.TypeSystem.GetColumnType(d.Expression.Type))
                                                               select new ColumnDeclaration(d.Name, new ColumnExpression(d.Expression.Type, qt as QueryType, newAlias, d.Name), qt as QueryType);

            return(new SelectExpression(sel.Alias, columns, new SelectExpression(newAlias, sel.Columns, sel.From, sel.Where, sel.OrderBy, sel.GroupBy, sel.IsDistinct, sel.Skip, sel.Take, sel.IsReverse), null, null, null, false, null, null, false));
        }
 public SelectExpression(TableAlias alias, IEnumerable <ColumnDeclaration> columns, Expression from, Expression where) : this(alias, columns, from, where, null, null)
 {
 }
示例#9
0
        public static ProjectedColumns ProjectColumns(QueryLanguage language, Expression expression, IEnumerable <ColumnDeclaration> existingColumns, TableAlias newAlias, IEnumerable <TableAlias> existingAliases)
        {
            ColumnProjector projector = new ColumnProjector(language, expression, existingColumns, newAlias, existingAliases);

            return(new ProjectedColumns(projector.Visit(expression), projector.columns.AsReadOnly()));
        }
示例#10
0
 public static ProjectedColumns ProjectColumns(QueryLanguage language, Expression expression, IEnumerable <ColumnDeclaration> existingColumns, TableAlias newAlias, params TableAlias[] existingAliases)
 {
     return(ProjectColumns(language, expression, existingColumns, newAlias, (IEnumerable <TableAlias>)existingAliases));
 }
 public AggregateSubqueryExpression(TableAlias groupByAlias, Expression aggregateInGroupSelect, ScalarExpression aggregateAsSubquery) : base(DbExpressionType.AggregateSubquery, aggregateAsSubquery.Type)
 {
     this.aggregateInGroupSelect = aggregateInGroupSelect;
     this.groupByAlias           = groupByAlias;
     this.aggregateAsSubquery    = aggregateAsSubquery;
 }
 public TableExpression(TableAlias alias, MappingEntity entity, string name) : base(DbExpressionType.Table, typeof(void), alias)
 {
     this.entity = entity;
     this.name   = name;
 }
 internal Scope(ExecutionBuilder.Scope outer, ParameterExpression fieldReader, TableAlias alias, IEnumerable <ColumnDeclaration> columns)
 {
     this.outer       = outer;
     this.fieldReader = fieldReader;
     this.Alias       = alias;
     //this.nameMap = columns.Select(((Func<ColumnDeclaration, int, <>f__AnonymousType0<ColumnDeclaration, int>>) ((c, i) => new { c = c, i = i }))).ToDictionary(x => x.c.Name, x => x.i);
 }
示例#14
0
 protected AliasedExpression(DbExpressionType nodeType, Type type, TableAlias alias) : base(nodeType, type)
 {
     this.alias = alias;
 }
        protected virtual BindResult RebindOrderings(IEnumerable <OrderExpression> orderings, TableAlias alias, HashSet <TableAlias> existingAliases, IEnumerable <ColumnDeclaration> existingColumns)
        {
            List <ColumnDeclaration> columns = null;
            List <OrderExpression>   list2   = new List <OrderExpression>();

            foreach (OrderExpression expression in orderings)
            {
                Expression       expression2 = expression.Expression;
                ColumnExpression expression3 = expression2 as ColumnExpression;
                if ((expression3 == null) || ((existingAliases != null) && existingAliases.Contains(expression3.Alias)))
                {
                    int num = 0;
                    foreach (ColumnDeclaration declaration in existingColumns)
                    {
                        ColumnExpression expression4 = declaration.Expression as ColumnExpression;
                        if ((declaration.Expression == expression.Expression) || ((((expression3 != null) && (expression4 != null)) && (expression3.Alias == expression4.Alias)) && (expression3.Name == expression4.Name)))
                        {
                            expression2 = new ColumnExpression(expression3.Type, expression3.QueryType, alias, declaration.Name);
                            break;
                        }
                        num++;
                    }
                    if (expression2 == expression.Expression)
                    {
                        if (columns == null)
                        {
                            columns         = new List <ColumnDeclaration>(existingColumns);
                            existingColumns = columns;
                        }
                        string baseName = (expression3 != null) ? expression3.Name : ("c" + num);
                        baseName = columns.GetAvailableColumnName(baseName);
                        QueryType columnType = this.language.TypeSystem.GetColumnType(expression2.Type);
                        columns.Add(new ColumnDeclaration(baseName, expression.Expression, columnType));
                        expression2 = new ColumnExpression(expression2.Type, columnType, alias, baseName);
                    }
                    list2.Add(new OrderExpression(expression.OrderType, expression2));
                }
            }
            return(new BindResult(existingColumns, list2));
        }
示例#16
0
 public ColumnExpression(Type type, King.Framework.Linq.Data.Common.QueryType queryType, TableAlias alias, string name) : base(DbExpressionType.Column, type)
 {
     if (queryType == null)
     {
         throw new ArgumentNullException("queryType");
     }
     if (name == null)
     {
         throw new ArgumentNullException("name");
     }
     this.alias     = alias;
     this.name      = name;
     this.queryType = queryType;
 }
示例#17
0
        private bool IsColumnUsed(TableAlias alias, string name)
        {
            HashSet <string> set;

            return((this.allColumnsUsed.TryGetValue(alias, out set) && (set != null)) && set.Contains(name));
        }
示例#18
0
 private void ClearColumnsUsed(TableAlias alias)
 {
     this.allColumnsUsed[alias] = new HashSet <string>();
 }
示例#19
0
 private ColumnMapper(IEnumerable <TableAlias> oldAliases, TableAlias newAlias)
 {
     this.oldAliases = new HashSet <TableAlias>(oldAliases);
     this.newAlias   = newAlias;
 }
示例#20
0
 public static Expression Map(Expression expression, TableAlias newAlias, params TableAlias[] oldAliases)
 {
     return(Map(expression, newAlias, (IEnumerable <TableAlias>)oldAliases));
 }
示例#21
0
 public static Expression Map(Expression expression, TableAlias newAlias, IEnumerable <TableAlias> oldAliases)
 {
     return(new ColumnMapper(oldAliases, newAlias).Visit(expression));
 }