ConstantExpressionResolve.cs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  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. public class ConstantExpressionResolve : BaseResolve
  10. {
  11. public ConstantExpressionResolve(ExpressionParameter parameter) : base(parameter)
  12. {
  13. var expression = base.Expression as ConstantExpression;
  14. string customParameter = GetCustomParameter(parameter, expression);
  15. if (customParameter == null)
  16. {
  17. DefaultConstant(parameter, expression);
  18. }
  19. else
  20. {
  21. CustomConstant(parameter, customParameter);
  22. }
  23. }
  24. private void CustomConstant(ExpressionParameter parameter, string customParameter)
  25. {
  26. var baseParameter = parameter.BaseParameter;
  27. var isSetTempData = baseParameter.CommonTempData.HasValue() && baseParameter.CommonTempData.Equals(CommonTempDataType.Result);
  28. if (isSetTempData)
  29. {
  30. baseParameter.CommonTempData = customParameter;
  31. }
  32. else
  33. {
  34. AppendMember(parameter, parameter.IsLeft, customParameter);
  35. }
  36. }
  37. private string GetCustomParameter(ExpressionParameter parameter, ConstantExpression expression)
  38. {
  39. string customParameter = null;
  40. if (parameter.OppsiteExpression != null)
  41. {
  42. var exp = ExpressionTool.RemoveConvert(parameter.OppsiteExpression);
  43. if (exp is MemberExpression)
  44. {
  45. var member = (exp as MemberExpression);
  46. var memberParent = member.Expression;
  47. if (memberParent != null&& this.Context?.SugarContext?.Context!=null)
  48. {
  49. var entity = this.Context.SugarContext.Context.EntityMaintenance.GetEntityInfo(memberParent.Type);
  50. var columnInfo = entity.Columns.FirstOrDefault(it => it.PropertyName == member.Member.Name);
  51. if (columnInfo?.SqlParameterDbType is Type)
  52. {
  53. var type = columnInfo.SqlParameterDbType as Type;
  54. var ParameterConverter = type.GetMethod("ParameterConverter").MakeGenericMethod(columnInfo.PropertyInfo.PropertyType);
  55. var obj=Activator.CreateInstance(type);
  56. var p = ParameterConverter.Invoke(obj, new object[] { expression.Value, 100 }) as SugarParameter;
  57. customParameter = base.AppendParameter(p);
  58. }
  59. }
  60. }
  61. }
  62. return customParameter;
  63. }
  64. private void DefaultConstant(ExpressionParameter parameter, ConstantExpression expression)
  65. {
  66. var isLeft = parameter.IsLeft;
  67. object value = ExpressionTool.GetValue(expression.Value, this.Context);
  68. value = ConvetValue(parameter, expression, value);
  69. if (IsEnumString(value))
  70. value = ConvertEnum(value);
  71. var baseParameter = parameter.BaseParameter;
  72. baseParameter.ChildExpression = expression;
  73. var isSetTempData = baseParameter.CommonTempData.HasValue() && baseParameter.CommonTempData.Equals(CommonTempDataType.Result);
  74. switch (parameter.Context.ResolveType)
  75. {
  76. case ResolveExpressType.SelectSingle:
  77. case ResolveExpressType.Update:
  78. case ResolveExpressType.SelectMultiple:
  79. baseParameter.CommonTempData = value;
  80. break;
  81. case ResolveExpressType.WhereSingle:
  82. case ResolveExpressType.WhereMultiple:
  83. if (isSetTempData)
  84. {
  85. baseParameter.CommonTempData = value;
  86. }
  87. else
  88. {
  89. var parentIsBinary = parameter.BaseParameter.CurrentExpression is BinaryExpression;
  90. var parentIsRoot = parameter.BaseParameter.CurrentExpression is LambdaExpression;
  91. var isBool = value != null && value.GetType() == UtilConstants.BoolType;
  92. if (parentIsRoot && isBool)
  93. {
  94. this.Context.Result.Append(value.ObjToBool() ? this.Context.DbMehtods.True() : this.Context.DbMehtods.False());
  95. break;
  96. }
  97. if (parentIsBinary && isBool)
  98. {
  99. var isLogicOperator =
  100. parameter.BaseExpression.NodeType == ExpressionType.And ||
  101. parameter.BaseExpression.NodeType == ExpressionType.AndAlso ||
  102. parameter.BaseExpression.NodeType == ExpressionType.Or ||
  103. parameter.BaseExpression.NodeType == ExpressionType.OrElse;
  104. if (isLogicOperator)
  105. {
  106. AppendMember(parameter, isLeft, (value.ObjToBool() ? this.Context.DbMehtods.True() : this.Context.DbMehtods.False()));
  107. break;
  108. }
  109. }
  110. if (value == null && parentIsBinary)
  111. {
  112. parameter.BaseParameter.ValueIsNull = true;
  113. value = this.Context.DbMehtods.Null();
  114. }
  115. AppendValue(parameter, isLeft, value);
  116. }
  117. break;
  118. case ResolveExpressType.FieldSingle:
  119. case ResolveExpressType.FieldMultiple:
  120. default:
  121. break;
  122. }
  123. }
  124. private object ConvetValue(ExpressionParameter parameter, ConstantExpression expression, object value)
  125. {
  126. if (expression.Type == UtilConstants.IntType && parameter.OppsiteExpression != null &&ExpressionTool.IsUnConvertExpress(parameter.OppsiteExpression))
  127. {
  128. var exp = ExpressionTool.RemoveConvert(parameter.OppsiteExpression);
  129. if (exp.Type == typeof(char)&& value is int) {
  130. value = Convert.ToChar(Convert.ToInt32(value));
  131. }
  132. }
  133. return value;
  134. }
  135. private object ConvertEnum(object value)
  136. {
  137. if (base.BaseParameter?.OppsiteExpression is UnaryExpression)
  138. {
  139. var oppsiteExpression = base.BaseParameter?.OppsiteExpression as UnaryExpression;
  140. var oppsiteValue = oppsiteExpression.Operand;
  141. if (oppsiteValue.Type.IsEnum())
  142. {
  143. value = UtilMethods.ChangeType2(value, oppsiteValue.Type).ToString();
  144. }
  145. }
  146. return value;
  147. }
  148. private bool IsEnumString(object value)
  149. {
  150. return this.Context.TableEnumIsString == true
  151. && value != null
  152. && value.IsInt()
  153. && base.BaseParameter?.OppsiteExpression != null;
  154. }
  155. }
  156. }