Пример #1
0
        public virtual void CopyFromSource(IFromClause source)
        {
            ArgumentUtility.CheckNotNull("source", source);

            FromExpression = source.FromExpression;
            ItemName       = source.ItemName;
            ItemType       = source.ItemType;
        }
Пример #2
0
 /// <summary>
 /// Validates from clause.
 /// </summary>
 // ReSharper disable once UnusedParameter.Local
 private static void ValidateFromClause(IFromClause clause)
 {
     // Only IQueryable can be used in FROM clause. IEnumerable is not supported.
     if (!typeof(IQueryable).IsAssignableFrom(clause.FromExpression.Type))
     {
         throw new NotSupportedException("FROM clause must be IQueryable: " + clause);
     }
 }
Пример #3
0
 public void CopyFromSource(IFromClause source)
 {
     if (source == null)
     {
         throw new ArgumentNullException(nameof(source));
     }
     FromExpression = source.FromExpression;
     ItemName       = source.ItemName;
     ItemType       = source.ItemType;
 }
Пример #4
0
        /// <summary>
        ///     This API supports the Entity Framework Core infrastructure and is not intended to be used
        ///     directly from your code. This API may change or be removed in future releases.
        /// </summary>
        protected override void FlattenSubQuery(
            [NotNull] SubQueryExpression subQueryExpression,
            [NotNull] IFromClause fromClause,
            [NotNull] QueryModel queryModel,
            int destinationIndex)
        {
            var subQueryModel = subQueryExpression.QueryModel;

            VisitQueryModel(subQueryModel);

            if (subQueryModel.ResultOperators
                .All(ro => ro is CastResultOperator) &&
                !subQueryModel.BodyClauses.Any(bc => bc is OrderByClause) ||
                queryModel.IsIdentityQuery() &&
                !queryModel.ResultOperators.Any())
            {
                string itemName;

                var innerMainFromClause  = subQueryExpression.QueryModel.MainFromClause;
                var isGeneratedNameOuter = fromClause.HasGeneratedItemName();

                if (innerMainFromClause.HasGeneratedItemName() &&
                    !isGeneratedNameOuter)
                {
                    itemName = fromClause.ItemName;
                }
                else
                {
                    itemName = innerMainFromClause.ItemName;
                }

                var fromClauseData
                    = new FromClauseData(
                          itemName, innerMainFromClause.ItemType, innerMainFromClause.FromExpression);

                fromClause.CopyFromSource(fromClauseData);

                UpdateQuerySourceMapping(
                    queryModel,
                    fromClause,
                    subQueryExpression.QueryModel.SelectClause.Selector);

                InsertBodyClauses(subQueryExpression.QueryModel.BodyClauses, queryModel, destinationIndex);

                foreach (var resultOperator in subQueryModel.ResultOperators.Reverse())
                {
                    queryModel.ResultOperators.Insert(0, resultOperator);
                }

                UpdateQuerySourceMapping(
                    queryModel,
                    innerMainFromClause,
                    new QuerySourceReferenceExpression(fromClause));
            }
        }
Пример #5
0
 internal FromClause(ISelectQuery selectQuery, IFromClause clone,
                     Dictionary <ICloneableElement, ICloneableElement> objectTree, Predicate <ICloneableElement> doClone)
     : base(selectQuery)
 {
     clone.Tables.ForEach(
         node =>
     {
         var value = (ITableSource)node.Value.Clone(objectTree, doClone);
         Tables.AddLast(value);
     });
 }
Пример #6
0
        /// <summary>
        /// Appends as clause.
        /// </summary>
        public StringBuilder AppendAsClause(StringBuilder builder, IFromClause clause)
        {
            Debug.Assert(builder != null);
            Debug.Assert(clause != null);

            var queryable = ExpressionWalker.GetCacheQueryable(clause);
            var tableName = ExpressionWalker.GetTableNameWithSchema(queryable);

            builder.AppendFormat("{0} as {1}", tableName, GetTableAlias(tableName));

            return builder;
        }
