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); }
protected static DbOrderSegment VisistOrderExpression(List <IMappingObjectExpression> moeList, OrderExpression orderExp) { DbExpression dbExpression = GeneralExpressionVisitor.VisitPredicate(orderExp.Expression, moeList); OrderType orderType; if (orderExp.NodeType == QueryExpressionType.OrderBy || orderExp.NodeType == QueryExpressionType.ThenBy) { orderType = OrderType.Asc; } else if (orderExp.NodeType == QueryExpressionType.OrderByDesc || orderExp.NodeType == QueryExpressionType.ThenByDesc) { orderType = OrderType.Desc; } else { throw new NotSupportedException(orderExp.NodeType.ToString()); } DbOrderSegment orderSeg = new DbOrderSegment(dbExpression, orderType); return(orderSeg); }
protected static DbOrderSegment VisistOrderExpression(List<IMappingObjectExpression> moeList, OrderExpression orderExp) { DbExpression dbExpression = GeneralExpressionVisitor.VisitPredicate(orderExp.Expression, moeList); OrderType orderType; if (orderExp.NodeType == QueryExpressionType.OrderBy || orderExp.NodeType == QueryExpressionType.ThenBy) { orderType = OrderType.Asc; } else if (orderExp.NodeType == QueryExpressionType.OrderByDesc || orderExp.NodeType == QueryExpressionType.ThenByDesc) { orderType = OrderType.Desc; } else throw new NotSupportedException(orderExp.NodeType.ToString()); DbOrderSegment orderSeg = new DbOrderSegment(dbExpression, orderType); return orderSeg; }