NewExpressionResolve.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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. using System.Threading.Tasks;
  8. namespace SqlSugar
  9. {
  10. public class NewExpressionResolve : BaseResolve
  11. {
  12. public NewExpressionResolve(ExpressionParameter parameter) : base(parameter)
  13. {
  14. var expression = base.Expression as NewExpression;
  15. if (expression.Type.IsIn(UtilConstants.DateType,UtilConstants.GuidType))
  16. {
  17. NewValueType(parameter, expression);
  18. return;
  19. }
  20. switch (parameter.Context.ResolveType)
  21. {
  22. case ResolveExpressType.WhereSingle:
  23. Check.ThrowNotSupportedException(expression.ToString());
  24. break;
  25. case ResolveExpressType.WhereMultiple:
  26. Check.ThrowNotSupportedException(expression.ToString());
  27. break;
  28. case ResolveExpressType.SelectSingle:
  29. Check.Exception(expression.Type == UtilConstants.DateType, "ThrowNotSupportedException {0} ", expression.ToString());
  30. Select(expression, parameter, true);
  31. break;
  32. case ResolveExpressType.SelectMultiple:
  33. Check.Exception(expression.Type == UtilConstants.DateType, "ThrowNotSupportedException {0} ", expression.ToString());
  34. Select(expression, parameter, false);
  35. break;
  36. case ResolveExpressType.FieldSingle:
  37. Check.ThrowNotSupportedException(expression.ToString());
  38. break;
  39. case ResolveExpressType.FieldMultiple:
  40. case ResolveExpressType.ArrayMultiple:
  41. case ResolveExpressType.ArraySingle:
  42. ArraySingle(expression);
  43. break;
  44. case ResolveExpressType.Join:
  45. Join(expression);
  46. break;
  47. default:
  48. break;
  49. }
  50. }
  51. private void Join(NewExpression expression)
  52. {
  53. base.Context.ResolveType = ResolveExpressType.WhereMultiple;
  54. int i = 0;
  55. foreach (var item in expression.Arguments)
  56. {
  57. if (item.Type != typeof(JoinType))
  58. {
  59. base.Expression = item;
  60. base.Start();
  61. }
  62. if (item.Type == typeof(JoinType))
  63. {
  64. var joinValue = item.ObjToString();
  65. if (joinValue.Contains("("))
  66. {
  67. joinValue = ExpressionTool.DynamicInvoke(item).ObjToString();
  68. }
  69. if (i > 0)
  70. {
  71. base.Context.Result.Append("," + joinValue + ",");
  72. }
  73. else
  74. {
  75. base.Context.Result.Append(joinValue + ",");
  76. }
  77. ++i;
  78. }
  79. }
  80. }
  81. private void ArraySingle(NewExpression expression)
  82. {
  83. foreach (var item in expression.Arguments)
  84. {
  85. if (IsDateValue(item))
  86. {
  87. var value = GetNewExpressionValue(item);
  88. base.Context.Result.Append(value);
  89. }
  90. else
  91. {
  92. base.Expression = item;
  93. base.Start();
  94. }
  95. }
  96. }
  97. private bool IsDateValue(Expression item)
  98. {
  99. var isMember = item is MemberExpression;
  100. if (isMember)
  101. {
  102. var m = (item as MemberExpression);
  103. var isInt= m.Type == UtilConstants.IntType;
  104. if (m.Expression != null && isInt&& m.Expression is MemberExpression)
  105. {
  106. var mm = (m.Expression as MemberExpression);
  107. if (m.Member.Name.IsIn("Year", "Day", "Month")&&mm.Type==UtilConstants.DateType)
  108. {
  109. return true;
  110. }
  111. }
  112. }
  113. return false;
  114. }
  115. private void NewValueType(ExpressionParameter parameter, NewExpression expression)
  116. {
  117. try
  118. {
  119. var value = ExpressionTool.DynamicInvoke(expression);
  120. var isSetTempData = parameter.CommonTempData.HasValue() && parameter.CommonTempData.Equals(CommonTempDataType.Result);
  121. if (isSetTempData)
  122. {
  123. parameter.CommonTempData = value;
  124. }
  125. else
  126. {
  127. AppendValue(parameter, parameter.IsLeft, value);
  128. }
  129. }
  130. catch (Exception ex)
  131. {
  132. Check.Exception(expression.Type == UtilConstants.DateType, "ThrowNotSupportedException {0} ", ex.ToString());
  133. }
  134. }
  135. private void Select(NewExpression expression, ExpressionParameter parameter, bool isSingle)
  136. {
  137. if (expression.Arguments != null)
  138. {
  139. int i = 0;
  140. foreach (var item in expression.Arguments)
  141. {
  142. string memberName = expression.Members[i].Name;
  143. if (this.Context?.SugarContext?.QueryBuilder?.AppendNavInfo?.MappingNavProperties?.ContainsKey(memberName) == true)
  144. {
  145. ++i;
  146. continue;
  147. }
  148. ++i;
  149. ResolveNewExpressions(parameter, item, memberName);
  150. }
  151. }
  152. }
  153. }
  154. }