Пример #7
0
        /// <summary>
        /// Appends as clause.
        /// </summary>
        public StringBuilder AppendAsClause(StringBuilder builder, IFromClause clause)
        {
            Debug.Assert(builder != null);
            Debug.Assert(clause != null);

            var queryable = ExpressionWalker.GetCacheQueryable(clause);
            var tableName = ExpressionWalker.GetTableNameWithSchema(queryable);

            builder.AppendFormat("{0} as {1}", tableName, GetTableAlias(clause));

            return(builder);
        }
Пример #8
0
 /// <summary>
 /// 克隆
 /// </summary>
 /// <param name="sqlBuilder">源生成器</param>
 protected void Clone(SqlBuilderBase sqlBuilder)
 {
     EntityMatedata    = sqlBuilder.EntityMatedata;
     _parameterManager = sqlBuilder._parameterManager?.Clone();
     EntityResolver    = sqlBuilder.EntityResolver ?? new EntityResolver(EntityMatedata);
     AliasRegister     = sqlBuilder.AliasRegister?.Clone() ?? new EntityAliasRegister();
     _selectClause     = sqlBuilder._selectClause?.Clone(this, AliasRegister);
     _fromClause       = sqlBuilder._fromClause?.Clone(AliasRegister);
     _joinClause       = sqlBuilder._joinClause?.Clone(this, AliasRegister);
     _whereClause      = sqlBuilder._whereClause?.Clone(AliasRegister, _parameterManager);
     _groupByClause    = sqlBuilder._groupByClause?.Clone(AliasRegister);
     _orderByClause    = sqlBuilder._orderByClause?.Clone(AliasRegister);
     _pager            = sqlBuilder._pager;
 }
Пример #9
0
        private SelectQuery(ISelectQuery clone, Dictionary <ICloneableElement, ICloneableElement> objectTree,
                            Predicate <ICloneableElement> doClone)
        {
            objectTree.Add(clone, this);

            SourceID = Interlocked.Increment(ref SourceIDCounter);

            ICloneableElement parentClone;

            if (clone.ParentSelect != null)
            {
                ParentSelect = objectTree.TryGetValue(clone.ParentSelect, out parentClone)
                    ? (ISelectQuery)parentClone
                    : clone.ParentSelect;
            }

            EQueryType = clone.EQueryType;

            if (IsInsert)
            {
                Insert = (IInsertClause)clone.Insert.Clone(objectTree, doClone);
            }
            if (IsUpdate)
            {
                Update = (IUpdateClause)clone.Update.Clone(objectTree, doClone);
            }
            if (IsDelete)
            {
                Delete = (IDeleteClause)clone.Delete.Clone(objectTree, doClone);
            }

            Select  = new SelectClause(this, clone.Select, objectTree, doClone);
            From    = new FromClause(this, clone.From, objectTree, doClone);
            Where   = new WhereClause(this, clone.Where, objectTree, doClone);
            GroupBy = new GroupByClause(this, clone.GroupBy, objectTree, doClone);
            Having  = new WhereClause(this, clone.Having, objectTree, doClone);
            OrderBy = new OrderByClause(this, clone.OrderBy, objectTree, doClone);

            Parameters.AddRange(clone.Parameters.Select(p => (ISqlParameter)p.Clone(objectTree, doClone)));
            IsParameterDependent = clone.IsParameterDependent;

            foreach (var query in QueryVisitor.FindOnce <ISelectQuery>(this).Where(sq => sq.ParentSelect == clone))
            {
                query.ParentSelect = this;
            }
        }
Пример #10
0
 /// <summary>
 /// 复制Sql生成器
 /// </summary>
 /// <param name="sqlBuilder">源生成器</param>
 protected void Clone(SqlBuilderBase sqlBuilder)
 {
     EntityMatedata    = sqlBuilder.EntityMatedata;
     _parameterManager = sqlBuilder._parameterManager?.Clone();
     EntityResolver    = sqlBuilder.EntityResolver ?? new EntityResolver(EntityMatedata);
     AliasRegister     = sqlBuilder.AliasRegister?.Clone() ?? new EntityAliasRegister();
     _selectClause     = sqlBuilder._selectClause?.Clone(this, AliasRegister);
     _fromClause       = sqlBuilder._fromClause?.Clone(this, AliasRegister);
     _joinClause       = sqlBuilder._joinClause?.Clone(this, AliasRegister, _parameterManager);
     _whereClause      = sqlBuilder._whereClause?.Clone(this, AliasRegister, _parameterManager);
     _groupByClause    = sqlBuilder._groupByClause?.Clone(AliasRegister);
     _orderByClause    = sqlBuilder._orderByClause?.Clone(AliasRegister);
     Pager             = sqlBuilder.Pager;
     OffsetParam       = sqlBuilder.OffsetParam;
     LimitParam        = sqlBuilder.LimitParam;
     UnionItems        = sqlBuilder.UnionItems.Select(t => new BuilderItem(t.Name, t.Builder.Clone())).ToList();
     CteItems          = sqlBuilder.CteItems.Select(t => new BuilderItem(t.Name, t.Builder.Clone())).ToList();
 }
