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 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; }
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 DbDeleteExpression(DbTable table) : this(table, null) { }