JoinQueryExpressionVisitor.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. using Ant.DbExpressions;
  2. using Ant.Descriptors;
  3. using Ant.ORM;
  4. using Ant.Query.QueryExpressions;
  5. using Ant.Query.QueryState;
  6. using Ant.Utility;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Linq.Expressions;
  11. using System.Text;
  12. namespace Ant.Query.Visitors
  13. {
  14. class JoinQueryExpressionVisitor : QueryExpressionVisitor<JoinQueryResult>
  15. {
  16. ResultElement _resultElement;
  17. JoinType _joinType;
  18. LambdaExpression _conditionExpression;
  19. List<IMappingObjectExpression> _moeList;
  20. JoinQueryExpressionVisitor(ResultElement resultElement, JoinType joinType, LambdaExpression conditionExpression, List<IMappingObjectExpression> moeList)
  21. {
  22. this._resultElement = resultElement;
  23. this._joinType = joinType;
  24. this._conditionExpression = conditionExpression;
  25. this._moeList = moeList;
  26. }
  27. public static JoinQueryResult VisitQueryExpression(QueryExpression queryExpression, ResultElement resultElement, JoinType joinType, LambdaExpression conditionExpression, List<IMappingObjectExpression> moeList)
  28. {
  29. JoinQueryExpressionVisitor visitor = new JoinQueryExpressionVisitor(resultElement, joinType, conditionExpression, moeList);
  30. return queryExpression.Accept(visitor);
  31. }
  32. public override JoinQueryResult Visit(RootQueryExpression exp)
  33. {
  34. Type type = exp.ElementType;
  35. MetaData typeDescriptor = new MetaData();
  36. typeDescriptor.FiledMeta = MetaDataManager.GetMetaData(type);
  37. string alias = this._resultElement.GenerateUniqueTableAlias(typeDescriptor.FiledMeta.Table.Name);
  38. DbTableSegment tableSeg = CreateTableExpression(typeDescriptor.FiledMeta.Table, alias);
  39. MappingObjectExpression moe = new MappingObjectExpression(typeDescriptor.FiledMeta.EntityType.GetConstructor(Type.EmptyTypes));
  40. DbTable table = new DbTable(alias);
  41. foreach (MappingMemberDescriptor item in typeDescriptor.FiledMeta.MappingMemberDescriptors.Values)
  42. {
  43. DbColumnAccessExpression columnAccessExpression = new DbColumnAccessExpression(table, item.Column);
  44. moe.AddMemberExpression(item.MemberInfo, columnAccessExpression);
  45. if (item.IsPrimaryKey)
  46. moe.PrimaryKey = columnAccessExpression;
  47. }
  48. //TODO 解析 on 条件表达式
  49. DbExpression condition = null;
  50. List<IMappingObjectExpression> moeList = new List<IMappingObjectExpression>(this._moeList.Count + 1);
  51. moeList.AddRange(this._moeList);
  52. moeList.Add(moe);
  53. condition = GeneralExpressionVisitor.VisitPredicate(this._conditionExpression, moeList);
  54. DbJoinTableExpression joinTable = new DbJoinTableExpression(this._joinType, tableSeg, condition);
  55. JoinQueryResult result = new JoinQueryResult();
  56. result.MappingObjectExpression = moe;
  57. result.JoinTable = joinTable;
  58. return result;
  59. }
  60. public override JoinQueryResult Visit(WhereExpression exp)
  61. {
  62. JoinQueryResult ret = this.Visit(exp);
  63. return ret;
  64. }
  65. public override JoinQueryResult Visit(OrderExpression exp)
  66. {
  67. JoinQueryResult ret = this.Visit(exp);
  68. return ret;
  69. }
  70. public override JoinQueryResult Visit(SelectExpression exp)
  71. {
  72. JoinQueryResult ret = this.Visit(exp);
  73. return ret;
  74. }
  75. public override JoinQueryResult Visit(SkipExpression exp)
  76. {
  77. JoinQueryResult ret = this.Visit(exp);
  78. return ret;
  79. }
  80. public override JoinQueryResult Visit(TakeExpression exp)
  81. {
  82. JoinQueryResult ret = this.Visit(exp);
  83. return ret;
  84. }
  85. public override JoinQueryResult Visit(AggregateQueryExpression exp)
  86. {
  87. JoinQueryResult ret = this.Visit(exp);
  88. return ret;
  89. }
  90. public override JoinQueryResult Visit(JoinQueryExpression exp)
  91. {
  92. JoinQueryResult ret = this.Visit(exp);
  93. return ret;
  94. }
  95. public override JoinQueryResult Visit(GroupingQueryExpression exp)
  96. {
  97. JoinQueryResult ret = this.Visit(exp);
  98. return ret;
  99. }
  100. JoinQueryResult Visit(QueryExpression exp)
  101. {
  102. IQueryState state = QueryExpressionVisitor.VisitQueryExpression(exp);
  103. JoinQueryResult ret = state.ToJoinQueryResult(this._joinType, this._conditionExpression, this._resultElement.FromTable, this._moeList, this._resultElement.GenerateUniqueTableAlias());
  104. return ret;
  105. }
  106. static DbTableSegment CreateTableExpression(DbTable table, string alias)
  107. {
  108. DbTableExpression tableExp = new DbTableExpression(table);
  109. DbTableSegment tableSeg = new DbTableSegment(tableExp, alias);
  110. return tableSeg;
  111. }
  112. }
  113. }