public virtual void CopyFromSource(IFromClause source) { ArgumentUtility.CheckNotNull("source", source); FromExpression = source.FromExpression; ItemName = source.ItemName; ItemType = source.ItemType; }
/// <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); } }
public void CopyFromSource(IFromClause source) { if (source == null) { throw new ArgumentNullException(nameof(source)); } FromExpression = source.FromExpression; ItemName = source.ItemName; ItemType = source.ItemType; }
/// <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)); } }
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); }); }
/// <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; }
/// <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); }
/// <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; }
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; } }
/// <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(); }
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); }
/// <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) { }
/// <summary> /// 清空From子句 /// </summary> public void ClearFrom() { _fromClause = CreateFromClause(); }
/// <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; } } }
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) { }
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)); }
/// <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); }
/// <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)); } }
/// <summary> /// 清空From子句 /// </summary> public ISqlBuilder ClearFrom() { _fromClause = CreateFromClause(); return(this); }
public virtual void VisitFromClause(IFromClause value) { this.VisitVariableDeclaration(value.Variable); this.VisitExpression(value.Expression); }
/// <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); }
/// <summary> /// Gets the cache queryable. /// </summary> public static ICacheQueryableInternal GetCacheQueryable(IFromClause fromClause) { return(GetCacheQueryable(fromClause.FromExpression)); }
void IFromClause.CopyFromSource(IFromClause source) { throw new NotSupportedException(); }
/// <summary> /// Gets the cache queryable. /// </summary> public static ICacheQueryableInternal GetCacheQueryable(IFromClause fromClause, bool throwWhenNotFound = true) { return(GetCacheQueryable(fromClause.FromExpression, throwWhenNotFound)); }
public void AddSampler(IFromClause clause, ResultId resultId) { this.samplerMappings.Add(clause, resultId); }
/// <summary> /// Initializes a new instance of the <see cref="JoinClause<T>"/> 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; }
public string GetTableAlias(IFromClause fromClause) { return GetTableAlias(GetQuerySource(fromClause.FromExpression) ?? fromClause); }
/// <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); }
/// <summary> /// Gets the table alias. /// </summary> public string GetTableAlias(IFromClause fromClause) { return(GetTableAlias(ExpressionWalker.GetQuerySource(fromClause.FromExpression) ?? fromClause)); }
public virtual void VisitFromClause(IFromClause value) { VisitVariableDeclaration(value.Variable); VisitExpression(value.Expression); }
public virtual IFromClause TransformFromClause(IFromClause value) { value.Variable = this.TransformVariableDeclaration(value.Variable); value.Expression = this.TransformExpression(value.Expression); return value; }