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 == JoinType.LeftJoin) { joinQueryResult.MappingObjectExpression.SetNullChecking(nullChecking); } else if (joiningQueryInfo.JoinType == JoinType.RightJoin) { foreach (IMappingObjectExpression item in moeList) { item.SetNullChecking(nullChecking); } } else if (joiningQueryInfo.JoinType == JoinType.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.ResolveSelectorExpression(exp.Selector, moeList); resultElement.MappingObjectExpression = moe; GeneralQueryState queryState = new GeneralQueryState(resultElement); return(queryState); }
public override IQueryState Visit(JoinQueryExpression exp) { IQueryState qs = QueryExpressionResolver.Resolve(exp.PrevExpression, this._scopeParameters, this._scopeTables); QueryModel queryModel = qs.ToFromQueryModel(); List <IObjectModel> modelList = new List <IObjectModel>(); modelList.Add(queryModel.ResultModel); foreach (JoinQueryInfo joinQueryInfo in exp.JoinedQueries) { ScopeParameterDictionary scopeParameters = queryModel.ScopeParameters.Clone(queryModel.ScopeParameters.Count + modelList.Count); for (int i = 0; i < modelList.Count; i++) { ParameterExpression p = joinQueryInfo.Condition.Parameters[i]; scopeParameters[p] = modelList[i]; } JoinQueryResult joinQueryResult = JoinQueryExpressionResolver.Resolve(joinQueryInfo, queryModel, scopeParameters); var nullChecking = DbExpression.CaseWhen(new DbCaseWhenExpression.WhenThenExpressionPair(joinQueryResult.JoinTable.Condition, DbConstantExpression.One), DbConstantExpression.Null, DbConstantExpression.One.Type); if (joinQueryInfo.JoinType == JoinType.LeftJoin) { joinQueryResult.ResultModel.SetNullChecking(nullChecking); } else if (joinQueryInfo.JoinType == JoinType.RightJoin) { foreach (IObjectModel item in modelList) { item.SetNullChecking(nullChecking); } } else if (joinQueryInfo.JoinType == JoinType.FullJoin) { joinQueryResult.ResultModel.SetNullChecking(nullChecking); foreach (IObjectModel item in modelList) { item.SetNullChecking(nullChecking); } } queryModel.FromTable.JoinTables.Add(joinQueryResult.JoinTable); modelList.Add(joinQueryResult.ResultModel); } ScopeParameterDictionary scopeParameters1 = queryModel.ScopeParameters.Clone(queryModel.ScopeParameters.Count + modelList.Count); for (int i = 0; i < modelList.Count; i++) { ParameterExpression p = exp.Selector.Parameters[i]; scopeParameters1[p] = modelList[i]; } IObjectModel model = SelectorResolver.Resolve(exp.Selector, scopeParameters1, queryModel.ScopeTables); queryModel.ResultModel = model; GeneralQueryState queryState = new GeneralQueryState(queryModel); return(queryState); }
public override IQueryState Visit(JoinQueryExpression exp) { IQueryState qs = QueryExpressionVisitor.VisitQueryExpression(exp.PrevExpression, this._scopeParameters, this._scopeTables); ResultElement resultElement = qs.ToFromQueryResult(); List <IMappingObjectExpression> moeList = new List <IMappingObjectExpression>(); moeList.Add(resultElement.MappingObjectExpression); foreach (JoiningQueryInfo joiningQueryInfo in exp.JoinedQueries) { ScopeParameterDictionary scopeParameters = resultElement.ScopeParameters.Clone(resultElement.ScopeParameters.Count + moeList.Count); for (int i = 0; i < moeList.Count; i++) { ParameterExpression p = joiningQueryInfo.Condition.Parameters[i]; scopeParameters[p] = moeList[i]; } JoinQueryResult joinQueryResult = JoinQueryExpressionVisitor.VisitQueryExpression(joiningQueryInfo.Query.QueryExpression, resultElement, joiningQueryInfo.JoinType, joiningQueryInfo.Condition, scopeParameters); var nullChecking = DbExpression.CaseWhen(new DbCaseWhenExpression.WhenThenExpressionPair(joinQueryResult.JoinTable.Condition, DbConstantExpression.One), DbConstantExpression.Null, DbConstantExpression.One.Type); if (joiningQueryInfo.JoinType == JoinType.LeftJoin) { joinQueryResult.MappingObjectExpression.SetNullChecking(nullChecking); } else if (joiningQueryInfo.JoinType == JoinType.RightJoin) { foreach (IMappingObjectExpression item in moeList) { item.SetNullChecking(nullChecking); } } else if (joiningQueryInfo.JoinType == JoinType.FullJoin) { joinQueryResult.MappingObjectExpression.SetNullChecking(nullChecking); foreach (IMappingObjectExpression item in moeList) { item.SetNullChecking(nullChecking); } } resultElement.FromTable.JoinTables.Add(joinQueryResult.JoinTable); moeList.Add(joinQueryResult.MappingObjectExpression); } ScopeParameterDictionary scopeParameters1 = resultElement.ScopeParameters.Clone(resultElement.ScopeParameters.Count + moeList.Count); for (int i = 0; i < moeList.Count; i++) { ParameterExpression p = exp.Selector.Parameters[i]; scopeParameters1[p] = moeList[i]; } IMappingObjectExpression moe = SelectorExpressionVisitor.ResolveSelectorExpression(exp.Selector, scopeParameters1, resultElement.ScopeTables); resultElement.MappingObjectExpression = moe; GeneralQueryState queryState = new GeneralQueryState(resultElement); return(queryState); }
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; }