CaseWhenResolve.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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 CaseWhenResolve
  9. {
  10. List<MethodCallExpression> allMethods = new List<MethodCallExpression>();
  11. private ExpressionContext context = null;
  12. public CaseWhenResolve(MethodCallExpression expression, ExpressionContext context, Expression oppsiteExpression)
  13. {
  14. this.context = context;
  15. var currentExpression = expression;
  16. allMethods.Add(currentExpression);
  17. if (context.IsSingle && oppsiteExpression != null && oppsiteExpression is MemberExpression)
  18. {
  19. var childExpression = (oppsiteExpression as MemberExpression).Expression;
  20. if ((childExpression as ParameterExpression) != null)
  21. {
  22. this.context.SingleTableNameSubqueryShortName = (childExpression as ParameterExpression).Name;
  23. }
  24. }
  25. else if (context.IsSingle)
  26. {
  27. if ((context.Expression as LambdaExpression) != null)
  28. {
  29. this.context.SingleTableNameSubqueryShortName = (context.Expression as LambdaExpression).Parameters.First().Name;
  30. }
  31. }
  32. while (currentExpression != null)
  33. {
  34. var addItem = currentExpression.Object as MethodCallExpression;
  35. if (addItem != null)
  36. allMethods.Add(addItem);
  37. currentExpression = addItem;
  38. }
  39. }
  40. public string GetSql()
  41. {
  42. allMethods.Reverse();
  43. List<KeyValuePair<string, string>> sqls = new List<KeyValuePair<string, string>>();
  44. foreach (var methodExp in allMethods)
  45. {
  46. var isFirst = allMethods.First() == methodExp;
  47. var isLast = allMethods.Last() == methodExp;
  48. var isIsNegate = false;
  49. if (methodExp.Arguments.Count == 0)
  50. {
  51. sqls.Add(new KeyValuePair<string, string>(methodExp.Method.Name, "null"));
  52. }
  53. else
  54. {
  55. var exp = methodExp.Arguments[0];
  56. if (ExpressionTool.IsNegate(exp))
  57. {
  58. isIsNegate = true;
  59. exp = (exp as UnaryExpression).Operand;
  60. }
  61. if (methodExp.Method.Name.IsIn("Return", "End")&& exp .Type==UtilConstants.BoolType&& ExpressionTool.IsEqualOrLtOrGt(exp))
  62. {
  63. exp=ExpressionTool.GetConditionalExpression(exp);
  64. }
  65. else if (methodExp.Method.Name.IsIn("Return", "End") && exp.Type == UtilConstants.BoolType && ExpressionTool.GetMethodName(exp).IsIn("Contains", "StartsWith", "EndsWith"))
  66. {
  67. exp = ExpressionTool.GetConditionalExpression(exp);
  68. }
  69. var sql = SubTools.GetMethodValue(this.context, exp, this.context.IsSingle ? ResolveExpressType.WhereSingle : ResolveExpressType.WhereMultiple);
  70. if (methodExp.Method.Name == "IF")
  71. {
  72. var parameter = this.context.Parameters.FirstOrDefault(it => it.ParameterName == sql.Trim());
  73. if (parameter!=null&&parameter.Value is bool)
  74. {
  75. sql = Convert.ToBoolean(parameter.Value) ? " 1=1 " : " 1=2 ";
  76. this.context.Parameters.Remove(parameter);
  77. }
  78. }
  79. if (isIsNegate)
  80. {
  81. sql = " ("+sql + "*-1) ";
  82. }
  83. sqls.Add(new KeyValuePair<string, string>(methodExp.Method.Name, sql));
  84. }
  85. }
  86. var result = this.context.DbMehtods.CaseWhen(sqls);
  87. return result;
  88. }
  89. }
  90. }