123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- 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<IQueryState>
- {
- 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;
- }
- /// <summary>
- /// 构建Where
- /// </summary>
- /// <param name="exp"></param>
- /// <returns></returns>
- public override IQueryState Visit(WhereExpression exp)
- {
- IQueryState prevState = exp.PrevExpression.Accept(this);
- IQueryState state = prevState.Accept(exp);
- return state;
- }
- /// <summary>
- /// 构建Orderby
- /// </summary>
- /// <param name="exp"></param>
- /// <returns></returns>
- public override IQueryState Visit(OrderExpression exp)
- {
- IQueryState prevState = exp.PrevExpression.Accept(this);
- IQueryState state = prevState.Accept(exp);
- return state;
- }
- /// <summary>
- /// 构建Select
- /// </summary>
- /// <param name="exp"></param>
- /// <returns></returns>
- public override IQueryState Visit(SelectExpression exp)
- {
- IQueryState prevState = exp.PrevExpression.Accept(this);
- IQueryState state = prevState.Accept(exp);
- return state;
- }
- /// <summary>
- /// 构建分页
- /// </summary>
- /// <param name="exp"></param>
- /// <returns></returns>
- public override IQueryState Visit(SkipExpression exp)
- {
- IQueryState prevState = exp.PrevExpression.Accept(this);
- IQueryState state = prevState.Accept(exp);
- return state;
- }
- /// <summary>
- /// 构建Top
- /// </summary>
- /// <param name="exp"></param>
- /// <returns></returns>
- public override IQueryState Visit(TakeExpression exp)
- {
- IQueryState prevState = exp.PrevExpression.Accept(this);
- IQueryState state = prevState.Accept(exp);
- return state;
- }
- /// <summary>
- /// 构建函数
- /// </summary>
- /// <param name="exp"></param>
- /// <returns></returns>
- public override IQueryState Visit(AggregateQueryExpression exp)
- {
- IQueryState prevState = exp.PrevExpression.Accept(this);
- IQueryState state = prevState.Accept(exp);
- return state;
- }
- /// <summary>
- /// 构建Join
- /// </summary>
- /// <param name="exp"></param>
- /// <returns></returns>
- 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.VisitSelectExpression(exp.Selector, moeList);
- resultElement.MappingObjectExpression = moe;
- GeneralQueryState queryState = new GeneralQueryState(resultElement);
- return queryState;
- }
- /// <summary>
- /// 构建分组
- /// </summary>
- /// <param name="exp"></param>
- /// <returns></returns>
- public override IQueryState Visit(GroupingQueryExpression exp)
- {
- IQueryState prevState = exp.PrevExpression.Accept(this);
- IQueryState state = prevState.Accept(exp);
- return state;
- }
- }
- }
|