public override IQueryState Visit(JoinQueryExpression exp) { ResultElement resultElement = new ResultElement(); IQueryState qs = QueryExpressionVisitor.VisitQueryExpression(exp.PrevExpression); FromQueryResult fromQueryResult = qs.ToFromQueryResult(); DbFromTableExpression fromTable = fromQueryResult.FromTable; resultElement.FromTable = fromTable; List <IMappingObjectExpression> moeList = new List <IMappingObjectExpression>(); moeList.Add(fromQueryResult.MappingObjectExpression); foreach (JoiningQueryInfo joiningQueryInfo in exp.JoinedQueries) { JoinQueryResult joinQueryResult = JoinQueryExpressionVisitor.VisitQueryExpression(joiningQueryInfo.Query.QueryExpression, resultElement, joiningQueryInfo.JoinType, joiningQueryInfo.Condition, moeList); var nullChecking = DbExpression.CaseWhen(new DbCaseWhenExpression.WhenThenExpressionPair(joinQueryResult.JoinTable.Condition, DbConstantExpression.One), DbConstantExpression.Null, DbConstantExpression.One.Type); if (joiningQueryInfo.JoinType == DbJoinType.LeftJoin) { joinQueryResult.MappingObjectExpression.SetNullChecking(nullChecking); } else if (joiningQueryInfo.JoinType == DbJoinType.RightJoin) { foreach (IMappingObjectExpression item in moeList) { item.SetNullChecking(nullChecking); } } else if (joiningQueryInfo.JoinType == DbJoinType.FullJoin) { joinQueryResult.MappingObjectExpression.SetNullChecking(nullChecking); foreach (IMappingObjectExpression item in moeList) { item.SetNullChecking(nullChecking); } } fromTable.JoinTables.Add(joinQueryResult.JoinTable); moeList.Add(joinQueryResult.MappingObjectExpression); } IMappingObjectExpression moe = SelectorExpressionVisitor.VisitSelectExpression(exp.Selector, moeList); resultElement.MappingObjectExpression = moe; GeneralQueryState queryState = new GeneralQueryState(resultElement); return(queryState); }
public virtual GeneralQueryState AsSubQueryState() { DbSqlQueryExpression sqlQuery = this.CreateSqlQuery(); DbSubQueryExpression subQuery = new DbSubQueryExpression(sqlQuery); QueryModel newQueryModel = new QueryModel(this._queryModel.ScopeParameters, this._queryModel.ScopeTables, this._queryModel.IgnoreFilters); DbTableSegment tableSeg = new DbTableSegment(subQuery, newQueryModel.GenerateUniqueTableAlias(), LockType.Unspecified); DbFromTableExpression fromTable = new DbFromTableExpression(tableSeg); newQueryModel.FromTable = fromTable; DbTable aliasTable = new DbTable(tableSeg.Alias); //TODO 根据旧的生成新 ResultModel IObjectModel newResultModel = this.QueryModel.ResultModel.ToNewObjectModel(sqlQuery, aliasTable, fromTable); newQueryModel.ResultModel = newResultModel; //得将 subQuery.SqlQuery.Orders 告诉 以下创建的 result //将 orderPart 传递下去 for (int i = 0; i < this.QueryModel.Orderings.Count; i++) { DbOrdering ordering = this.QueryModel.Orderings[i]; DbExpression orderingExp = ordering.Expression; string alias = null; DbColumnSegment columnExpression = sqlQuery.ColumnSegments.Find(a => DbExpressionEqualityComparer.EqualsCompare(orderingExp, a.Body)); // 对于重复的则不需要往 sqlQuery.Columns 重复添加了 if (columnExpression != null) { alias = columnExpression.Alias; } else { alias = Utils.GenerateUniqueColumnAlias(sqlQuery); DbColumnSegment columnSeg = new DbColumnSegment(orderingExp, alias); sqlQuery.ColumnSegments.Add(columnSeg); } DbColumnAccessExpression columnAccessExpression = new DbColumnAccessExpression(aliasTable, DbColumn.MakeColumn(orderingExp, alias)); newQueryModel.Orderings.Add(new DbOrdering(columnAccessExpression, ordering.OrderType)); } newQueryModel.InheritOrderings = true; GeneralQueryState queryState = new GeneralQueryState(newQueryModel); return(queryState); }
static DbSqlQueryExpression WrapSqlQuery(DbSqlQueryExpression sqlQuery, DbTable table, List <DbColumnSegment> columnSegments = null) { DbSubQueryExpression subQuery = new DbSubQueryExpression(sqlQuery); DbSqlQueryExpression newSqlQuery = new DbSqlQueryExpression(); DbTableSegment tableSeg = new DbTableSegment(subQuery, table.Name, LockType.Unspecified); DbFromTableExpression fromTableExp = new DbFromTableExpression(tableSeg); newSqlQuery.Table = fromTableExp; CopyColumnSegments(columnSegments ?? subQuery.SqlQuery.ColumnSegments, newSqlQuery.ColumnSegments, table); return(newSqlQuery); }
public string GenerateUniqueTableAlias(string prefix = UtilConstants.DefaultTableAlias) { string alias = prefix; int i = 0; DbFromTableExpression fromTable = this.FromTable; while (this.ScopeTables.ContainsKey(alias) || ExistTableAlias(fromTable, alias)) { alias = prefix + i.ToString(); i++; } this.ScopeTables[alias] = alias; return(alias); }
static bool ExistTableAlias(DbFromTableExpression fromTable, string alias) { if (string.Equals(fromTable.Table.Alias, alias, StringComparison.OrdinalIgnoreCase)) { return(true); } foreach (var item in fromTable.JoinTables) { if (ExistTableAlias(item, alias)) { return(true); } } return(false); }
public virtual FromQueryResult ToFromQueryResult() { DbSqlQueryExpression sqlQuery = this.CreateSqlQuery(); DbSubQueryExpression subQuery = new DbSubQueryExpression(sqlQuery); DbTableSegment tableSeg = new DbTableSegment(subQuery, UtilConstants.DefaultTableAlias); DbFromTableExpression fromTable = new DbFromTableExpression(tableSeg); DbTable table = new DbTable(tableSeg.Alias); IMappingObjectExpression newMoe = this.Result.MappingObjectExpression.ToNewObjectExpression(sqlQuery, table); FromQueryResult result = new FromQueryResult(); result.FromTable = fromTable; result.MappingObjectExpression = newMoe; return(result); }
public virtual ResultElement ToFromQueryResult() { ResultElement result = new ResultElement(this._resultElement.ScopeParameters, this._resultElement.ScopeTables); string alias = result.GenerateUniqueTableAlias(UtilConstants.DefaultTableAlias); DbSqlQueryExpression sqlQuery = this.CreateSqlQuery(); DbSubQueryExpression subQuery = new DbSubQueryExpression(sqlQuery); DbTableSegment tableSeg = new DbTableSegment(subQuery, alias, LockType.Unspecified); DbFromTableExpression fromTable = new DbFromTableExpression(tableSeg); DbTable table = new DbTable(tableSeg.Alias); IMappingObjectExpression newMoe = this.Result.MappingObjectExpression.ToNewObjectExpression(sqlQuery, table); result.FromTable = fromTable; result.MappingObjectExpression = newMoe; return(result); }
public virtual QueryModel ToFromQueryModel() { QueryModel queryModel = new QueryModel(this._queryModel.ScopeParameters, this._queryModel.ScopeTables, this._queryModel.IgnoreFilters); string alias = queryModel.GenerateUniqueTableAlias(UtilConstants.DefaultTableAlias); DbSqlQueryExpression sqlQuery = this.CreateSqlQuery(); DbSubQueryExpression subQuery = new DbSubQueryExpression(sqlQuery); DbTableSegment tableSeg = new DbTableSegment(subQuery, alias, LockType.Unspecified); DbFromTableExpression fromTable = new DbFromTableExpression(tableSeg); DbTable aliasTable = new DbTable(tableSeg.Alias); IObjectModel newModel = this.QueryModel.ResultModel.ToNewObjectModel(sqlQuery, aliasTable, fromTable); queryModel.FromTable = fromTable; queryModel.ResultModel = newModel; return(queryModel); }
public string GenerateUniqueTableAlias(string prefix = UtilConstants.DefaultTableAlias) { if (this.FromTable == null) { return(prefix); } string alias = prefix; int i = 0; DbFromTableExpression fromTable = this.FromTable; while (ExistTableAlias(fromTable, alias)) { alias = prefix + i.ToString(); i++; } return(alias); }
public virtual JoinQueryResult ToJoinQueryResult(DbJoinType joinType, LambdaExpression conditionExpression, DbFromTableExpression fromTable, List <IMappingObjectExpression> moeList, string tableAlias) { DbSqlQueryExpression sqlQuery = this.CreateSqlQuery(); DbSubQueryExpression subQuery = new DbSubQueryExpression(sqlQuery); string alias = tableAlias; DbTableSegment tableSeg = new DbTableSegment(subQuery, alias); DbTable table = new DbTable(tableSeg.Alias); IMappingObjectExpression newMoe = this.Result.MappingObjectExpression.ToNewObjectExpression(sqlQuery, table); List <IMappingObjectExpression> moes = new List <IMappingObjectExpression>(moeList.Count + 1); moes.AddRange(moeList); moes.Add(newMoe); DbExpression condition = GeneralExpressionVisitor.ParseLambda(conditionExpression, moes); DbJoinTableExpression joinTable = new DbJoinTableExpression(joinType, tableSeg, condition); JoinQueryResult result = new JoinQueryResult(); result.MappingObjectExpression = newMoe; result.JoinTable = joinTable; return(result); }
public override DbExpression Visit(DbFromTableExpression exp) { return(exp); }
public override DbExpression Visit(DbFromTableExpression exp) { return(exp.Accept(this._generator)); }
public abstract T Visit(DbFromTableExpression exp);
public virtual JoinQueryResult ToJoinQueryResult(JoinType joinType, LambdaExpression conditionExpression, DbFromTableExpression fromTable, List<IMappingObjectExpression> moeList, string tableAlias) { DbSqlQueryExpression sqlQuery = this.CreateSqlQuery(); DbSubQueryExpression subQuery = new DbSubQueryExpression(sqlQuery); string alias = tableAlias; DbTableSegment tableSeg = new DbTableSegment(subQuery, alias); DbTable table = new DbTable(tableSeg.Alias); IMappingObjectExpression newMoe = this.Result.MappingObjectExpression.ToNewObjectExpression(sqlQuery, table); List<IMappingObjectExpression> moes = new List<IMappingObjectExpression>(moeList.Count + 1); moes.AddRange(moeList); moes.Add(newMoe); DbExpression condition = GeneralExpressionVisitor.VisitPredicate(conditionExpression, moes); DbJoinTableExpression joinTable = new DbJoinTableExpression(joinType, tableSeg, condition); JoinQueryResult result = new JoinQueryResult(); result.MappingObjectExpression = newMoe; result.JoinTable = joinTable; return result; }
public virtual FromQueryResult ToFromQueryResult() { DbSqlQueryExpression sqlQuery = this.CreateSqlQuery(); DbSubQueryExpression subQuery = new DbSubQueryExpression(sqlQuery); DbTableSegment tableSeg = new DbTableSegment(subQuery, ResultElement.DefaultTableAlias); DbFromTableExpression fromTable = new DbFromTableExpression(tableSeg); DbTable table = new DbTable(tableSeg.Alias); IMappingObjectExpression newMoe = this.Result.MappingObjectExpression.ToNewObjectExpression(sqlQuery, table); FromQueryResult result = new FromQueryResult(); result.FromTable = fromTable; result.MappingObjectExpression = newMoe; return result; }
public virtual GeneralQueryState AsSubQueryState() { DbSqlQueryExpression sqlQuery = this.CreateSqlQuery(); DbSubQueryExpression subQuery = new DbSubQueryExpression(sqlQuery); ResultElement result = new ResultElement(); DbTableSegment tableSeg = new DbTableSegment(subQuery, result.GenerateUniqueTableAlias()); DbFromTableExpression fromTable = new DbFromTableExpression(tableSeg); result.FromTable = fromTable; DbTable table = new DbTable(tableSeg.Alias); //TODO 根据旧的生成新 MappingMembers IMappingObjectExpression newMoe = this.Result.MappingObjectExpression.ToNewObjectExpression(sqlQuery, table); result.MappingObjectExpression = newMoe; //得将 subQuery.SqlQuery.Orders 告诉 以下创建的 result //将 orderPart 传递下去 if (this.Result.OrderSegments.Count > 0) { for (int i = 0; i < this.Result.OrderSegments.Count; i++) { DbOrderSegment orderPart = this.Result.OrderSegments[i]; DbExpression orderExp = orderPart.DbExpression; string alias = null; DbColumnSegment columnExpression = sqlQuery.ColumnSegments.Where(a => DbExpressionEqualityComparer.EqualsCompare(orderExp, a.Body)).FirstOrDefault(); // 对于重复的则不需要往 sqlQuery.Columns 重复添加了 if (columnExpression != null) { alias = columnExpression.Alias; } else { alias = Utils.GenerateUniqueColumnAlias(sqlQuery); DbColumnSegment columnSeg = new DbColumnSegment(orderExp, alias); sqlQuery.ColumnSegments.Add(columnSeg); } DbColumnAccessExpression columnAccessExpression = new DbColumnAccessExpression(orderExp.Type, table, alias); result.OrderSegments.Add(new DbOrderSegment(columnAccessExpression, orderPart.OrderType)); } } result.IsOrderSegmentsFromSubQuery = true; GeneralQueryState queryState = new GeneralQueryState(result); return queryState; }