BaseResolve_NewExp.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using System.Reflection;
  6. using System.Text;
  7. namespace SqlSugar
  8. {
  9. /// <summary>
  10. ///BaseResolve New Expression
  11. /// </summary>
  12. public partial class BaseResolve
  13. {
  14. public string GetNewExpressionValue(Expression item)
  15. {
  16. var newContext = this.Context.GetCopyContextWithMapping();
  17. newContext.SugarContext = this.Context.SugarContext;
  18. newContext.Resolve(item, this.Context.IsJoin ? ResolveExpressType.WhereMultiple : ResolveExpressType.WhereSingle);
  19. this.Context.Index = newContext.Index;
  20. this.Context.ParameterIndex = newContext.ParameterIndex;
  21. if (newContext.Parameters.HasValue())
  22. {
  23. foreach (var p in newContext.Parameters)
  24. {
  25. if (!this.Context.Parameters.Any(it => it.ParameterName == p.ParameterName))
  26. {
  27. this.Context.Parameters.Add(p);
  28. }
  29. }
  30. }
  31. if (this.Context.SingleTableNameSubqueryShortName == "Subqueryable()")
  32. {
  33. this.Context.SingleTableNameSubqueryShortName = newContext.SingleTableNameSubqueryShortName;
  34. }
  35. else if (newContext.SingleTableNameSubqueryShortName!=null&& newContext.Result !=null && newContext.Result.Contains(this.Context.SqlTranslationLeft+ newContext.SingleTableNameSubqueryShortName+ this.Context.SqlTranslationRight))
  36. {
  37. this.Context.SingleTableNameSubqueryShortName = newContext.SingleTableNameSubqueryShortName;
  38. }
  39. return newContext.Result.GetResultString();
  40. }
  41. public string GetNewExpressionValue(Expression item, ResolveExpressType type)
  42. {
  43. var newContext = this.Context.GetCopyContextWithMapping();
  44. newContext.SugarContext = this.Context.SugarContext;
  45. newContext.Resolve(item, type);
  46. this.Context.Index = newContext.Index;
  47. this.Context.ParameterIndex = newContext.ParameterIndex;
  48. if (newContext.Parameters.HasValue())
  49. {
  50. this.Context.Parameters.AddRange(newContext.Parameters);
  51. }
  52. return newContext.Result.GetResultString();
  53. }
  54. protected void ResolveNewExpressions(ExpressionParameter parameter, Expression item, string asName)
  55. {
  56. if (item is ConstantExpression)
  57. {
  58. ResolveConst(parameter, item, asName);
  59. }
  60. else if ((item is MemberExpression) && ((MemberExpression)item).Expression == null)
  61. {
  62. ResolveMember(parameter, item, asName);
  63. }
  64. else if ((item is MemberExpression) && ((MemberExpression)item).Expression.NodeType == ExpressionType.Constant)
  65. {
  66. ResolveMemberConst(parameter, item, asName);
  67. }
  68. else if (item is MemberExpression)
  69. {
  70. ResolveMemberOther(parameter, item, asName);
  71. }
  72. else if (item is UnaryExpression && ((UnaryExpression)item).Operand is MemberExpression)
  73. {
  74. ResolveUnaryExpMem(parameter, item, asName);
  75. }
  76. else if (item is UnaryExpression && ((UnaryExpression)item).Operand is ConstantExpression)
  77. {
  78. ResolveUnaryExpConst(parameter, item, asName);
  79. }
  80. else if (ExpressionTool.RemoveConvert(item) is BinaryExpression)
  81. {
  82. ResolveBinary(item, asName);
  83. }
  84. else if (item.Type.IsClass())
  85. {
  86. asName = ResolveClass(parameter, item, asName);
  87. }
  88. else if (item.Type == UtilConstants.BoolType && item is MethodCallExpression && IsNotCaseExpression(item))
  89. {
  90. ResloveBoolMethod(parameter, item, asName);
  91. }
  92. else if (item.NodeType == ExpressionType.Not
  93. && (item as UnaryExpression).Operand is MethodCallExpression
  94. && ((item as UnaryExpression).Operand as MethodCallExpression).Method.Name.IsIn("IsNullOrEmpty", "IsNullOrWhiteSpace"))
  95. {
  96. ResloveNot(parameter, item, asName);
  97. }
  98. else if (item is MethodCallExpression && (item as MethodCallExpression).Method.Name.IsIn("Count", "Any") && !item.ToString().StartsWith("Subqueryable"))
  99. {
  100. ResloveCountAny(parameter, item, asName);
  101. }
  102. else if (item is MethodCallExpression || item is UnaryExpression || item is ConditionalExpression || item.NodeType == ExpressionType.Coalesce)
  103. {
  104. ResloveOtherMUC(parameter, item, asName);
  105. }
  106. else
  107. {
  108. Check.ThrowNotSupportedException(item.GetType().Name);
  109. }
  110. }
  111. }
  112. }