SqlServerExpressionContext.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Linq;
  5. using System.Linq.Expressions;
  6. using System.Reflection;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace SqlSugar
  10. {
  11. public partial class SqlServerExpressionContext : ExpressionContext, ILambdaExpressions
  12. {
  13. public SqlSugarProvider Context { get; set; }
  14. public SqlServerExpressionContext()
  15. {
  16. base.DbMehtods = new SqlServerMethod();
  17. }
  18. }
  19. public partial class SqlServerMethod : DefaultDbMethod, IDbMethods
  20. {
  21. public override string JsonArrayLength(MethodCallExpressionModel model)
  22. {
  23. var parameter = model.Args[0];
  24. return $" (SELECT COUNT(*) FROM OPENJSON({parameter.MemberName})) ";
  25. }
  26. public override string JsonIndex(MethodCallExpressionModel model)
  27. {
  28. var parameter = model.Args[0];
  29. var parameter1 = model.Args[1];
  30. return $"JSON_VALUE({parameter.MemberName}, '$[{parameter1.MemberValue}]')";
  31. }
  32. public override string CharIndexNew(MethodCallExpressionModel model)
  33. {
  34. return string.Format("CHARINDEX ({1},{0})", model.Args[0].MemberName, model.Args[1].MemberName);
  35. }
  36. public override string WeekOfYear(MethodCallExpressionModel mode)
  37. {
  38. var parameterNameA = mode.Args[0].MemberName;
  39. return $"DATEPART(WEEK, {parameterNameA}) ";
  40. }
  41. public override string GetTableWithDataBase(string dataBaseName, string tableName)
  42. {
  43. return $"{dataBaseName}.dbo.{tableName}";
  44. }
  45. public override string GetForXmlPath()
  46. {
  47. return " FOR XML PATH('')),1,len(N','),'') ";
  48. }
  49. public override string GetStringJoinSelector(string result, string separator)
  50. {
  51. return $"stuff((SELECT cast(N'{separator}' as nvarchar(max)) + cast({result} as nvarchar(max))";
  52. }
  53. public override string DateValue(MethodCallExpressionModel model)
  54. {
  55. var parameter = model.Args[0];
  56. var parameter2 = model.Args[1];
  57. if (parameter.MemberName != null && parameter.MemberName is DateTime)
  58. {
  59. return string.Format(" datepart({0},'{1}') ", parameter2.MemberValue, parameter.MemberName);
  60. }
  61. else
  62. {
  63. return string.Format(" datepart({0},{1}) ", parameter2.MemberValue, parameter.MemberName);
  64. }
  65. }
  66. public override string HasValue(MethodCallExpressionModel model)
  67. {
  68. if (model.Args[0].Type == UtilConstants.GuidType)
  69. {
  70. var parameter = model.Args[0];
  71. return string.Format("( {0} IS NOT NULL )", parameter.MemberName);
  72. }
  73. else
  74. {
  75. var parameter = model.Args[0];
  76. return string.Format("( {0}<>'' AND {0} IS NOT NULL )", parameter.MemberName);
  77. }
  78. }
  79. public override string JsonField(MethodCallExpressionModel model)
  80. {
  81. var parameter = model.Args[0];
  82. var parameter1 = model.Args[1];
  83. //var parameter2 = model.Args[2];
  84. //var parameter3= model.Args[3];
  85. var result = GetJson(parameter.MemberName, parameter1.MemberName, model.Args.Count() == 2);
  86. if (model.Args.Count > 2)
  87. {
  88. result = GetJson(result, model.Args[2].MemberName, model.Args.Count() == 3);
  89. }
  90. if (model.Args.Count > 3)
  91. {
  92. result = GetJson(result, model.Args[3].MemberName, model.Args.Count() == 4);
  93. }
  94. if (model.Args.Count > 4)
  95. {
  96. result = GetJson(result, model.Args[4].MemberName, model.Args.Count() == 5);
  97. }
  98. if (model.Args.Count > 5)
  99. {
  100. result = GetJson(result, model.Args[5].MemberName, model.Args.Count() == 6);
  101. }
  102. return result;
  103. }
  104. private string GetJson(object memberName1, object memberName2, bool isLast)
  105. {
  106. return $"JSON_VALUE({memberName1}, '$.'+"+memberName2+")";
  107. }
  108. public override string JsonListObjectAny(MethodCallExpressionModel model)
  109. {
  110. return $"(EXISTS (SELECT * from OPENJSON({model.Args[0].MemberName}) " +
  111. $"WITH([value] NVARCHAR(MAX) '$.{model.Args[1].MemberValue.ToString().ToSqlFilter()}') " +
  112. $"WHERE [value] = {model.Args[2].MemberName}))";
  113. }
  114. public override string JsonArrayAny(MethodCallExpressionModel model)
  115. {
  116. return string.Format("(EXISTS(SELECT * from OPENJSON({0}) WHERE [value] = {1}))"
  117. , model.Args[0].MemberName
  118. , model.Args[1].MemberName
  119. );
  120. }
  121. public override string TrimEnd(MethodCallExpressionModel mode)
  122. {
  123. var parameterNameA = mode.Args[0].MemberName;
  124. var parameterNameB = mode.Args[1].MemberName;
  125. return $"CASE WHEN RIGHT({parameterNameA}, 1) = {parameterNameB} THEN LEFT({parameterNameA}, LEN({parameterNameA}) - 1) ELSE {parameterNameA} END";
  126. }
  127. public override string TrimStart(MethodCallExpressionModel mode)
  128. {
  129. var parameterNameA = mode.Args[0].MemberName;
  130. var parameterNameB = mode.Args[1].MemberName;
  131. return $" CASE WHEN LEFT({parameterNameA}, 1) = {parameterNameB} THEN RIGHT({parameterNameA}, LEN({parameterNameA}) - 1) ELSE {parameterNameA} END ";
  132. }
  133. public override string PadLeft(MethodCallExpressionModel mode)
  134. {
  135. var parameterNameA = mode.Args[0].MemberName;
  136. var parameterNameB = mode.Args[1].MemberName;
  137. var parameterNameC = mode.Args[2].MemberName;
  138. return $" CONCAT(REPLICATE({parameterNameC}, {parameterNameB} - LEN({parameterNameA})), {parameterNameA}) ";
  139. }
  140. public override string NewUid(MethodCallExpressionModel mode)
  141. {
  142. return " NEWID() ";
  143. }
  144. public override string FullTextContains(MethodCallExpressionModel mode)
  145. {
  146. var columns = mode.Args[0].MemberName;
  147. if (mode.Args[0].MemberValue is List<string>)
  148. {
  149. columns = "("+string.Join(",", mode.Args[0].MemberValue as List<string>)+")";
  150. }
  151. var searchWord = mode.Args[1].MemberName;
  152. return $" CONTAINS({columns},{searchWord}) ";
  153. }
  154. }
  155. }