UnaryExpressionResolve.cs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using System.Text;
  6. namespace SqlSugar
  7. {
  8. public class UnaryExpressionResolve : BaseResolve
  9. {
  10. public UnaryExpressionResolve(ExpressionParameter parameter) : base(parameter)
  11. {
  12. var oldExpression = base.Expression;
  13. var expression = base.Expression as UnaryExpression;
  14. var baseParameter = parameter.BaseParameter;
  15. switch (this.Context.ResolveType)
  16. {
  17. case ResolveExpressType.WhereSingle:
  18. case ResolveExpressType.WhereMultiple:
  19. case ResolveExpressType.FieldSingle:
  20. case ResolveExpressType.FieldMultiple:
  21. case ResolveExpressType.SelectSingle:
  22. case ResolveExpressType.SelectMultiple:
  23. case ResolveExpressType.ArraySingle:
  24. case ResolveExpressType.ArrayMultiple:
  25. case ResolveExpressType.Update:
  26. var nodeType = expression.NodeType;
  27. base.Expression = expression.Operand;
  28. var isMember = expression.Operand is MemberExpression;
  29. var isConst = expression.Operand is ConstantExpression;
  30. var offsetIsNull = (parameter.OppsiteExpression is ConstantExpression)
  31. &&(parameter.OppsiteExpression as ConstantExpression).Value==null
  32. &&ExpressionTool.IsComparisonOperator(expression.Operand);
  33. if (isMember && offsetIsNull) {
  34. Append(parameter, nodeType);
  35. }
  36. else if (baseParameter.CurrentExpression is NewArrayExpression)
  37. {
  38. Result(parameter, nodeType);
  39. }
  40. else if (baseParameter.OperatorValue == "=" &&IsNotMember(oldExpression))
  41. {
  42. AppendNotMember(parameter,nodeType);
  43. }
  44. else if (baseParameter.OperatorValue == "=" && IsNotParameter(oldExpression))
  45. {
  46. AppendNotParameter(parameter, nodeType);
  47. }
  48. else if (base.Expression is BinaryExpression || parameter.BaseExpression is BinaryExpression || baseParameter.CommonTempData.ObjToString() == CommonTempDataType.Append.ToString())
  49. {
  50. Append(parameter, nodeType);
  51. }
  52. else if (isMember)
  53. {
  54. MemberLogic(parameter, baseParameter, nodeType);
  55. }
  56. else if (isConst)
  57. {
  58. Result(parameter, nodeType);
  59. }
  60. else
  61. {
  62. Append(parameter, nodeType);
  63. }
  64. break;
  65. default:
  66. break;
  67. }
  68. }
  69. private void MemberLogic(ExpressionParameter parameter, ExpressionParameter baseParameter, ExpressionType nodeType)
  70. {
  71. var memberExpression = (base.Expression as MemberExpression);
  72. var isLogicOperator = ExpressionTool.IsLogicOperator(baseParameter.OperatorValue) || baseParameter.OperatorValue.IsNullOrEmpty();
  73. var isHasValue = isLogicOperator && memberExpression.Member.Name == "HasValue" && memberExpression.Expression != null && memberExpression.NodeType == ExpressionType.MemberAccess;
  74. if (isHasValue)
  75. {
  76. var member = memberExpression.Expression as MemberExpression;
  77. parameter.CommonTempData = CommonTempDataType.Result;
  78. var isConst = member.Expression != null && member.Expression is ConstantExpression;
  79. if (isConst)
  80. {
  81. var paramterValue = ExpressionTool.DynamicInvoke(member);
  82. var paramterName= base.AppendParameter(paramterValue);
  83. var result = this.Context.DbMehtods.HasValue(new MethodCallExpressionModel()
  84. {
  85. Args = new List<MethodCallExpressionArgs>() {
  86. new MethodCallExpressionArgs() { IsMember=false, MemberName=paramterName, MemberValue=paramterValue } }
  87. });
  88. this.Context.Result.Append(result);
  89. }
  90. else
  91. {
  92. this.Expression = isConst ? member.Expression : member;
  93. this.Start();
  94. var methodParamter = isConst ? new MethodCallExpressionArgs() { IsMember = false } : new MethodCallExpressionArgs() { IsMember = true, MemberName = parameter.CommonTempData, MemberValue = null };
  95. var result = this.Context.DbMehtods.HasValue(new MethodCallExpressionModel()
  96. {
  97. Args = new List<MethodCallExpressionArgs>() {
  98. methodParamter
  99. }
  100. });
  101. this.Context.Result.Append(result);
  102. parameter.CommonTempData = null;
  103. }
  104. }
  105. else if (memberExpression.Type == UtilConstants.BoolType && isLogicOperator)
  106. {
  107. Append(parameter, nodeType);
  108. }
  109. else
  110. {
  111. Result(parameter, nodeType);
  112. }
  113. }
  114. private void Result(ExpressionParameter parameter, ExpressionType nodeType)
  115. {
  116. BaseParameter.ChildExpression = base.Expression;
  117. parameter.CommonTempData = CommonTempDataType.Result;
  118. if (nodeType == ExpressionType.Not)
  119. AppendNot(parameter.CommonTempData);
  120. base.Start();
  121. parameter.BaseParameter.CommonTempData = parameter.CommonTempData;
  122. if (nodeType == ExpressionType.Negate&& parameter.BaseParameter.CommonTempData is int)
  123. parameter.BaseParameter.CommonTempData =Convert.ToInt32(parameter.BaseParameter.CommonTempData)*-1;
  124. parameter.BaseParameter.ChildExpression = base.Expression;
  125. parameter.CommonTempData = null;
  126. }
  127. private void Append(ExpressionParameter parameter, ExpressionType nodeType)
  128. {
  129. BaseParameter.ChildExpression = base.Expression;
  130. this.IsLeft = parameter.IsLeft;
  131. parameter.CommonTempData = CommonTempDataType.Append;
  132. if (nodeType == ExpressionType.Not)
  133. AppendNot(parameter.CommonTempData);
  134. if (nodeType == ExpressionType.Negate)
  135. AppendNegate(parameter.CommonTempData);
  136. base.Start();
  137. parameter.BaseParameter.CommonTempData = parameter.CommonTempData;
  138. parameter.BaseParameter.ChildExpression = base.Expression;
  139. parameter.CommonTempData = null;
  140. }
  141. private void AppendNotMember(ExpressionParameter parameter, ExpressionType nodeType)
  142. {
  143. BaseParameter.ChildExpression = base.Expression;
  144. this.IsLeft = parameter.IsLeft;
  145. parameter.CommonTempData = CommonTempDataType.Result;
  146. base.Start();
  147. var result= this.Context.DbMehtods.IIF(new MethodCallExpressionModel()
  148. {
  149. Args = new List<MethodCallExpressionArgs>() {
  150. new MethodCallExpressionArgs(){ IsMember=true, MemberName=parameter.CommonTempData.ObjToString()+"=1",Type=UtilConstants.BoolType },
  151. new MethodCallExpressionArgs(){ IsMember=true,MemberName=AppendParameter(0) },
  152. new MethodCallExpressionArgs(){ IsMember=true, MemberName=AppendParameter(1) }
  153. }
  154. });
  155. this.Context.Result.Append(result);
  156. parameter.BaseParameter.ChildExpression = base.Expression;
  157. parameter.CommonTempData = null;
  158. }
  159. private void AppendNotParameter(ExpressionParameter parameter, ExpressionType nodeType)
  160. {
  161. BaseParameter.ChildExpression = base.Expression;
  162. this.IsLeft = parameter.IsLeft;
  163. parameter.CommonTempData = CommonTempDataType.Result;
  164. base.Start();
  165. var result = this.Context.DbMehtods.IIF(new MethodCallExpressionModel()
  166. {
  167. Args = new List<MethodCallExpressionArgs>() {
  168. new MethodCallExpressionArgs(){ IsMember=true, MemberName=AppendParameter(parameter.CommonTempData)+"=1" },
  169. new MethodCallExpressionArgs(){ IsMember=true,MemberName=AppendParameter(0) },
  170. new MethodCallExpressionArgs(){ IsMember=true, MemberName=AppendParameter(1) }
  171. }
  172. });
  173. this.Context.Result.Append(result);
  174. parameter.BaseParameter.ChildExpression = base.Expression;
  175. parameter.CommonTempData = null;
  176. }
  177. }
  178. }