MethodCallExpressionResolve_Helper.cs 55 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Linq.Expressions;
  6. using System.Text;
  7. using System.Text.RegularExpressions;
  8. using System.Threading.Tasks;
  9. namespace SqlSugar
  10. {
  11. /// <summary>
  12. ///MethodCall Helper
  13. /// </summary>
  14. public partial class MethodCallExpressionResolve : BaseResolve
  15. {
  16. private void CusMethod(ExpressionParameter parameter, MethodCallExpression express, bool? isLeft)
  17. {
  18. try
  19. {
  20. OneToManyNavgateExpression nav = new OneToManyNavgateExpression(this.Context?.SugarContext?.Context, this);
  21. nav.ParameterIndex = this.Context.ParameterIndex;
  22. this.Context.ParameterIndex++;
  23. if (nav.IsNavgate(express))
  24. {
  25. var sql = nav.GetSql();
  26. SetNavigateResult();
  27. this.Context.SingleTableNameSubqueryShortName = nav.ShorName;
  28. base.AppendValue(parameter, isLeft, sql);
  29. return;
  30. }
  31. OneToManyNavgateExpressionN nav2 = new OneToManyNavgateExpressionN(this.Context?.SugarContext?.Context, this);
  32. if (nav2.IsNavgate(express))
  33. {
  34. var sql = nav2.GetSql();
  35. SetNavigateResult();
  36. this.Context.SingleTableNameSubqueryShortName = nav2.shorName;
  37. base.AppendValue(parameter, isLeft, sql);
  38. return;
  39. }
  40. var constValue = ExpressionTool.DynamicInvoke(express);
  41. if (constValue is MapperSql)
  42. {
  43. constValue = (constValue as MapperSql).Sql;
  44. base.AppendValue(parameter, isLeft, constValue);
  45. return;
  46. }
  47. parameter.BaseParameter.CommonTempData = constValue;
  48. var parameterName = base.AppendParameter(constValue);
  49. if (parameter.BaseParameter.CommonTempData != null && parameter.BaseParameter.CommonTempData.Equals(CommonTempDataType.Result))
  50. {
  51. this.Context.Result.Append(parameterName);
  52. }
  53. else
  54. {
  55. base.AppendValue(parameter, isLeft, parameterName);
  56. }
  57. }
  58. catch (Exception ex)
  59. {
  60. if (ex is SqlSugarException)
  61. {
  62. Check.Exception(true, string.Format(ex.Message, express.Method.Name));
  63. }
  64. else
  65. {
  66. Check.Exception(true, string.Format(ErrorMessage.MethodError, express.Method.Name));
  67. }
  68. }
  69. }
  70. private static bool MethodValueIsTrue(object methodValue)
  71. {
  72. return methodValue != null && methodValue.ToString().Contains("THEN true ELSE false END");
  73. }
  74. private object packIfElse(object methodValue)
  75. {
  76. methodValue = this.Context.DbMehtods.CaseWhen(new List<KeyValuePair<string, string>>() {
  77. new KeyValuePair<string, string>("IF",methodValue.ObjToString()),
  78. new KeyValuePair<string, string>("Return", this.Context.DbMehtods.TrueValue()),
  79. new KeyValuePair<string, string>("End", this.Context.DbMehtods.FalseValue())
  80. });
  81. return methodValue;
  82. }
  83. private void SetShortName(Expression exp)
  84. {
  85. var lamExp = (exp as LambdaExpression);
  86. if (lamExp.Parameters != null && lamExp.Parameters.Count == 1)
  87. {
  88. if (this.Context.SingleTableNameSubqueryShortName == null)
  89. {
  90. this.Context.SingleTableNameSubqueryShortName = lamExp.Parameters.First().Name;
  91. }
  92. }
  93. }
  94. private void AppendItem(ExpressionParameter parameter, string name, IEnumerable<Expression> args, MethodCallExpressionModel model, Expression item)
  95. {
  96. if (ExpressionTool.IsUnConvertExpress(item))
  97. {
  98. item = (item as UnaryExpression).Operand;
  99. }
  100. if (this.Context.IsSingle && args.Any(it => ExpressionTool.IsSubQuery(it)) && base.BaseParameter?.BaseParameter?.BaseParameter?.CurrentExpression != null)
  101. {
  102. var exp = base.BaseParameter?.BaseParameter?.BaseParameter?.CurrentExpression;
  103. if (exp is LambdaExpression)
  104. {
  105. SetShortName(exp);
  106. }
  107. else if (exp is UnaryExpression)
  108. {
  109. exp = base.BaseParameter?.BaseParameter?.BaseParameter?.BaseParameter?.CurrentExpression;
  110. if (exp is LambdaExpression)
  111. {
  112. SetShortName(exp);
  113. }
  114. }
  115. }
  116. else if (this.Context.IsSingle && args.Any(it => ExpressionTool.IsIsNullSubQuery(it)))
  117. {
  118. var exp = base.BaseParameter?.BaseParameter?.BaseParameter?.CurrentExpression;
  119. if (exp is LambdaExpression)
  120. {
  121. SetShortName(exp);
  122. }
  123. else if (exp is UnaryExpression)
  124. {
  125. exp = base.BaseParameter?.BaseParameter?.BaseParameter?.BaseParameter?.CurrentExpression;
  126. if (exp is LambdaExpression)
  127. {
  128. SetShortName(exp);
  129. }
  130. }
  131. }
  132. var isBinaryExpression = item is BinaryExpression || item is MethodCallExpression;
  133. var isConst = item is ConstantExpression;
  134. var isIIF = name == "IIF";
  135. var isSubIIF = (isIIF && item.ToString().StartsWith("IIF"));
  136. var isIFFBoolMember = isIIF && (item is MemberExpression) && (item as MemberExpression).Type == UtilConstants.BoolType;
  137. var isIFFUnary = isIIF && (item is UnaryExpression) && (item as UnaryExpression).Operand.Type == UtilConstants.BoolType;
  138. var isIFFBoolBinary = isIIF && (item is BinaryExpression) && (item as BinaryExpression).Type == UtilConstants.BoolType;
  139. var isIFFBoolMethod = isIIF && (item is MethodCallExpression) && (item as MethodCallExpression).Type == UtilConstants.BoolType;
  140. var isFirst = item == args.First();
  141. var isBoolValue = item.Type == UtilConstants.BoolType && item.ToString().StartsWith("value(");
  142. var isLength =ExpressionTool.GetIsLength(item);
  143. if (isFirst && isIIF && isConst)
  144. {
  145. var value = (item as ConstantExpression).Value.ObjToBool() ? this.Context.DbMehtods.True() : this.Context.DbMehtods.False();
  146. var methodCallExpressionArgs = new MethodCallExpressionArgs()
  147. {
  148. IsMember = true,
  149. MemberName = value,
  150. MemberValue = value
  151. };
  152. model.Args.Add(methodCallExpressionArgs);
  153. }
  154. else if (isFirst && isIIF && isIFFBoolMember && (item as MemberExpression)?.Member?.Name == "HasValue")
  155. {
  156. var value = base.GetNewExpressionValue(item);
  157. var methodCallExpressionArgs = new MethodCallExpressionArgs()
  158. {
  159. IsMember = true,
  160. MemberName = value,
  161. MemberValue = value
  162. };
  163. model.Args.Add(methodCallExpressionArgs);
  164. }
  165. else if (name != null && name != "MappingColumn" && !name.StartsWith("Row") && ExpressionTool.GetMethodName(item) == "Format" && ExpressionTool.GetParameters(item).Count == 0)
  166. {
  167. var value = ExpressionTool.DynamicInvoke(item);
  168. var p = AppendParameter(value);
  169. var methodCallExpressionArgs = new MethodCallExpressionArgs()
  170. {
  171. IsMember = true,
  172. MemberName = p,
  173. MemberValue = p
  174. };
  175. model.Args.Add(methodCallExpressionArgs);
  176. }
  177. else if (isLength)
  178. {
  179. var sql = GetNewExpressionValue(item);
  180. var value = this.Context.DbMehtods.Length(new MethodCallExpressionModel()
  181. {
  182. Name = "Length",
  183. Args = new List<MethodCallExpressionArgs>() {
  184. new MethodCallExpressionArgs(){
  185. IsMember=true,
  186. MemberName=sql,
  187. MemberValue=sql
  188. }
  189. }
  190. });
  191. var methodCallExpressionArgs = new MethodCallExpressionArgs()
  192. {
  193. IsMember = true,
  194. MemberName = value,
  195. MemberValue = value
  196. };
  197. model.Args.Add(methodCallExpressionArgs);
  198. }
  199. else if (isIFFUnary && !isFirst)
  200. {
  201. AppendModelByIIFMember(parameter, model, (item as UnaryExpression).Operand);
  202. }
  203. else if (isIFFBoolMember && !isFirst)
  204. {
  205. AppendModelByIIFMember(parameter, model, item);
  206. }
  207. else if (isIFFBoolBinary && !isFirst)
  208. {
  209. var binaryExp = item as BinaryExpression;
  210. var binaryExpEqual = binaryExp != null && ExpressionTool.IsComparisonOperatorBool(binaryExp);
  211. if (binaryExpEqual)
  212. {
  213. var expValue = GetNewExpressionValue(item);
  214. expValue = this.Context.DbMehtods.IIF(new MethodCallExpressionModel()
  215. {
  216. Name = "IIF",
  217. Args = new List<MethodCallExpressionArgs>()
  218. {
  219. new MethodCallExpressionArgs(){
  220. IsMember=true,
  221. MemberName=expValue
  222. },
  223. new MethodCallExpressionArgs(){
  224. IsMember=true,
  225. MemberName= Context.DbMehtods.TrueValue()
  226. },
  227. new MethodCallExpressionArgs(){
  228. IsMember=true,
  229. MemberName= Context.DbMehtods.FalseValue()
  230. }
  231. }
  232. });
  233. model.Args.Add(new MethodCallExpressionArgs()
  234. {
  235. IsMember = false,
  236. MemberName = expValue,
  237. MemberValue = expValue
  238. });
  239. }
  240. else
  241. {
  242. AppendModelByIIFBinary(parameter, model, item);
  243. }
  244. }
  245. else if (isIFFBoolMethod && !isFirst)
  246. {
  247. AppendModelByIIFMethod(parameter, model, item);
  248. }
  249. else if (isBinaryExpression)
  250. {
  251. model.Args.Add(GetMethodCallArgs(parameter, item, name));
  252. }
  253. else if (isSubIIF)
  254. {
  255. model.Args.Add(GetMethodCallArgs(parameter, item));
  256. }
  257. else if (isBoolValue && !isIIF && item is MemberExpression)
  258. {
  259. model.Args.Add(GetMethodCallArgs(parameter, (item as MemberExpression).Expression));
  260. }
  261. else if (isBoolValue && isIIF && item is MemberExpression&&ExpressionTool.GetParameters(item).Count()==0)
  262. {
  263. var expValue = AppendParameter(ExpressionTool.DynamicInvoke(item));
  264. expValue = this.Context.DbMehtods.Equals(new MethodCallExpressionModel()
  265. {
  266. Name = "Equals",
  267. Args = new List<MethodCallExpressionArgs>()
  268. {
  269. new MethodCallExpressionArgs(){
  270. IsMember=true,
  271. MemberName=expValue
  272. },
  273. new MethodCallExpressionArgs(){
  274. IsMember=true,
  275. MemberName= Context.DbMehtods.TrueValue()
  276. }
  277. }
  278. });
  279. model.Args.Add(new MethodCallExpressionArgs()
  280. {
  281. IsMember = false,
  282. MemberName = expValue,
  283. MemberValue = expValue
  284. });
  285. }
  286. else if (isBoolValue && isIIF && item is MemberExpression)
  287. {
  288. var argItem = GetMethodCallArgs(parameter, (item as MemberExpression).Expression);
  289. if (argItem.IsMember)
  290. {
  291. var pName = this.Context.SqlParameterKeyWord + "true_0";
  292. if (!this.Context.Parameters.Any(it => it.ParameterName == pName))
  293. this.Context.Parameters.Add(new SugarParameter(pName, true));
  294. argItem.MemberName = $" {argItem.MemberName}={pName} ";
  295. }
  296. model.Args.Add(argItem);
  297. }
  298. else if (name.IsIn("ListAny", "ListAll") && item is LambdaExpression)
  299. {
  300. var sql = GetNewExpressionValue(item, ResolveExpressType.WhereMultiple);
  301. var lamExp = (item as LambdaExpression);
  302. var pExp = lamExp.Parameters[0];
  303. var pname = pExp.Name;
  304. model.Args.Add(new MethodCallExpressionArgs()
  305. {
  306. MemberValue = new ListAnyParameter()
  307. {
  308. Sql = sql,
  309. Name = pname,
  310. Columns = this.Context.SugarContext.Context.EntityMaintenance.GetEntityInfo(pExp.Type).Columns,
  311. ConvetColumnFunc = this.Context.GetTranslationColumnName
  312. }
  313. });
  314. if (this.Context.IsSingle && this.Context.SingleTableNameSubqueryShortName == null)
  315. {
  316. ParameterExpressionVisitor visitor = new ParameterExpressionVisitor();
  317. visitor.Visit(lamExp);
  318. var tableParamter = visitor.Parameters.FirstOrDefault(it => it.Name != pname);
  319. if (tableParamter != null)
  320. {
  321. this.Context.SingleTableNameSubqueryShortName = tableParamter.Name;
  322. }
  323. }
  324. }
  325. else
  326. {
  327. AppendModel(parameter, model, item, name, args);
  328. }
  329. }
  330. private void AppendModelByIIFMember(ExpressionParameter parameter, MethodCallExpressionModel model, Expression item)
  331. {
  332. parameter.CommonTempData = CommonTempDataType.Result;
  333. base.Expression = item;
  334. base.Start();
  335. var methodCallExpressionArgs = new MethodCallExpressionArgs()
  336. {
  337. IsMember = parameter.ChildExpression is MemberExpression,
  338. MemberName = parameter.CommonTempData
  339. };
  340. if (methodCallExpressionArgs.IsMember && parameter.ChildExpression != null && parameter.ChildExpression.ToString() == "DateTime.Now")
  341. {
  342. methodCallExpressionArgs.IsMember = false;
  343. }
  344. var value = methodCallExpressionArgs.MemberName;
  345. if (methodCallExpressionArgs.IsMember)
  346. {
  347. var childExpression = parameter.ChildExpression as MemberExpression;
  348. if (childExpression.Expression != null && childExpression.Expression is ConstantExpression)
  349. {
  350. methodCallExpressionArgs.IsMember = false;
  351. }
  352. }
  353. if (methodCallExpressionArgs.IsMember == false)
  354. {
  355. var parameterName = this.Context.SqlParameterKeyWord + ExpressionConst.MethodConst + this.Context.ParameterIndex;
  356. this.Context.ParameterIndex++;
  357. methodCallExpressionArgs.MemberName = parameterName;
  358. methodCallExpressionArgs.MemberValue = value;
  359. this.Context.Parameters.Add(new SugarParameter(parameterName, value));
  360. }
  361. model.Args.Add(methodCallExpressionArgs);
  362. parameter.ChildExpression = null;
  363. }
  364. private void AppendModelByIIFBinary(ExpressionParameter parameter, MethodCallExpressionModel model, Expression item)
  365. {
  366. Check.Exception(true, "The SqlFunc.IIF(arg1,arg2,arg3) , {0} argument do not support ", item.ToString());
  367. }
  368. private void AppendModelByIIFMethod(ExpressionParameter parameter, MethodCallExpressionModel model, Expression item)
  369. {
  370. var methodExpression = item as MethodCallExpression;
  371. if (methodExpression.Method.Name.IsIn("ToBool", "ToBoolean", "IIF"))
  372. {
  373. model.Args.Add(base.GetMethodCallArgs(parameter, item));
  374. }
  375. else if (methodExpression.Method.Name.IsIn("Contains", "EndsWith", "StartsWith"))
  376. {
  377. Expression conditionalExpression =ExpressionTool.GetConditionalExpression(item);
  378. model.Args.Add(base.GetMethodCallArgs(parameter, conditionalExpression));
  379. }
  380. else
  381. {
  382. Check.Exception(true, "The SqlFunc.IIF(arg1,arg2,arg3) , {0} argument do not support ", item.ToString());
  383. }
  384. }
  385. private void AppendModel(ExpressionParameter parameter, MethodCallExpressionModel model, Expression item,string name, IEnumerable<Expression> args)
  386. {
  387. parameter.CommonTempData = CommonTempDataType.Result;
  388. base.Expression = item;
  389. var isRemoveParamter = false;
  390. var isNegate = false;
  391. if (item.Type == UtilConstants.DateType && parameter.CommonTempData.ObjToString() == CommonTempDataType.Result.ToString() && item.ToString() == "DateTime.Now.Date")
  392. {
  393. parameter.CommonTempData = DateTime.Now.Date;
  394. }
  395. else if (item is ConditionalExpression)
  396. {
  397. parameter.CommonTempData = GetNewExpressionValue(item);
  398. }
  399. else if (IsNot(item))
  400. {
  401. parameter.CommonTempData = GetNewExpressionValue(item);
  402. }
  403. else if (IsDateDate(item))
  404. {
  405. parameter.CommonTempData = GetNewExpressionValue(item);
  406. }
  407. else if (IsDateValue(item))
  408. {
  409. parameter.CommonTempData = GetNewExpressionValue(item);
  410. }
  411. else if (model.Name == "ToString" && item is ConstantExpression && (item as ConstantExpression).Type.IsEnum())
  412. {
  413. parameter.CommonTempData = item.ToString();
  414. }
  415. else if (IsDateItemValue(item))
  416. {
  417. parameter.CommonTempData = GetNewExpressionValue(item);
  418. }
  419. else if (name == "Format" && item is NewArrayExpression)
  420. {
  421. var exps = (item as NewArrayExpression).Expressions;
  422. parameter.CommonTempData = exps.Select(it =>
  423. {
  424. var res = GetNewExpressionValue(ExpressionTool.RemoveConvert(it));
  425. return res;
  426. }).ToArray();
  427. }
  428. else if (name == "Format" && item is ConstantExpression)
  429. {
  430. parameter.CommonTempData = ExpressionTool.GetExpressionValue(item);
  431. }
  432. else if (name == "FullTextContains" && item is NewArrayExpression)
  433. {
  434. var array = ExpressionTool.GetNewArrayMembers(item as NewArrayExpression);
  435. parameter.CommonTempData = array.Select(it=>this.Context.GetTranslationColumnName(it)).ToList();
  436. isRemoveParamter = true;
  437. }
  438. else if (ExpressionTool.IsNegate(item) && (item as UnaryExpression)?.Operand is MemberExpression)
  439. {
  440. var exp = (item as UnaryExpression)?.Operand;
  441. parameter.CommonTempData = GetNewExpressionValue(exp) + " * -1 ";
  442. isRemoveParamter = true;
  443. isNegate = true;
  444. }
  445. else
  446. {
  447. base.Start();
  448. }
  449. var methodCallExpressionArgs = new MethodCallExpressionArgs()
  450. {
  451. IsMember = parameter.ChildExpression is MemberExpression && !ExpressionTool.IsConstExpression(parameter.ChildExpression as MemberExpression),
  452. MemberName = parameter.CommonTempData
  453. };
  454. if (methodCallExpressionArgs.MemberName is MapperSql)
  455. {
  456. methodCallExpressionArgs.MemberName = (methodCallExpressionArgs.MemberName as MapperSql).Sql;
  457. }
  458. if (methodCallExpressionArgs.IsMember && parameter.ChildExpression != null && parameter.ChildExpression.ToString() == "DateTime.Now")
  459. {
  460. methodCallExpressionArgs.IsMember = false;
  461. }
  462. var value = methodCallExpressionArgs.MemberName;
  463. if (methodCallExpressionArgs.IsMember)
  464. {
  465. var childExpression = parameter.ChildExpression as MemberExpression;
  466. if (childExpression.Expression != null && childExpression.Expression is ConstantExpression)
  467. {
  468. methodCallExpressionArgs.IsMember = false;
  469. }
  470. }
  471. if (IsDateDate(item) || IsDateValue(item) || IsDateItemValue(item) || item is ConditionalExpression || IsNot(item))
  472. {
  473. methodCallExpressionArgs.IsMember = true;
  474. }
  475. if (methodCallExpressionArgs.IsMember == false && (item is MethodCallExpression && item.ToString() == "GetDate()") || (item is UnaryExpression && ((UnaryExpression)item).Operand.ToString() == "GetDate()"))
  476. {
  477. var parameterName = this.Context.SqlParameterKeyWord + ExpressionConst.MethodConst + this.Context.ParameterIndex;
  478. this.Context.ParameterIndex++;
  479. methodCallExpressionArgs.MemberName = value;
  480. methodCallExpressionArgs.MemberValue = null;
  481. }
  482. else if (methodCallExpressionArgs.IsMember == false&&isNegate==false)
  483. {
  484. var parameterName = this.Context.SqlParameterKeyWord + ExpressionConst.MethodConst + this.Context.ParameterIndex;
  485. this.Context.ParameterIndex++;
  486. methodCallExpressionArgs.MemberName = parameterName;
  487. if (name == "ToString"&&UtilMethods.GetUnderType(base.Expression.Type).IsEnum())
  488. {
  489. value = value?.ToString();
  490. }
  491. else if (name == "ContainsArray"&&args.Count()==2&& value!= null && value is IList)
  492. {
  493. List<object> result = new List<object>();
  494. foreach (var memItem in (value as IList))
  495. {
  496. result.Add(GetMemberValue(memItem, args.Last()));
  497. }
  498. value = result;
  499. }
  500. else if (!(item is ParameterExpression)&& name.IsIn("Contains", "StartsWith", "EndsWith") &&item==args.Last()&& ExpressionTool.IsSqlParameterDbType(this.Context, args.First()))
  501. {
  502. var myvalue = ExpressionTool.DynamicInvoke(args.Last());
  503. var parametre = ExpressionTool.GetParameterBySqlParameterDbType(this.Context.ParameterIndex,myvalue, this.Context, args.First());
  504. this.Context.Parameters.Add(parametre);
  505. methodCallExpressionArgs.MemberName = parametre.ParameterName;
  506. methodCallExpressionArgs.MemberValue = parametre.Value;
  507. methodCallExpressionArgs.IsMember = true;
  508. isRemoveParamter = true;
  509. this.Context.ParameterIndex++;
  510. }
  511. methodCallExpressionArgs.MemberValue = value;
  512. if (isRemoveParamter != true)
  513. {
  514. if (value == null && item != null)
  515. {
  516. this.Context.Parameters.Add(new SugarParameter(parameterName, value, UtilMethods.GetUnderType(item.Type)));
  517. }
  518. else
  519. {
  520. this.Context.Parameters.Add(new SugarParameter(parameterName, value));
  521. }
  522. }
  523. }
  524. model.Args.Add(methodCallExpressionArgs);
  525. parameter.ChildExpression = null;
  526. }
  527. private void GetConfigValue(MethodCallExpression express, ExpressionParameter parameter)
  528. {
  529. var exp = express.Arguments[0];
  530. var name = Regex.Match(express.Method.ToString(), @"GetConfigValue\[(.+)\]").Groups[1].Value;
  531. string code = null;
  532. if (express.Arguments.Count > 1)
  533. {
  534. code = ExpressionTool.GetExpressionValue(express.Arguments[1]) + "";
  535. }
  536. var entityDb = SqlFuncExtendsion.TableInfos.FirstOrDefault(y => y.Type.Name == name && y.Code == code);
  537. Check.Exception(entityDb == null, string.Format("GetConfigValue no configuration Entity={0} UniqueCode={1}", name, code));
  538. var entity = new ConfigTableInfo()
  539. {
  540. Code = entityDb.Code,
  541. TableName = entityDb.TableName,
  542. Key = entityDb.Key,
  543. Parameter = new List<SugarParameter>(),
  544. Type = entityDb.Type,
  545. Value = entityDb.Value,
  546. Where = entityDb.Where
  547. };
  548. if (entityDb.Parameter != null && entityDb.Parameter.Any())
  549. {
  550. foreach (var item in entityDb.Parameter)
  551. {
  552. entity.Parameter.Add(new SugarParameter("", null)
  553. {
  554. DbType = item.DbType,
  555. Direction = item.Direction,
  556. IsArray = item.IsArray,
  557. IsJson = item.IsJson,
  558. IsNullable = item.IsNullable,
  559. IsRefCursor = item.IsRefCursor,
  560. ParameterName = item.ParameterName,
  561. Size = item.Size,
  562. SourceColumn = item.SourceColumn,
  563. SourceColumnNullMapping = item.SourceColumnNullMapping,
  564. SourceVersion = item.SourceVersion,
  565. TempDate = item.TempDate,
  566. TypeName = item.TypeName,
  567. Value = item.Value,
  568. _Size = item._Size
  569. });
  570. }
  571. }
  572. string sql = " (SELECT {0} FROM {1} WHERE {2}={3}";
  573. if (ExpressionTool.IsUnConvertExpress(exp))
  574. {
  575. exp = (exp as UnaryExpression).Operand;
  576. }
  577. var member = exp as MemberExpression;
  578. var it = member.Expression;
  579. var type = it.Type;
  580. var properyName = member.Member.Name;
  581. var eqName = string.Format("{0}.{1}", this.Context.GetTranslationColumnName(it.ToString()), this.Context.GetDbColumnName(type.Name, properyName));
  582. if (this.Context.IsSingle)
  583. {
  584. this.Context.SingleTableNameSubqueryShortName = it.ToString();
  585. }
  586. sql = string.Format(sql, entity.Value, this.Context.GetTranslationColumnName(entity.TableName), entity.Key, eqName);
  587. if (entity.Parameter != null)
  588. {
  589. foreach (var item in entity.Parameter)
  590. {
  591. var oldName = item.ParameterName;
  592. item.ParameterName = Regex.Split(oldName, "_con_").First() + "_con_" + this.Context.ParameterIndex;
  593. entity.Where = entity.Where.Replace(oldName, item.ParameterName);
  594. }
  595. this.Context.ParameterIndex++;
  596. this.Context.Parameters.AddRange(entity.Parameter);
  597. }
  598. if (entity.Where.HasValue())
  599. {
  600. sql += " AND " + entity.Where;
  601. }
  602. sql += " )";
  603. if (this.Context.ResolveType.IsIn(ResolveExpressType.SelectMultiple, ResolveExpressType.SelectSingle, ResolveExpressType.Update))
  604. {
  605. parameter.BaseParameter.CommonTempData = sql;
  606. }
  607. else
  608. {
  609. AppendMember(parameter, parameter.IsLeft, sql);
  610. }
  611. }
  612. private object GetMethodValue(string name, MethodCallExpressionModel model)
  613. {
  614. model.Parameters = this.Context.Parameters;
  615. if (IsExtMethod(name))
  616. {
  617. model.Expression = this.Expression;
  618. model.BaseExpression = this.BaseParameter.CurrentExpression;
  619. DbType type = DbType.SqlServer;
  620. if (this.Context is SqlServerExpressionContext)
  621. type = DbType.SqlServer;
  622. else if (this.Context is MySqlExpressionContext)
  623. type = DbType.MySql;
  624. else if (this.Context is SqliteExpressionContext)
  625. type = DbType.Sqlite;
  626. else if (this.Context is OracleExpressionContext)
  627. type = DbType.Oracle;
  628. else if (this.Context is PostgreSQLExpressionContext)
  629. type = DbType.PostgreSQL;
  630. else if (this.Context.GetType().Name.StartsWith("MySql"))
  631. {
  632. type = DbType.MySql;
  633. }
  634. else
  635. {
  636. type = GetType(this.Context.GetType().Name);
  637. }
  638. return this.Context.SqlFuncServices.First(it => it.UniqueMethodName == name).MethodValue(model, type, this.Context);
  639. }
  640. else
  641. {
  642. if (name == "Parse" && TempParseType.IsIn(UtilConstants.GuidType) && model.Args != null && model.Args.Count() > 1)
  643. {
  644. name = "Equals";
  645. }
  646. else if (name == "Parse")
  647. {
  648. name = "To" + TempParseType.Name;
  649. }
  650. else if (name == "IsNullOrWhiteSpace")
  651. {
  652. name = "IsNullOrEmpty";
  653. }
  654. switch (name)
  655. {
  656. case "IIF":
  657. return this.Context.DbMehtods.IIF(model);
  658. case "HasNumber":
  659. return this.Context.DbMehtods.HasNumber(model);
  660. case "HasValue":
  661. return this.Context.DbMehtods.HasValue(model);
  662. case "IsNullOrEmpty":
  663. return this.Context.DbMehtods.IsNullOrEmpty(model);
  664. case "ToLower":
  665. return this.Context.DbMehtods.ToLower(model);
  666. case "ToUpper":
  667. return this.Context.DbMehtods.ToUpper(model);
  668. case "Trim":
  669. return this.Context.DbMehtods.Trim(model);
  670. case "Contains":
  671. return this.Context.DbMehtods.Contains(model);
  672. case "ContainsArray":
  673. if (model.Args[0].MemberValue == null)
  674. {
  675. var first = this.Context.Parameters.FirstOrDefault(it => it.ParameterName == model.Args[0].MemberName.ObjToString());
  676. if (first.HasValue())
  677. {
  678. model.Args[0].MemberValue = first.Value;
  679. }
  680. }
  681. if (this.Context.TableEnumIsString == true)
  682. {
  683. List<string> enumStringList = new List<string>();
  684. foreach (var inItem in (model.Args[0].MemberValue as IEnumerable))
  685. {
  686. if (inItem != null)
  687. {
  688. if (UtilMethods.GetUnderType(inItem.GetType()).IsEnum())
  689. {
  690. enumStringList.Add(inItem.ToString());
  691. }
  692. }
  693. }
  694. if (enumStringList.Any())
  695. {
  696. model.Args[0].MemberValue = enumStringList;
  697. }
  698. }
  699. var caResult = this.Context.DbMehtods.ContainsArray(model);
  700. this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[0].MemberName.ObjToString());
  701. return caResult;
  702. case "ContainsArrayUseSqlParameters":
  703. if (model.Args[0].MemberValue == null)
  704. {
  705. var first = this.Context.Parameters.FirstOrDefault(it => it.ParameterName == model.Args[0].MemberName.ObjToString());
  706. if (first.HasValue())
  707. {
  708. model.Args[0].MemberValue = first.Value;
  709. }
  710. }
  711. model.Data = this.Context.SqlParameterKeyWord + "INP_" + this.Context.ParameterIndex;
  712. this.Context.ParameterIndex++;
  713. if (model.Args[0].MemberValue.HasValue())
  714. {
  715. var inValueIEnumerable = (IEnumerable)model.Args[0].MemberValue;
  716. int i = 0;
  717. foreach (var item in inValueIEnumerable)
  718. {
  719. this.Context.Parameters.Add(new SugarParameter(model.Data + "_" + i, item));
  720. i++;
  721. }
  722. }
  723. var caResult2 = this.Context.DbMehtods.ContainsArrayUseSqlParameters(model);
  724. this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[0].MemberName.ObjToString());
  725. return caResult2;
  726. case "Equals":
  727. return this.Context.DbMehtods.Equals(model);
  728. case "EqualsNull":
  729. return this.Context.DbMehtods.EqualsNull(model);
  730. case "DateIsSame":
  731. if (model.Args.Count == 2)
  732. return this.Context.DbMehtods.DateIsSameDay(model);
  733. else
  734. {
  735. var dsResult = this.Context.DbMehtods.DateIsSameByType(model);
  736. this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[2].MemberName.ObjToString());
  737. return dsResult;
  738. }
  739. case "DateAdd":
  740. if (model.Args.Count == 2)
  741. return this.Context.DbMehtods.DateAddDay(model);
  742. else
  743. {
  744. var daResult = this.Context.DbMehtods.DateAddByType(model);
  745. this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[2].MemberName.ObjToString());
  746. return daResult;
  747. }
  748. case "DateValue":
  749. var dvResult = this.Context.DbMehtods.DateValue(model);
  750. this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[1].MemberName.ObjToString());
  751. return dvResult;
  752. case "Between":
  753. return this.Context.DbMehtods.Between(model);
  754. case "StartsWith":
  755. return this.Context.DbMehtods.StartsWith(model);
  756. case "EndsWith":
  757. return this.Context.DbMehtods.EndsWith(model);
  758. case "ToInt32":
  759. return this.Context.DbMehtods.ToInt32(model);
  760. case "ToInt64":
  761. return this.Context.DbMehtods.ToInt64(model);
  762. case "ToDate":
  763. return this.Context.DbMehtods.ToDate(model);
  764. case "ToDateTime":
  765. return this.Context.DbMehtods.ToDate(model);
  766. case "ToTime":
  767. return this.Context.DbMehtods.ToTime(model);
  768. case "ToString":
  769. if (model.Args.Count > 1)
  770. {
  771. var dateString2 = this.Context.DbMehtods.GetDateString(model.Args.First().MemberName.ObjToString(), model.Args.Last().MemberValue.ObjToString());
  772. if (dateString2 != null) return dateString2;
  773. return GeDateFormat(model.Args.Last().MemberValue.ObjToString(), model.Args.First().MemberName.ObjToString());
  774. }
  775. //Check.Exception(model.Args.Count > 1, "ToString (Format) is not supported, Use ToString().If time formatting can be used it.Date.Year+\"-\"+it.Data.Month+\"-\"+it.Date.Day ");
  776. return this.Context.DbMehtods.ToString(model);
  777. case "ToVarchar":
  778. return this.Context.DbMehtods.ToVarchar(model);
  779. case "ToDecimal":
  780. return this.Context.DbMehtods.ToDecimal(model);
  781. case "ToGuid":
  782. return this.Context.DbMehtods.ToGuid(model);
  783. case "ToDouble":
  784. return this.Context.DbMehtods.ToDouble(model);
  785. case "ToBool":
  786. return this.Context.DbMehtods.ToBool(model);
  787. case "ToBoolean":
  788. return this.Context.DbMehtods.ToBool(model);
  789. case "Substring":
  790. if (model.Args.Count == 2)
  791. {
  792. model.Args.Add(new MethodCallExpressionArgs()
  793. {
  794. MemberName="100000",
  795. IsMember=true,
  796. MemberValue= "100000",
  797. });
  798. }
  799. return this.Context.DbMehtods.Substring(model);
  800. case "Replace":
  801. return this.Context.DbMehtods.Replace(model);
  802. case "Length":
  803. return this.Context.DbMehtods.Length(model);
  804. case "AggregateSum":
  805. return this.Context.DbMehtods.AggregateSum(model);
  806. case "AggregateAvg":
  807. return this.Context.DbMehtods.AggregateAvg(model);
  808. case "AggregateMin":
  809. return this.Context.DbMehtods.AggregateMin(model);
  810. case "AggregateMax":
  811. return this.Context.DbMehtods.AggregateMax(model);
  812. case "AggregateCount":
  813. return this.Context.DbMehtods.AggregateCount(model);
  814. case "AggregateDistinctCount":
  815. return this.Context.DbMehtods.AggregateDistinctCount(model);
  816. case "MappingColumn":
  817. var mappingColumnResult = this.Context.DbMehtods.MappingColumn(model);
  818. if (model.Args.Count == 1&& mappingColumnResult.IsNullOrEmpty())
  819. {
  820. return model.Args[0].MemberName.ObjToString().TrimStart('\'').TrimEnd('\'');
  821. }
  822. var isValid = model.Args[0].IsMember && model.Args[1].IsMember == false;
  823. //Check.Exception(!isValid, "SqlFunc.MappingColumn parameters error, The property name on the left, string value on the right");
  824. if (model.Args.Count > 1)
  825. {
  826. this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[1].MemberName.ObjToString());
  827. }
  828. else
  829. {
  830. this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[0].MemberName.ObjToString());
  831. }
  832. if (mappingColumnResult == "")
  833. {
  834. return model.Args[1].MemberName.ObjToString().TrimStart('\'').TrimEnd('\'');
  835. }
  836. return mappingColumnResult;
  837. case "IsNull":
  838. return this.Context.DbMehtods.IsNull(model);
  839. case "MergeString":
  840. return this.Context.DbMehtods.MergeString(model.Args.Select(it => it.MemberName.ObjToString()).ToArray());
  841. case "SelectAll":
  842. case "GetSelfAndAutoFill":
  843. this.Context.Parameters.RemoveAll(it => it.ParameterName == model.Args[0].MemberName.ObjToString());
  844. var result1 = this.Context.DbMehtods.GetSelfAndAutoFill(this.Context.GetTranslationColumnName(model.Args[0].MemberValue.ObjToString()), this.Context.IsSingle);
  845. if ((model.Args[0].MemberValue + "") == "." && this.Context.IsSingle)
  846. {
  847. result1 = this.Context.GetTranslationTableName(model.Args[0].MemberName + "", false) + ".*/**/" + result1;
  848. }
  849. return result1;
  850. case "GetDate":
  851. return this.Context.DbMehtods.GetDate();
  852. case "GetRandom":
  853. return this.Context.DbMehtods.GetRandom();
  854. case "CharIndex":
  855. return this.Context.DbMehtods.CharIndex(model);
  856. case "BitwiseAnd":
  857. return this.Context.DbMehtods.BitwiseAnd(model);
  858. case "BitwiseInclusiveOR":
  859. return this.Context.DbMehtods.BitwiseInclusiveOR(model);
  860. case "ToDateShort":
  861. return this.Context.DbMehtods.ToDateShort(model);
  862. case "Oracle_ToChar":
  863. return this.Context.DbMehtods.Oracle_ToChar(model);
  864. case "Oracle_ToDate":
  865. return this.Context.DbMehtods.Oracle_ToDate(model);
  866. case "SqlServer_DateDiff":
  867. return this.Context.DbMehtods.SqlServer_DateDiff(model);
  868. case "Format":
  869. var xx = base.BaseParameter;
  870. var result = this.Context.DbMehtods.Format(model);
  871. if (this.Context.MethodName== "MappingColumn" || this.Context.MethodName?.StartsWith("Row")==true)
  872. {
  873. result = this.Context.DbMehtods.FormatRowNumber(model);
  874. }
  875. this.Context.Parameters.RemoveAll(it => model.Args.Select(x => x.MemberName.ObjToString()).Contains(it.ParameterName));
  876. return result;
  877. case "Abs":
  878. return this.Context.DbMehtods.Abs(model);
  879. case "Round":
  880. return this.Context.DbMehtods.Round(model);
  881. case "DateDiff":
  882. return this.Context.DbMehtods.DateDiff(model);
  883. case "GreaterThan":
  884. return this.Context.DbMehtods.GreaterThan(model);
  885. case "GreaterThanOrEqual":
  886. return this.Context.DbMehtods.GreaterThanOrEqual(model);
  887. case "LessThan":
  888. return this.Context.DbMehtods.LessThan(model);
  889. case "LessThanOrEqual":
  890. return this.Context.DbMehtods.LessThanOrEqual(model);
  891. case "Asc":
  892. return this.Context.DbMehtods.Asc(model);
  893. case "Desc":
  894. return this.Context.DbMehtods.Desc(model);
  895. case "Stuff":
  896. return this.Context.DbMehtods.Stuff(model);
  897. case "RowNumber":
  898. return this.Context.DbMehtods.RowNumber(model);
  899. case "RowCount":
  900. return this.Context.DbMehtods.RowCount(model);
  901. case "RowSum":
  902. return this.Context.DbMehtods.RowSum(model);
  903. case "RowMax":
  904. return this.Context.DbMehtods.RowMax(model);
  905. case "RowMin":
  906. return this.Context.DbMehtods.RowMin(model);
  907. case "RowAvg":
  908. return this.Context.DbMehtods.RowAvg(model);
  909. case "Exists":
  910. if (model.Args.Count > 1)
  911. {
  912. this.Context.Parameters.RemoveAll(it => model.Args[1].MemberName.ObjToString().Contains(it.ParameterName));
  913. List<IConditionalModel> conditionalModels = (List<IConditionalModel>)model.Args[1].MemberValue;
  914. var sqlObj = this.Context.SugarContext.Context.Queryable<object>().SqlBuilder.ConditionalModelToSql(conditionalModels, 0);
  915. var sql = sqlObj.Key;
  916. UtilMethods.RepairReplicationParameters(ref sql, sqlObj.Value, 0, "_" + this.Context.ParameterIndex + "_B");
  917. model.Args[1].MemberName = sql;
  918. if (sqlObj.Value != null)
  919. {
  920. this.Context.Parameters.AddRange(sqlObj.Value);
  921. }
  922. else
  923. {
  924. return " 1=1 ";
  925. }
  926. }
  927. return this.Context.DbMehtods.Exists(model);
  928. case "JsonField":
  929. return this.Context.DbMehtods.JsonField(model);
  930. case "JsonArrayLength":
  931. return this.Context.DbMehtods.JsonArrayLength(model);
  932. case "JsonContainsFieldName":
  933. return this.Context.DbMehtods.JsonContainsFieldName(model);
  934. case "JsonParse":
  935. return this.Context.DbMehtods.JsonParse(model);
  936. case "JsonLike":
  937. return this.Context.DbMehtods.JsonLike(model);
  938. case "Collate":
  939. return this.Context.DbMehtods.Collate(model);
  940. case "AggregateSumNoNull":
  941. return this.Context.DbMehtods.AggregateSumNoNull(model);
  942. case "JsonListObjectAny":
  943. return this.Context.DbMehtods.JsonListObjectAny(model);
  944. case "JsonArrayAny":
  945. return this.Context.DbMehtods.JsonArrayAny(model);
  946. case "CompareTo":
  947. return this.Context.DbMehtods.CompareTo(model);
  948. case "SplitIn":
  949. return this.Context.DbMehtods.SplitIn(model);
  950. case "ListAny":
  951. this.Context.Result.IsNavicate = true;
  952. this.Context.Parameters.RemoveAll(it => model.Args[0].MemberName.ObjToString().Contains(it.ParameterName));
  953. return this.Context.DbMehtods.ListAny(model);
  954. case "ListAll":
  955. this.Context.Result.IsNavicate = true;
  956. this.Context.Parameters.RemoveAll(it => model.Args[0].MemberName.ObjToString().Contains(it.ParameterName));
  957. return this.Context.DbMehtods.ListAll(model);
  958. case "Modulo":
  959. return this.Context.DbMehtods.Modulo(model);
  960. case "Like":
  961. return this.Context.DbMehtods.Like(model);
  962. case "ToSingle":
  963. return this.Context.DbMehtods.ToSingle(model);
  964. default:
  965. if (typeof(IDbMethods).GetMethods().Any(it => it.Name == name))
  966. {
  967. return this.Context.DbMehtods.GetType().GetMethod(name).Invoke(this.Context.DbMehtods,new object[] { model});
  968. }
  969. break;
  970. }
  971. }
  972. return null;
  973. }
  974. private DbType GetType(string name)
  975. {
  976. DbType result = DbType.SqlServer;
  977. foreach (var item in UtilMethods.EnumToDictionary<DbType>())
  978. {
  979. if (name.StartsWith(item.Value.ToString()))
  980. {
  981. result = item.Value;
  982. break;
  983. }
  984. }
  985. return result;
  986. }
  987. private bool IsContainsArray(MethodCallExpression express, string methodName, bool isValidNativeMethod)
  988. {
  989. return !isValidNativeMethod && express.Method.DeclaringType.Namespace.IsIn("System.Collections", "System.Linq", "System.Collections.Generic") && methodName == "Contains";
  990. }
  991. private bool IsSubMethod(MethodCallExpression express, string methodName)
  992. {
  993. return SubTools.SubItemsConst.Any(it => it.Name == methodName) && express.Object != null && (express.Object.Type.Name.StartsWith("Subqueryable`"));
  994. }
  995. private bool CheckMethod(MethodCallExpression expression)
  996. {
  997. if (expression?.Object?.Type?.Name?.StartsWith("ISugarQueryable`") == true)
  998. {
  999. Check.ExceptionEasy("Sublookup is implemented using SqlFunc.Subquery<Order>(); Queryable objects cannot be used", "子查请使用SqlFunc.Subquery<Order>()来实现,不能用Queryable对象");
  1000. }
  1001. if (expression.Method.Name == "SelectAll")
  1002. {
  1003. return true;
  1004. }
  1005. if (expression.Method.Name == "CompareTo")
  1006. {
  1007. return true;
  1008. }
  1009. if (expression.Method.Name == "Any"&& expression.Arguments.Count()>0&& ExpressionTool.IsVariable(expression.Arguments[0]) )
  1010. {
  1011. return true;
  1012. }
  1013. if (expression.Method.Name == "All" && expression.Arguments.Count() > 0 && ExpressionTool.IsVariable(expression.Arguments[0]))
  1014. {
  1015. return true;
  1016. }
  1017. if (expression.Method.Name == "Format" && expression.Method.DeclaringType == UtilConstants.StringType)
  1018. {
  1019. return true;
  1020. }
  1021. if (IsExtMethod(expression.Method.Name))
  1022. return true;
  1023. if (IsParseMethod(expression))
  1024. return true;
  1025. if (expression.Method.Name == "IsNullOrEmpty" && expression.Method.DeclaringType == UtilConstants.StringType)
  1026. {
  1027. return true;
  1028. }
  1029. if (expression.Method.Name == "IsNullOrWhiteSpace" && expression.Method.DeclaringType == UtilConstants.StringType)
  1030. {
  1031. return true;
  1032. }
  1033. if (expression.Method.ReflectedType().FullName != ExpressionConst.SqlFuncFullName)
  1034. return false;
  1035. else
  1036. return true;
  1037. }
  1038. private Type TempParseType;
  1039. public bool IsParseMethod(MethodCallExpression expression)
  1040. {
  1041. if (expression.Method.Name == "Parse" && expression.Method.DeclaringType.IsIn(
  1042. UtilConstants.DecType,
  1043. UtilConstants.DateType,
  1044. UtilConstants.DobType,
  1045. UtilConstants.GuidType,
  1046. UtilConstants.FloatType,
  1047. UtilConstants.ShortType,
  1048. UtilConstants.LongType,
  1049. UtilConstants.IntType,
  1050. UtilConstants.BoolType))
  1051. {
  1052. TempParseType = expression.Method.DeclaringType;
  1053. return true;
  1054. }
  1055. return false;
  1056. }
  1057. private static bool IsNot(Expression item)
  1058. {
  1059. return item is UnaryExpression && (item as UnaryExpression).NodeType == ExpressionType.Not;
  1060. }
  1061. private bool IsDateItemValue(Expression item)
  1062. {
  1063. var result = false;
  1064. if (item is MemberExpression)
  1065. {
  1066. var memberExp = item as MemberExpression;
  1067. if (memberExp != null && memberExp.Expression != null && memberExp.Expression.Type == UtilConstants.DateType)
  1068. {
  1069. foreach (var dateType in UtilMethods.EnumToDictionary<DateType>())
  1070. {
  1071. if (memberExp.Member.Name.EqualCase(dateType.Key))
  1072. {
  1073. result = true;
  1074. break;
  1075. }
  1076. else if (memberExp.Member.Name == "DayOfWeek")
  1077. {
  1078. result = true;
  1079. break;
  1080. }
  1081. }
  1082. }
  1083. }
  1084. return result;
  1085. }
  1086. private static bool IsDateDate(Expression item)
  1087. {
  1088. return item.Type == UtilConstants.DateType && item is MemberExpression && (item as MemberExpression).Member.Name == "Date" && item.ToString() != "DateTime.Now.Date";
  1089. }
  1090. private static bool IsDateValue(Expression item)
  1091. {
  1092. return item.Type == UtilConstants.IntType &&
  1093. item is MemberExpression &&
  1094. (item as MemberExpression).Expression != null &&
  1095. (item as MemberExpression).Expression.Type == UtilConstants.DateType &&
  1096. (item as MemberExpression).Expression is MemberExpression &&
  1097. ((item as MemberExpression).Expression as MemberExpression).Member.Name == "Value";
  1098. }
  1099. private bool IsValidNativeMethod(MethodCallExpression express, string methodName)
  1100. {
  1101. return MethodMapping.ContainsKey(methodName) && express.Method.DeclaringType.Namespace == ("System");
  1102. }
  1103. private bool IsExtMethod(string methodName)
  1104. {
  1105. if (this.Context.SqlFuncServices == null) return false;
  1106. return this.Context.SqlFuncServices.Select(it => it.UniqueMethodName).Contains(methodName);
  1107. }
  1108. private bool IsIfElse(MethodCallExpression express, string methodName)
  1109. {
  1110. if (methodName == "End" && express.Object.Type == typeof(CaseWhen))
  1111. return true;
  1112. else
  1113. return false;
  1114. }
  1115. }
  1116. }