BaseResolve_Item.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  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. /// <summary>
  10. ///BaseResolve New Expression
  11. /// </summary>
  12. public partial class BaseResolve
  13. {
  14. private void ResloveOtherMUC(ExpressionParameter parameter, Expression item, string asName)
  15. {
  16. if (ExpressionTool.GetMethodName(item) == "NewGuid")
  17. {
  18. parameter.Context.Result.Append(this.Context.GetAsString2(asName, this.Context.DbMehtods.NewUid(null)));
  19. return;
  20. }
  21. else if (ExpressionTool.GetMethodName(item) == "OnlyInSelectConvertToString")
  22. {
  23. AppendOnlyInSelectConvertToString(parameter, item, asName);
  24. return;
  25. }
  26. else if (ExpressionTool.GetMethodName(item) == "ToString"
  27. &&(item as MethodCallExpression)?.Arguments?.Count()==1
  28. && (item as MethodCallExpression)?.Object?.Type!=UtilConstants.DateType
  29. && this.Context?.SugarContext?.QueryBuilder!=null
  30. && (item as MethodCallExpression)?.Method?.ReflectedType?.Name!="SqlFunc"
  31. && (item as MethodCallExpression)?.Method?.ReflectedType?.Name != "Convert"
  32. )
  33. {
  34. var format=ExpressionTool.GetExpressionValue((item as MethodCallExpression)?.Arguments[0]);
  35. var childExpression = (item as MethodCallExpression)?.Object;
  36. var type=childExpression.Type;
  37. if (this.Context.SugarContext.QueryBuilder.QueryableFormats == null)
  38. {
  39. this.Context.SugarContext.QueryBuilder.QueryableFormats = new List<QueryableFormat>();
  40. }
  41. this.Context.SugarContext.QueryBuilder.QueryableFormats.Add(new QueryableFormat() {
  42. Format=format+"",
  43. PropertyName=asName,
  44. Type=type,
  45. TypeString=type.FullName,
  46. MethodName= "ToString"
  47. });
  48. parameter.Context.Result.Append(this.Context.GetAsString2(asName, GetNewExpressionValue(childExpression)));
  49. return;
  50. }
  51. else if (ExpressionTool.GetMethodName(item) == "ToString"
  52. && (item as MethodCallExpression)?.Arguments?.Count() == 0
  53. && (item as MethodCallExpression)?.Object?.Type?.IsEnum==true
  54. && this.Context?.SugarContext?.QueryBuilder != null)
  55. {
  56. var childExpression = (item as MethodCallExpression)?.Object;
  57. var type = childExpression.Type;
  58. if (this.Context.SugarContext.QueryBuilder.QueryableFormats == null)
  59. {
  60. this.Context.SugarContext.QueryBuilder.QueryableFormats = new List<QueryableFormat>();
  61. }
  62. this.Context.SugarContext.QueryBuilder.QueryableFormats.Add(new QueryableFormat()
  63. {
  64. PropertyName = asName,
  65. Type = type,
  66. TypeString = "Enum",
  67. MethodName = "ToString"
  68. });
  69. parameter.Context.Result.Append(this.Context.GetAsString2(asName, GetNewExpressionValue(childExpression)));
  70. return;
  71. }
  72. else if (ExpressionTool.GetMethodName(item) == "IsNull"
  73. && this.Context.SingleTableNameSubqueryShortName == null
  74. && this.BaseParameter?.CurrentExpression is NewExpression
  75. && (item as MethodCallExpression)?.Arguments?.FirstOrDefault() is MethodCallExpression
  76. && item?.ToString()?.Contains("Join") == true
  77. && ExpressionTool.GetParameters(this.BaseParameter?.CurrentExpression).Count() > 1)
  78. {
  79. var ps = ExpressionTool.GetParameters(this.BaseParameter?.CurrentExpression);
  80. this.Expression = item;
  81. this.Start();
  82. parameter.Context.Result.Append(this.Context.GetAsString2(asName, parameter.CommonTempData.ObjToString()));
  83. this.Context.SingleTableNameSubqueryShortName = ps.FirstOrDefault().Name;
  84. return;
  85. }
  86. this.Expression = item;
  87. this.Start();
  88. if (ExpressionTool.GetMethodName(item) == "MappingColumn")
  89. {
  90. parameter.Context.Result.Append(this.Context.GetAsString2(asName, parameter.CommonTempData.ObjToString()));
  91. }
  92. else if (parameter.CommonTempData?.Equals(CommonTempDataType.Append) == true)
  93. {
  94. parameter.Context.Result.TrimEnd();
  95. parameter.Context.Result.Append(" AS " + this.Context.GetTranslationColumnName(asName));
  96. }
  97. else
  98. {
  99. parameter.Context.Result.Append(this.Context.GetAsString2(asName, parameter.CommonTempData.ObjToString()));
  100. }
  101. }
  102. private void ResloveCountAny(ExpressionParameter parameter, Expression item, string asName)
  103. {
  104. if (this.Context.IsSingle && this.Context.SingleTableNameSubqueryShortName == null)
  105. {
  106. this.Context.SingleTableNameSubqueryShortName = item.ToString().Split('.').First();
  107. }
  108. parameter.Context.Result.Append(this.Context.GetAsString(asName, GetNewExpressionValue(item)));
  109. }
  110. private void ResloveNot(ExpressionParameter parameter, Expression item, string asName)
  111. {
  112. var asValue = GetAsNamePackIfElse(GetNewExpressionValue(item)).ObjToString();
  113. parameter.Context.Result.Append(this.Context.GetAsString(asName, asValue));
  114. }
  115. private void ResloveBoolMethod(ExpressionParameter parameter, Expression item, string asName)
  116. {
  117. this.Expression = item;
  118. if (ExpressionTool.GetMethodName(item) == "Any"&&!ExpressionTool.GetTopLevelMethodCalls(item).Contains("Subqueryable"))
  119. {
  120. parameter.CommonTempData = GetNewExpressionValue(item);
  121. }
  122. else if (ExpressionTool.GetMethodName(item) == "All" && !ExpressionTool.GetTopLevelMethodCalls(item).Contains("Subqueryable"))
  123. {
  124. parameter.CommonTempData = GetNewExpressionValue(item);
  125. }
  126. else
  127. {
  128. this.Start();
  129. }
  130. var sql = this.Context.DbMehtods.IIF(new MethodCallExpressionModel()
  131. {
  132. Args = new List<MethodCallExpressionArgs>() {
  133. new MethodCallExpressionArgs() {
  134. IsMember=true,
  135. MemberName=parameter.CommonTempData.ObjToString()
  136. },
  137. new MethodCallExpressionArgs() {
  138. IsMember=true,
  139. MemberName=1
  140. },
  141. new MethodCallExpressionArgs() {
  142. IsMember=true,
  143. MemberName=0
  144. }
  145. }
  146. });
  147. parameter.Context.Result.Append(this.Context.GetAsString(asName, sql));
  148. }
  149. private string ResolveClass(ExpressionParameter parameter, Expression item, string asName)
  150. {
  151. var mappingKeys = GetMappingColumns(parameter.CurrentExpression);
  152. var isSameType = mappingKeys.Keys.Count > 0;
  153. this.Context.SugarContext.QueryBuilder.MappingKeys = mappingKeys;
  154. this.Expression = item;
  155. if (this.Context.IsJoin && (item is MemberInitExpression || item is NewExpression))
  156. {
  157. List<NewExpressionInfo> newExpressionInfos = new List<NewExpressionInfo>();
  158. if (item is MemberInitExpression)
  159. {
  160. newExpressionInfos = ExpressionTool.GetNewexpressionInfos(item, this.Context, this);
  161. }
  162. else
  163. {
  164. newExpressionInfos = ExpressionTool.GetNewDynamicexpressionInfos(item, this.Context, this);
  165. }
  166. foreach (NewExpressionInfo newExpressionInfo in newExpressionInfos)
  167. {
  168. //var property=item.Type.GetProperties().Where(it => it.Name == newExpressionInfo.l).First();
  169. //asName = GetAsName(item, newExpressionInfo.ShortName, property);
  170. if (newExpressionInfo.Type == nameof(ConstantExpression))
  171. {
  172. parameter.Context.Result.Append(
  173. newExpressionInfo.RightDbName + " AS " +
  174. this.Context.SqlTranslationLeft + asName + "." + newExpressionInfo.LeftNameName + this.Context.SqlTranslationRight
  175. );
  176. }
  177. else
  178. {
  179. parameter.Context.Result.Append(this.Context.GetAsString(
  180. this.Context.SqlTranslationLeft + asName + "." + newExpressionInfo.LeftNameName + this.Context.SqlTranslationRight,
  181. newExpressionInfo.ShortName + "." + newExpressionInfo.RightDbName
  182. ));
  183. }
  184. }
  185. }
  186. else if (!this.Context.IsJoin && (item is MemberInitExpression || item is NewExpression))
  187. {
  188. List<NewExpressionInfo> newExpressionInfos = new List<NewExpressionInfo>();
  189. if (item is MemberInitExpression)
  190. {
  191. newExpressionInfos = ExpressionTool.GetNewexpressionInfos(item, this.Context, this);
  192. }
  193. else
  194. {
  195. newExpressionInfos = ExpressionTool.GetNewDynamicexpressionInfos(item, this.Context, this);
  196. }
  197. //mappingKeys = new Dictionary<string, string>();
  198. foreach (NewExpressionInfo newExpressionInfo in newExpressionInfos)
  199. {
  200. //var property=item.Type.GetProperties().Where(it => it.Name == newExpressionInfo.l).First();
  201. //asName = GetAsName(item, newExpressionInfo.ShortName, property);
  202. mappingKeys.Add("Single_" + newExpressionInfo.LeftNameName, asName + "." + newExpressionInfo.LeftNameName);
  203. if (newExpressionInfo.Type == nameof(ConstantExpression))
  204. {
  205. this.Context.SugarContext.QueryBuilder.MappingKeys = mappingKeys;
  206. parameter.Context.Result.Append($" {newExpressionInfo.RightDbName} AS {this.Context.SqlTranslationLeft}{asName}.{newExpressionInfo.LeftNameName}{this.Context.SqlTranslationRight} ");
  207. }
  208. else
  209. {
  210. this.Context.SugarContext.QueryBuilder.MappingKeys = mappingKeys;
  211. parameter.Context.Result.Append(this.Context.GetAsString(
  212. this.Context.SqlTranslationLeft + asName + "." + newExpressionInfo.LeftNameName + this.Context.SqlTranslationRight,
  213. newExpressionInfo.RightDbName
  214. ));
  215. }
  216. }
  217. }
  218. else if (IsExtSqlFuncObj(item))
  219. {
  220. var value = GetNewExpressionValue(item);
  221. parameter.Context.Result.Append($" {value} AS {asName} ");
  222. }
  223. else if (IsSubToList(item))
  224. {
  225. var value = GetNewExpressionValue(item);
  226. if (this.Context.SugarContext.QueryBuilder.SubToListParameters == null)
  227. this.Context.SugarContext.QueryBuilder.SubToListParameters = new Dictionary<string, object>();
  228. if (!this.Context.SugarContext.QueryBuilder.SubToListParameters.ContainsKey(asName))
  229. {
  230. this.Context.SugarContext.QueryBuilder.SubToListParameters.Add(asName, value);
  231. }
  232. //throw new Exception("子查询ToList开发中..");
  233. }
  234. else
  235. {
  236. asName = GetAsNameResolveAnObject(parameter, item, asName, isSameType);
  237. }
  238. return asName;
  239. }
  240. private void ResolveBinary(Expression item, string asName)
  241. {
  242. if (this.Context.Result.IsLockCurrentParameter == false)
  243. {
  244. var newContext = this.Context.GetCopyContextWithMapping();
  245. var resolveExpressType = this.Context.IsSingle ? ResolveExpressType.WhereSingle : ResolveExpressType.WhereMultiple;
  246. if (resolveExpressType == ResolveExpressType.WhereSingle&& item is BinaryExpression)
  247. {
  248. var binaryExp = (item as BinaryExpression);
  249. if (ExpressionTool.ContainsMethodName(binaryExp, "Subquery"))
  250. {
  251. resolveExpressType = ResolveExpressType.WhereMultiple;
  252. }
  253. if (this.Context.Expression!=null&&this.Context.SingleTableNameSubqueryShortName.IsNullOrEmpty())
  254. {
  255. this.Context.SingleTableNameSubqueryShortName = (this.Context.Expression as LambdaExpression)?.Parameters?.FirstOrDefault()?.Name;
  256. }
  257. }
  258. newContext.Resolve(item, resolveExpressType);
  259. this.Context.Index = newContext.Index;
  260. this.Context.ParameterIndex = newContext.ParameterIndex;
  261. if (newContext.Parameters.HasValue())
  262. {
  263. this.Context.Parameters.AddRange(newContext.Parameters);
  264. }
  265. if (ExpressionTool.IsEqualOrLtOrGt(item))
  266. {
  267. var sql = newContext.Result.GetString();
  268. var pTrue = AppendParameter(true);
  269. var pFalse = AppendParameter(false);
  270. sql =this.Context.DbMehtods.IIF(new MethodCallExpressionModel() {
  271. Args=new List<MethodCallExpressionArgs>()
  272. {
  273. new MethodCallExpressionArgs(){ MemberName=sql,MemberValue=sql,IsMember=true } ,
  274. new MethodCallExpressionArgs(){ MemberName=pTrue,MemberValue=pTrue,IsMember=true },
  275. new MethodCallExpressionArgs(){ MemberName=pFalse,MemberValue=pFalse,IsMember=true }
  276. }
  277. });
  278. this.Context.Result.Append(this.Context.GetAsString(asName, sql));
  279. }
  280. else
  281. {
  282. this.Context.Result.Append(this.Context.GetAsString(asName, newContext.Result.GetString()));
  283. }
  284. this.Context.Result.CurrentParameter = null;
  285. if (this.Context.SingleTableNameSubqueryShortName.IsNullOrEmpty() && newContext.SingleTableNameSubqueryShortName.HasValue())
  286. {
  287. this.Context.SingleTableNameSubqueryShortName = newContext.SingleTableNameSubqueryShortName;
  288. }
  289. }
  290. }
  291. private void ResolveUnaryExpConst(ExpressionParameter parameter, Expression item, string asName)
  292. {
  293. if (this.Context.Result.IsLockCurrentParameter == false)
  294. {
  295. this.Expression = ((UnaryExpression)item).Operand;
  296. this.Start();
  297. string parameterName = this.Context.SqlParameterKeyWord + "constant" + this.Context.ParameterIndex;
  298. this.Context.ParameterIndex++;
  299. parameter.Context.Result.Append(this.Context.GetAsString(asName, parameterName));
  300. this.Context.Parameters.Add(new SugarParameter(parameterName, parameter.CommonTempData));
  301. }
  302. }
  303. private void ResolveUnaryExpMem(ExpressionParameter parameter, Expression item, string asName)
  304. {
  305. if (this.Context.Result.IsLockCurrentParameter == false)
  306. {
  307. var expression = ((UnaryExpression)item).Operand as MemberExpression;
  308. var isDateTimeNow = ((UnaryExpression)item).Operand.ToString() == "DateTime.Now";
  309. if (expression.Expression == null && !isDateTimeNow)
  310. {
  311. this.Context.Result.CurrentParameter = parameter;
  312. this.Context.Result.IsLockCurrentParameter = true;
  313. parameter.IsAppendTempDate();
  314. this.Expression = item;
  315. this.Start();
  316. parameter.IsAppendResult();
  317. this.Context.Result.Append(this.Context.GetAsString(asName, parameter.CommonTempData.ObjToString()));
  318. this.Context.Result.CurrentParameter = null;
  319. }
  320. else if (expression.Expression is ConstantExpression || isDateTimeNow)
  321. {
  322. string parameterName = this.Context.SqlParameterKeyWord + "constant" + this.Context.ParameterIndex;
  323. this.Context.ParameterIndex++;
  324. parameter.Context.Result.Append(this.Context.GetAsString(asName, parameterName));
  325. this.Context.Parameters.Add(new SugarParameter(parameterName, ExpressionTool.GetMemberValue(expression.Member, expression)));
  326. }
  327. else
  328. {
  329. this.Context.Result.CurrentParameter = parameter;
  330. this.Context.Result.IsLockCurrentParameter = true;
  331. parameter.IsAppendTempDate();
  332. this.Expression = expression;
  333. this.Start();
  334. parameter.IsAppendResult();
  335. this.Context.Result.Append(this.Context.GetAsString(asName, parameter.CommonTempData.ObjToString()));
  336. this.Context.Result.CurrentParameter = null;
  337. }
  338. }
  339. }
  340. private void ResolveMemberOther(ExpressionParameter parameter, Expression item, string asName)
  341. {
  342. if (this.Context.Result.IsLockCurrentParameter == false)
  343. {
  344. this.Context.Result.CurrentParameter = parameter;
  345. this.Context.Result.IsLockCurrentParameter = true;
  346. parameter.IsAppendTempDate();
  347. this.Expression = item;
  348. if (IsBoolValue(item))
  349. {
  350. this.Expression = (item as MemberExpression).Expression;
  351. }
  352. this.Start();
  353. parameter.IsAppendResult();
  354. this.Context.Result.Append(this.Context.GetAsString2(asName, parameter.CommonTempData.ObjToString()));
  355. this.Context.Result.CurrentParameter = null;
  356. }
  357. }
  358. private void ResolveMemberConst(ExpressionParameter parameter, Expression item, string asName)
  359. {
  360. this.Expression = item;
  361. this.Start();
  362. string parameterName = this.Context.SqlParameterKeyWord + "constant" + this.Context.ParameterIndex;
  363. this.Context.ParameterIndex++;
  364. parameter.Context.Result.Append(this.Context.GetAsString(asName, parameterName));
  365. this.Context.Parameters.Add(new SugarParameter(parameterName, parameter.CommonTempData));
  366. }
  367. private void ResolveMember(ExpressionParameter parameter, Expression item, string asName)
  368. {
  369. var paramterValue = ExpressionTool.GetPropertyValue(item as MemberExpression);
  370. string parameterName = this.Context.SqlParameterKeyWord + "constant" + this.Context.ParameterIndex;
  371. this.Context.ParameterIndex++;
  372. parameter.Context.Result.Append(this.Context.GetAsString(asName, parameterName));
  373. this.Context.Parameters.Add(new SugarParameter(parameterName, paramterValue));
  374. }
  375. private void ResolveConst(ExpressionParameter parameter, Expression item, string asName)
  376. {
  377. this.Expression = item;
  378. this.Start();
  379. string parameterName = this.Context.SqlParameterKeyWord + "constant" + this.Context.ParameterIndex;
  380. this.Context.ParameterIndex++;
  381. parameter.Context.Result.Append(this.Context.GetAsString(asName, parameterName));
  382. this.Context.Parameters.Add(new SugarParameter(parameterName, parameter.CommonTempData));
  383. }
  384. }
  385. }