SqlPart.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Text.RegularExpressions;
  5. using System.Linq;
  6. namespace SqlSugar
  7. {
  8. public abstract partial class SqlBuilderProvider : SqlBuilderAccessory, ISqlBuilder
  9. {
  10. #region Variable
  11. private string[] SqlSplicingOperator = new string[] { ">", ">=", "<", "<=", "(", ")", "!=", "<>", "not", "=", "||", "&&", "&", "|", "null", "is", "isnot", "like", "nolike", "+", "-", "*", "/", "%" };
  12. #endregion
  13. #region Root
  14. private string GetSqlPart(object value, List<SugarParameter> pars)
  15. {
  16. Check.Exception(value == null, $" FiledName is error ");
  17. if (IsSqlSplicingOperator(value))
  18. {
  19. return GetSqlSplicingOperator(value);
  20. }
  21. else if (IsString(value))
  22. {
  23. return GetSqlPartByString(value, pars);
  24. }
  25. else if (IsListObject(value))
  26. {
  27. return GetSqlPartByListObject(value, pars);
  28. }
  29. else if (IsObjectFunc(value))
  30. {
  31. return GetSqlPartByObjectFuncModel(value, pars);
  32. }
  33. else
  34. {
  35. return GetSqlPartError(value);
  36. }
  37. }
  38. #endregion
  39. #region Level2
  40. private static string GetSqlSplicingOperator(object value)
  41. {
  42. var result = value.ObjToString();
  43. if (result == "||") return "OR";
  44. else if (result == "&&") return "AND";
  45. else if (result.EqualCase("isnot")) return " IS NOT ";
  46. return result;
  47. }
  48. private static string GetSqlPartError(object value)
  49. {
  50. Check.Exception(value == null, $" {value} is error ");
  51. return null;
  52. }
  53. private string GetSqlPartByObjectFuncModel(object value, List<SugarParameter> pars)
  54. {
  55. var data = value as ObjectFuncModel;
  56. var obj = FuncModelToSql(data);
  57. pars.AddRange(obj.Value);
  58. return obj.Key;
  59. }
  60. private string GetSqlPartByListObject(object value, List<SugarParameter> pars)
  61. {
  62. var list = (value as List<object>);
  63. if (list.Count == 1)
  64. {
  65. return GetSqlPart(list.First(), pars).ObjToString();
  66. }
  67. else
  68. {
  69. Check.Exception(value == null, $" {value} is error ");
  70. return null;
  71. }
  72. }
  73. private string GetSqlPartByString(object value, List<SugarParameter> pars)
  74. {
  75. var valueString = value.ObjToString().Trim();
  76. if (Json2SqlHelper.IsSqlValue(valueString))
  77. {
  78. return GetParameterName(pars, valueString);
  79. }
  80. else
  81. {
  82. return this.GetTranslationColumnName(value.ObjToString().ToCheckField());
  83. }
  84. }
  85. #endregion
  86. #region Level3
  87. private string GetSplicingOperator(string valueString)
  88. {
  89. var parvalue = Regex.Match(valueString, @"\@s\:(.+)").Groups[1].Value;
  90. if (parvalue == null) parvalue = "";
  91. parvalue = parvalue.Trim();
  92. if (parvalue.ToLower().IsIn(SqlSplicingOperator))
  93. {
  94. return parvalue;
  95. }
  96. else
  97. {
  98. Check.ExceptionEasy($"{valueString} is error ", $"{valueString} 不是有效的拼接符号,拼接符号有:and、or、>=、<=、>、<、=、(、)");
  99. }
  100. return parvalue;
  101. }
  102. private string GetParameterName(List<SugarParameter> pars, string valueString)
  103. {
  104. object parvalue = Json2SqlHelper.GetValue(valueString);
  105. SugarParameter parameter = new SugarParameter("@p" + pars.Count(), parvalue);
  106. var type = Json2SqlHelper.GetType(valueString);
  107. parvalue = UtilMethods.ConvertDataByTypeName(type, parvalue.ObjToString());
  108. var parname = GetParameterName(pars, parvalue);
  109. return parname;
  110. }
  111. internal int GetParameterNameIndex = 100;
  112. private string GetParameterName(List<SugarParameter> pars, object parvalue)
  113. {
  114. var parname = "@p" + pars.Count() + "_" + (GetParameterNameIndex) + $"{this.QueryBuilder?.LambdaExpressions?.ParameterIndex}";
  115. SugarParameter parameter = new SugarParameter(parname, parvalue);
  116. pars.Add(parameter);
  117. GetParameterNameIndex++;
  118. if (this.QueryBuilder != null)
  119. this.QueryBuilder.LambdaExpressions.ParameterIndex++;
  120. return parname;
  121. }
  122. #endregion
  123. #region Helper
  124. private static bool IsListObject(object value)
  125. {
  126. return value.GetType() == typeof(List<object>);
  127. }
  128. private static bool IsString(object value)
  129. {
  130. return value.GetType() == typeof(string);
  131. }
  132. private static bool IsObjectFunc(object value)
  133. {
  134. return value is ObjectFuncModel;
  135. }
  136. private bool IsSqlSplicingOperator(object value)
  137. {
  138. return SqlSplicingOperator.Contains(value.ObjToString());
  139. }
  140. #endregion
  141. }
  142. }