using Ant.DbExpressions; using Ant.ORM; using Ant.Query.QueryExpressions; using Ant.Query.QueryState; using Ant.Utility; using System.Collections.Generic; namespace Ant.Query.Visitors { class QueryExpressionVisitor : QueryExpressionVisitor { static QueryExpressionVisitor _reducer = new QueryExpressionVisitor(); QueryExpressionVisitor() { } public static IQueryState VisitQueryExpression(QueryExpression queryExpression) { return queryExpression.Accept(_reducer); } public override IQueryState Visit(RootQueryExpression exp) { IQueryState queryState = new RootQueryState(exp.ElementType); return queryState; } /// /// 构建Where /// /// /// public override IQueryState Visit(WhereExpression exp) { IQueryState prevState = exp.PrevExpression.Accept(this); IQueryState state = prevState.Accept(exp); return state; } /// /// 构建Orderby /// /// /// public override IQueryState Visit(OrderExpression exp) { IQueryState prevState = exp.PrevExpression.Accept(this); IQueryState state = prevState.Accept(exp); return state; } /// /// 构建Select /// /// /// public override IQueryState Visit(SelectExpression exp) { IQueryState prevState = exp.PrevExpression.Accept(this); IQueryState state = prevState.Accept(exp); return state; } /// /// 构建分页 /// /// /// public override IQueryState Visit(SkipExpression exp) { IQueryState prevState = exp.PrevExpression.Accept(this); IQueryState state = prevState.Accept(exp); return state; } /// /// 构建Top /// /// /// public override IQueryState Visit(TakeExpression exp) { IQueryState prevState = exp.PrevExpression.Accept(this); IQueryState state = prevState.Accept(exp); return state; } /// /// 构建函数 /// /// /// public override IQueryState Visit(AggregateQueryExpression exp) { IQueryState prevState = exp.PrevExpression.Accept(this); IQueryState state = prevState.Accept(exp); return state; } /// /// 构建Join /// /// /// 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 moeList = new List(); 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.VisitSelectExpression(exp.Selector, moeList); resultElement.MappingObjectExpression = moe; GeneralQueryState queryState = new GeneralQueryState(resultElement); return queryState; } /// /// 构建分组 /// /// /// public override IQueryState Visit(GroupingQueryExpression exp) { IQueryState prevState = exp.PrevExpression.Accept(this); IQueryState state = prevState.Accept(exp); return state; } } }