Пример #11
0
        public void Init(
            IInsertClause insert,
            IUpdateClause update,
            IDeleteClause delete,
            ISelectClause select,
            IFromClause from,
            IWhereClause where,
            IGroupByClause groupBy,
            IWhereClause having,
            IOrderByClause orderBy,
            LinkedList <IUnion> unions,
            ISelectQuery parentSelect,
            ICreateTableStatement createTable,
            bool parameterDependent,
            List <ISqlParameter> parameters)
        {
            Insert               = insert;
            Update               = update;
            Delete               = delete;
            Select               = select;
            From                 = from;
            Where                = where;
            GroupBy              = groupBy;
            Having               = having;
            OrderBy              = orderBy;
            Unions               = unions;
            ParentSelect         = parentSelect;
            CreateTable          = createTable;
            IsParameterDependent = parameterDependent;

            Parameters.AddRange(parameters);

            foreach (var col in select.Columns)
            {
                col.Parent = this;
            }

            Select.SetSqlQuery(this);
            From.SetSqlQuery(this);
            Where.SetSqlQuery(this);
            GroupBy.SetSqlQuery(this);
            Having.SetSqlQuery(this);
            OrderBy.SetSqlQuery(this);
        }
Пример #12
0
 /// <summary>
 /// Initializes a new instance of the <see cref="FullJoin"/> class.
 /// </summary>
 /// <param name="firstTable">The first table.</param>
 /// <param name="secondTable">The second table.</param>
 /// <param name="onClause">The on clause.</param>
 public FullJoin(IFromClause firstTable, IFromClause secondTable, string onClause)
     : base(firstTable, secondTable, onClause)
 {
 }
Пример #13
0
 /// <summary>
 /// 清空From子句
 /// </summary>
 public void ClearFrom()
 {
     _fromClause = CreateFromClause();
 }
Пример #14
0
        /// <summary>
        ///     This API supports the Entity Framework Core infrastructure and is not intended to be used
        ///     directly from your code. This API may change or be removed in future releases.
        /// </summary>
        protected override void FlattenSubQuery(
            [NotNull] SubQueryExpression subQueryExpression,
            [NotNull] IFromClause fromClause,
            [NotNull] QueryModel queryModel,
            int destinationIndex)
        {
            var subQueryModel = subQueryExpression.QueryModel;

            VisitQueryModel(subQueryModel);

            if ((subQueryModel.ResultOperators
                 .All(ro => ro is CastResultOperator) &&
                 !subQueryModel.BodyClauses.Any(bc => bc is OrderByClause)) ||
                (queryModel.IsIdentityQuery() &&
                 !queryModel.ResultOperators.Any()))
            {
                string itemName;

                var innerMainFromClause  = subQueryExpression.QueryModel.MainFromClause;
                var isGeneratedNameOuter = fromClause.HasGeneratedItemName();

                if (innerMainFromClause.HasGeneratedItemName() &&
                    !isGeneratedNameOuter)
                {
                    itemName = fromClause.ItemName;
                }
                else
                {
                    itemName = innerMainFromClause.ItemName;
                }

                var fromClauseData
                    = new FromClauseData(
                          itemName, innerMainFromClause.ItemType, innerMainFromClause.FromExpression);

                fromClause.CopyFromSource(fromClauseData);

                var innerSelectorMapping = new QuerySourceMapping();

                innerSelectorMapping.AddMapping(fromClause, subQueryExpression.QueryModel.SelectClause.Selector);

                queryModel.TransformExpressions(
                    ex => ReferenceReplacingExpressionVisitor
                    .ReplaceClauseReferences(ex, innerSelectorMapping, false));

                InsertBodyClauses(subQueryExpression.QueryModel.BodyClauses, queryModel, destinationIndex);

                foreach (var resultOperator in subQueryModel.ResultOperators.Reverse())
                {
                    queryModel.ResultOperators.Insert(0, resultOperator);
                }

                var innerBodyClauseMapping = new QuerySourceMapping();

                innerBodyClauseMapping
                .AddMapping(innerMainFromClause, new QuerySourceReferenceExpression(fromClause));

                queryModel.TransformExpressions(
                    ex => ReferenceReplacingExpressionVisitor
                    .ReplaceClauseReferences(ex, innerBodyClauseMapping, false));

                foreach (var queryAnnotation
                         in _queryAnnotations
                         .Where(qa => qa.QuerySource == subQueryExpression.QueryModel.MainFromClause))
                {
                    queryAnnotation.QuerySource = fromClause;
                    queryAnnotation.QueryModel  = queryModel;
                }
            }
        }
