GeneralExpressionVisitor.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using Ant.Common;
  2. using Ant.Core.Visitors;
  3. using Ant.DbExpressions;
  4. using Ant.Extensions;
  5. using Ant.Utility;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Linq.Expressions;
  10. using System.Text;
  11. namespace Ant.Query.Visitors
  12. {
  13. internal class GeneralExpressionVisitor : ExpressionVisitorBase
  14. {
  15. LambdaExpression _lambda;
  16. List<IMappingObjectExpression> _moeList;
  17. GeneralExpressionVisitor(List<IMappingObjectExpression> moeList)
  18. {
  19. this._moeList = moeList;
  20. }
  21. public GeneralExpressionVisitor(LambdaExpression lambda, List<IMappingObjectExpression> moeList)
  22. {
  23. this._lambda = lambda;
  24. this._moeList = moeList;
  25. }
  26. public static DbExpression VisitPredicate(LambdaExpression lambda, List<IMappingObjectExpression> moeList)
  27. {
  28. GeneralExpressionVisitor visitor = new GeneralExpressionVisitor(moeList);
  29. return visitor.Visit(lambda);
  30. }
  31. int FindParameterIndex(ParameterExpression exp)
  32. {
  33. int idx = this._lambda.Parameters.IndexOf(exp);
  34. if (idx == -1)
  35. {
  36. throw new Exception("Can not find the ParameterExpression index");
  37. }
  38. return idx;
  39. }
  40. protected override DbExpression VisitLambda(LambdaExpression lambda)
  41. {
  42. this._lambda = lambda;
  43. return base.VisitLambda(lambda);
  44. }
  45. protected override DbExpression VisitMemberAccess(MemberExpression exp)
  46. {
  47. ParameterExpression p;
  48. if (ExpressionExtensions.IsDerivedFromParameter(exp, out p))
  49. {
  50. int idx = this.FindParameterIndex(p);
  51. IMappingObjectExpression moe = this._moeList[idx];
  52. return moe.GetDbExpression(exp);
  53. }
  54. else
  55. {
  56. return base.VisitMemberAccess(exp);
  57. }
  58. }
  59. protected override DbExpression VisitParameter(ParameterExpression exp)
  60. {
  61. //TODO 只支持 MappingFieldExpression 类型,即类似 q.Select(a=> a.Id).Where(a=> a > 0) 这种情况,也就是 ParameterExpression.Type 为基本映射类型。
  62. if (AntUtils.IsMapType(exp.Type))
  63. {
  64. int idx = this.FindParameterIndex(exp);
  65. IMappingObjectExpression moe = this._moeList[idx];
  66. MappingFieldExpression mfe = (MappingFieldExpression)moe;
  67. return mfe.Expression;
  68. }
  69. else
  70. throw new NotSupportedException(exp.ToString());
  71. }
  72. }
  73. }