Пример #15
0
 public LocalityVisitsByDayQuery(IDatabase database, ISelectStatement select, IFromClause from)
 {
     this.database = database;
     this.select   = select;
     this.from     = from;
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="LeftOuterJoin"/> class.
 /// </summary>
 /// <param name="firstTable">The first table.</param>
 /// <param name="secondTable">The second table.</param>
 /// <param name="onClause">The on clause.</param>
 public LeftOuterJoin(IFromClause firstTable, IFromClause secondTable, string onClause)
     : base(firstTable, secondTable, onClause)
 {
 }
Пример #17
0
        protected virtual void FlattenSubQuery(SubQueryExpression subQueryExpression, IFromClause fromClause, QueryModel queryModel, int destinationIndex)
        {
            ArgumentUtility.CheckNotNull("subQueryExpression", subQueryExpression);
            ArgumentUtility.CheckNotNull("fromClause", fromClause);
            ArgumentUtility.CheckNotNull("queryModel", queryModel);

            CheckFlattenable(subQueryExpression.QueryModel);

            var innerMainFromClause = subQueryExpression.QueryModel.MainFromClause;

            fromClause.CopyFromSource(innerMainFromClause);

            var innerSelectorMapping = new QuerySourceMapping();

            innerSelectorMapping.AddMapping(fromClause, subQueryExpression.QueryModel.SelectClause.Selector);
            queryModel.TransformExpressions(ex => ReferenceReplacingExpressionVisitor.ReplaceClauseReferences(ex, innerSelectorMapping, false));

            InsertBodyClauses(subQueryExpression.QueryModel.BodyClauses, queryModel, destinationIndex);

            var innerBodyClauseMapping = new QuerySourceMapping();

            innerBodyClauseMapping.AddMapping(innerMainFromClause, new QuerySourceReferenceExpression(fromClause));
            queryModel.TransformExpressions(ex => ReferenceReplacingExpressionVisitor.ReplaceClauseReferences(ex, innerBodyClauseMapping, false));
        }
Пример #18
0
 /// <summary>
 /// Performs a FULL JOIN.
 /// </summary>
 /// <param name="table">The table.</param>
 /// <param name="onClause">The on clause.</param>
 /// <returns>The same statement for Fluentness</returns>
 public SelectStatement FullJoin(IFromClause table, string onClause)
 {
     this.TransformLastTable(lastClause => new FullJoin(lastClause, table, onClause));
     return(this);
 }
 /// <summary>
 /// Sets the alias for the specified from clause.
 /// </summary>
 /// <param name="self">The self.</param>
 /// <param name="alias">The alias.</param>
 /// <returns></returns>
 public static IFromClause As(this IFromClause self, string alias)
 {
     self.Alias = alias;
     return(self);
 }
Пример #20
0
        /// <summary>
        ///     This API supports the Entity Framework Core infrastructure and is not intended to be used
        ///     directly from your code. This API may change or be removed in future releases.
        /// </summary>
        protected override void FlattenSubQuery(
            SubQueryExpression subQueryExpression,
            IFromClause fromClause,
            QueryModel queryModel,
            int destinationIndex)
        {
            var subQueryModel = subQueryExpression.QueryModel;

            VisitQueryModel(subQueryModel);

            // no groupby and no distinct
            var emptyQueryModelWithFlattenableResultOperatorInSubquery
                = !queryModel.BodyClauses.Any() &&
                  subQueryModel.ResultOperators.All(
                      ro => ro is CastResultOperator ||
                      ro is DefaultIfEmptyResultOperator ||
                      ro is ExceptResultOperator ||
                      ro is OfTypeResultOperator ||
                      ro is ReverseResultOperator ||
                      ro is SkipResultOperator ||
                      ro is TakeResultOperator);

            // we can lift distinct however if the outer query has result operator that doesn't care about having correct element count
            var emptyQueryModelWithResultOperatorThatIgnoresElementCountAndDistinctInSubquery
                = !queryModel.BodyClauses.Any() &&
                  subQueryModel.ResultOperators.Any(ro => ro is DistinctResultOperator) &&
                  queryModel.ResultOperators.Any(
                      ro => ro is ContainsResultOperator ||
                      ro is AnyResultOperator ||
                      ro is AllResultOperator ||
                      ro is MinResultOperator ||
                      ro is MaxResultOperator);

            var subqueryInMainClauseWithoutResultOperatorsProjectingItsMainClause
                = fromClause is MainFromClause &&
                  !subQueryModel.ResultOperators.Any() &&
                  subQueryModel.SelectClause.Selector is QuerySourceReferenceExpression subquerySelectorsQsre &&
                  subquerySelectorsQsre.ReferencedQuerySource == subQueryModel.MainFromClause;

            if (subQueryModel.ResultOperators.All(ro => ro is CastResultOperator) &&
                !subQueryModel.BodyClauses.Any(bc => bc is OrderByClause) &&
                subQueryModel.SelectClause.Selector.NodeType != ExpressionType.MemberInit &&
                subQueryModel.SelectClause.Selector.NodeType != ExpressionType.New ||
                queryModel.IsIdentityQuery() &&
                !queryModel.ResultOperators.Any() ||
                emptyQueryModelWithFlattenableResultOperatorInSubquery ||
                emptyQueryModelWithResultOperatorThatIgnoresElementCountAndDistinctInSubquery ||
                subqueryInMainClauseWithoutResultOperatorsProjectingItsMainClause)
            {
                string itemName;

                var querySourceMapping  = new QuerySourceMapping();
                var clonedSubQueryModel = subQueryModel.Clone(querySourceMapping);
                UpdateQueryAnnotations(subQueryModel, querySourceMapping);

                var innerMainFromClause  = clonedSubQueryModel.MainFromClause;
                var isGeneratedNameOuter = fromClause.HasGeneratedItemName();

                if (innerMainFromClause.HasGeneratedItemName() &&
                    !isGeneratedNameOuter)
                {
                    itemName = fromClause.ItemName;
                }
                else
                {
                    itemName = innerMainFromClause.ItemName;
                }

                var fromClauseData
                    = new FromClauseData(
                          itemName, innerMainFromClause.ItemType, innerMainFromClause.FromExpression);

                fromClause.CopyFromSource(fromClauseData);

                var newExpression           = clonedSubQueryModel.SelectClause.Selector;
                var newExpressionTypeInfo   = newExpression.Type.GetTypeInfo();
                var castResultOperatorTypes = clonedSubQueryModel.ResultOperators.OfType <CastResultOperator>().Select(cre => cre.CastItemType).ToList();
                var type = castResultOperatorTypes.LastOrDefault(t => newExpressionTypeInfo.IsAssignableFrom(t.GetTypeInfo()));

                if (type != null &&
                    type != newExpression.Type)
                {
                    newExpression = Expression.Convert(newExpression, type);
                }

                UpdateQuerySourceMapping(
                    queryModel,
                    fromClause,
                    newExpression);

                InsertBodyClauses(clonedSubQueryModel.BodyClauses, queryModel, destinationIndex);

                foreach (var resultOperator in clonedSubQueryModel.ResultOperators.Where(ro => !(ro is CastResultOperator)).Reverse())
                {
                    queryModel.ResultOperators.Insert(0, resultOperator);
                }

                UpdateQuerySourceMapping(
                    queryModel,
                    innerMainFromClause,
                    new QuerySourceReferenceExpression(fromClause));
            }
        }
Пример #21
0
 /// <summary>
 /// 清空From子句
 /// </summary>
 public ISqlBuilder ClearFrom()
 {
     _fromClause = CreateFromClause();
     return(this);
 }
Пример #22
0
 public virtual void VisitFromClause(IFromClause value)
 {
     this.VisitVariableDeclaration(value.Variable);
     this.VisitExpression(value.Expression);
 }
Пример #23
0
 /// <summary>
 /// QueryBuilderConstructor
 /// </summary>
 /// <param name="factory">A factory class that creates the components of a SQL statement</param>
 public QueryBuilder(ISQLFactory factory)
 {
     this.select = factory.CreateSelect();
     this.from = factory.CreateFrom();
     this.whereClauses = factory.CreateRestrictions();
 }
 private void WriteFromClause(IFromClause value, IFormatter formatter)
 {
     formatter.WriteKeyword("from");
     formatter.Write(" ");
     this.WriteDeclaration(value.Variable.Name, formatter);
     formatter.Write(" ");
     formatter.WriteKeyword("in");
     formatter.Write(" ");
     this.WriteExpression(value.Expression, formatter);
 }
Пример #25
0
 /// <summary>
 /// Gets the cache queryable.
 /// </summary>
 public static ICacheQueryableInternal GetCacheQueryable(IFromClause fromClause)
 {
     return(GetCacheQueryable(fromClause.FromExpression));
 }
Пример #26
0
 void IFromClause.CopyFromSource(IFromClause source)
 {
     throw new NotSupportedException();
 }
Пример #27
0
 /// <summary>
 /// Gets the cache queryable.
 /// </summary>
 public static ICacheQueryableInternal GetCacheQueryable(IFromClause fromClause, bool throwWhenNotFound = true)
 {
     return(GetCacheQueryable(fromClause.FromExpression, throwWhenNotFound));
 }
Пример #28
0
 public void AddSampler(IFromClause clause, ResultId resultId)
 {
     this.samplerMappings.Add(clause, resultId);
 }
Пример #29
0
 /// <summary>
 /// Initializes a new instance of the <see cref="JoinClause&lt;T&gt;"/> class.
 /// </summary>
 /// <param name="firstTable">The first table.</param>
 /// <param name="secondTable">The second table.</param>
 /// <param name="onClause">The on clause.</param>
 protected JoinClause(IFromClause firstTable, IFromClause secondTable, string onClause)
 {
     this.FirstTable  = firstTable;
     this.SecondTable = secondTable;
     this.OnClause    = onClause;
 }
Пример #30
0
 public string GetTableAlias(IFromClause fromClause)
 {
     return GetTableAlias(GetQuerySource(fromClause.FromExpression) ?? fromClause);
 }
Пример #31
0
 void IFromClause.CopyFromSource(IFromClause source)
 {
     throw new NotSupportedException();
 }
Пример #32
0
 /// <summary>
 /// Performs a FULL JOIN.
 /// </summary>
 /// <param name="table">The table.</param>
 /// <param name="onClause">The on clause.</param>
 /// <returns>The same statement for Fluentness</returns>
 public T FullJoin(IFromClause table, string onClause)
 {
     this.TransformLastTable(lastClause => new FullJoin(lastClause, table, onClause));
     return((T)this);
 }
Пример #33
0
 /// <summary>
 /// Gets the table alias.
 /// </summary>
 public string GetTableAlias(IFromClause fromClause)
 {
     return(GetTableAlias(ExpressionWalker.GetQuerySource(fromClause.FromExpression) ?? fromClause));
 }
Пример #34
0
 public virtual void VisitFromClause(IFromClause value)
 {
     VisitVariableDeclaration(value.Variable);
     VisitExpression(value.Expression);
 }
 public LocalityVisitsByDayQuery(IDatabase database, ISelectStatement select, IFromClause from)
 {
     this.database = database;
     this.select = select;
     this.from = from;
 }
 public virtual IFromClause TransformFromClause(IFromClause value)
 {
     value.Variable = this.TransformVariableDeclaration(value.Variable);
     value.Expression = this.TransformExpression(value.Expression);
     return value;
 }