123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Linq.Expressions;
- using System.Reflection;
- using System.Text;
- using System.Text.RegularExpressions;
- namespace SqlSugar
- {
- /// <summary>
- /// BaseResolve-Append
- /// </summary>
- public partial class BaseResolve
- {
- protected void AppendMember(ExpressionParameter parameter, bool? isLeft, object appendValue)
- {
- Context.ParameterIndex++;
- if (isLeft == true)
- {
- appendValue += ExpressionConst.ExpressionReplace + parameter.BaseParameter.Index;
- }
- if (this.Context.Result.Contains(ExpressionConst.FormatSymbol))
- {
- this.Context.Result.Replace(ExpressionConst.FormatSymbol, appendValue.ObjToString());
- }
- else
- {
- this.Context.Result.Append(appendValue);
- }
- }
- protected void AppendValue(ExpressionParameter parameter, bool? isLeft, object value)
- {
- if (parameter.BaseExpression is BinaryExpression || parameter.BaseExpression == null)
- {
- var oppoSiteExpression = isLeft == true ? parameter.BaseParameter.RightExpression : parameter.BaseParameter.LeftExpression;
- if (value is MapperSql)
- {
- ApppendMapperSql(parameter, isLeft, value);
- }
- else if (parameter.CurrentExpression is MethodCallExpression || parameter.CurrentExpression is ConditionalExpression || parameter.CurrentExpression.NodeType == ExpressionType.Coalesce)
- {
- AppendMethod(parameter, isLeft, value);
- }
- else if (oppoSiteExpression is MemberExpression)
- {
- AppendMember(parameter, isLeft, value, oppoSiteExpression);
- }
- else if (ExpressionTool.RemoveConvert(oppoSiteExpression) is MemberExpression)
- {
- AppendMember(parameter, isLeft, value, ExpressionTool.RemoveConvert(oppoSiteExpression));
- }
- else if ((oppoSiteExpression is UnaryExpression && (oppoSiteExpression as UnaryExpression).Operand is MemberExpression))
- {
- value = AppendUnaryExp(parameter, isLeft, value, oppoSiteExpression);
- }
- else
- {
- value = AppendOther(parameter, isLeft, value);
- }
- }
- }
- private object AppendOther(ExpressionParameter parameter, bool? isLeft, object value)
- {
- var appendValue = this.Context.SqlParameterKeyWord + ExpressionConst.Const + Context.ParameterIndex;
- Context.ParameterIndex++;
- if (value != null && value.GetType().IsEnum())
- {
- if (this.Context.TableEnumIsString == true)
- {
- value = value.ToString();
- }
- else
- {
- value = Convert.ToInt64(value);
- }
- }
- this.Context.Parameters.Add(new SugarParameter(appendValue, value));
- appendValue = string.Format(" {0} ", appendValue);
- if (isLeft == true)
- {
- appendValue += ExpressionConst.ExpressionReplace + parameter.BaseParameter.Index;
- }
- if (this.Context.Result.Contains(ExpressionConst.FormatSymbol))
- {
- this.Context.Result.Replace(ExpressionConst.FormatSymbol, appendValue);
- }
- else
- {
- this.Context.Result.Append(appendValue);
- }
- return value;
- }
- private object AppendUnaryExp(ExpressionParameter parameter, bool? isLeft, object value, Expression oppoSiteExpression)
- {
- string appendValue = Context.SqlParameterKeyWord
- + ((MemberExpression)(oppoSiteExpression as UnaryExpression).Operand).Member.Name
- + Context.ParameterIndex;
- if (value.ObjToString() != "NULL" && !parameter.ValueIsNull)
- {
- value = this.Context.TableEnumIsString == true ? value.ToString() : value;
- this.Context.Parameters.Add(new SugarParameter(appendValue, value));
- }
- else
- {
- appendValue = value.ObjToString();
- }
- Context.ParameterIndex++;
- appendValue = string.Format(" {0} ", appendValue);
- if (isLeft == true)
- {
- appendValue += ExpressionConst.ExpressionReplace + parameter.BaseParameter.Index;
- }
- if (this.Context.Result.Contains(ExpressionConst.FormatSymbol))
- {
- this.Context.Result.Replace(ExpressionConst.FormatSymbol, appendValue);
- }
- else
- {
- this.Context.Result.Append(appendValue);
- }
- return value;
- }
- private void AppendMember(ExpressionParameter parameter, bool? isLeft, object value, Expression oppoSiteExpression)
- {
- string appendValue = Context.SqlParameterKeyWord
- + ((MemberExpression)oppoSiteExpression).Member.Name
- + Context.ParameterIndex;
- if (IsNullValue(parameter, value))
- {
- appendValue = $" NULL ";
- parameter.BaseParameter.ValueIsNull = true;
- }
- else if (value.ObjToString() != "NULL" && !parameter.ValueIsNull)
- {
- EntityColumnInfo columnInfo = GetColumnInfo(oppoSiteExpression);
- if (columnInfo != null && columnInfo.SqlParameterDbType != null && columnInfo.SqlParameterDbType is System.Data.DbType)
- {
- var p = new SugarParameter(appendValue, value, (System.Data.DbType)columnInfo.SqlParameterDbType);
- if (columnInfo.SqlParameterSize != null)
- {
- p.Size = columnInfo.SqlParameterSize.ObjToInt();
- }
- this.Context.Parameters.Add(p);
- }
- else if (UtilMethods.IsParameterConverter(columnInfo))
- {
- SugarParameter p = UtilMethods.GetParameterConverter(this.Context.ParameterIndex,this.Context.SugarContext.Context, value, oppoSiteExpression, columnInfo);
- appendValue = p.ParameterName;
- this.Context.Parameters.Add(p);
- }
- else if (parameter?.BaseParameter?.CommonTempData.ObjToString() == "IsJson=true")
- {
- this.Context.Parameters.Add(new SugarParameter(appendValue, new SerializeService().SerializeObject(value)) { IsJson = true });
- }
- else if (parameter?.BaseParameter?.CommonTempData.ObjToString() == "IsArray=true")
- {
- this.Context.Parameters.Add(new SugarParameter(appendValue, value) { IsArray = true });
- }
- else if (value != null && (value is Enum) && this.Context?.SugarContext?.Context?.CurrentConnectionConfig?.MoreSettings?.TableEnumIsString == true)
- {
- this.Context.Parameters.Add(new SugarParameter(appendValue, Convert.ToString(value)));
- }
- else if (this.Context
- ?.SugarContext
- ?.Context
- ?.CurrentConnectionConfig
- ?.MoreSettings
- ?.IsCorrectErrorSqlParameterName == true
- && columnInfo?.PropertyName != null
- && !columnInfo.PropertyName.IsRegexWNoContainsChinese())
- {
- appendValue = (Context.SqlParameterKeyWord + "p" + appendValue.GetHashCode() +"no"+ Context.ParameterIndex)
- .Replace("-","");
- this.Context.Parameters.Add(new SugarParameter(appendValue, value));
- }
- else
- {
- this.Context.Parameters.Add(new SugarParameter(appendValue, value));
- }
- }
- else
- {
- appendValue = value.ObjToString();
- }
- Context.ParameterIndex++;
- appendValue = string.Format(" {0} ", appendValue);
- if (isLeft == true)
- {
- appendValue += ExpressionConst.ExpressionReplace + parameter.BaseParameter.Index;
- }
- if (this.Context.Result.Contains(ExpressionConst.FormatSymbol))
- {
- this.Context.Result.Replace(ExpressionConst.FormatSymbol, appendValue);
- }
- else
- {
- this.Context.Result.Append(appendValue);
- }
- }
- private void AppendMethod(ExpressionParameter parameter, bool? isLeft, object value)
- {
- var appendValue = value;
- if (this.Context.Result.Contains(ExpressionConst.FormatSymbol))
- {
- this.Context.Result.Replace(ExpressionConst.FormatSymbol, appendValue.ObjToString());
- }
- else
- {
- this.Context.Result.Append(appendValue);
- }
- this.AppendOpreator(parameter, isLeft);
- }
- private void ApppendMapperSql(ExpressionParameter parameter, bool? isLeft, object value)
- {
- var sql = ((MapperSql)value).Sql;
- if (isLeft == true)
- {
- sql += ExpressionConst.ExpressionReplace + parameter.BaseParameter.Index;
- }
- if (this.Context.Result.Contains(ExpressionConst.FormatSymbol))
- {
- this.Context.Result.Replace(ExpressionConst.FormatSymbol, sql);
- }
- else
- {
- this.Context.Result.Append(sql);
- }
- }
- protected void AppendOpreator(ExpressionParameter parameter, bool? isLeft)
- {
- if (isLeft == true)
- {
- this.Context.Result.Append(" " + ExpressionConst.ExpressionReplace + parameter.BaseParameter.Index);
- }
- }
- protected string AppendParameter(object paramterValue)
- {
- string parameterName = this.Context.SqlParameterKeyWord + "constant" + this.Context.ParameterIndex;
- this.Context.ParameterIndex++; ;
- this.Context.Parameters.Add(new SugarParameter(parameterName, paramterValue));
- return parameterName;
- }
- protected string AppendParameter(SugarParameter p)
- {
- p.ParameterName= p.ParameterName + this.Context.ParameterIndex;
- this.Context.ParameterIndex++; ;
- this.Context.Parameters.Add(p);
- return p.ParameterName;
- }
- protected void AppendNot(object Value)
- {
- var isAppend = !this.Context.Result.Contains(ExpressionConst.FormatSymbol);
- var lastCharIsSpace = this.Context.Result.LastCharIsSpace;
- if (isAppend)
- {
- this.Context.Result.Append(lastCharIsSpace ? "NOT" : " NOT");
- }
- else
- {
- this.Context.Result.Replace(ExpressionConst.FormatSymbol, "NOT");
- }
- }
- protected void AppendNegate(object Value)
- {
- var isAppend = !this.Context.Result.Contains(ExpressionConst.FormatSymbol);
- var lastCharIsSpace = this.Context.Result.LastCharIsSpace;
- if (isAppend)
- {
- this.Context.Result.Append(lastCharIsSpace ? "-" : " -");
- }
- else
- {
- this.Context.Result.Replace(ExpressionConst.FormatSymbol, "-");
- }
- }
- private void AppendOnlyInSelectConvertToString(ExpressionParameter parameter, Expression item, string asName)
- {
- var name =GetNewExpressionValue((item as MethodCallExpression)?.Arguments[0]);
- var methodInfo = ExpressionTool.DynamicInvoke(((item as MethodCallExpression)?.Arguments[1]));
- if (this.Context.SugarContext.QueryBuilder.QueryableFormats == null)
- this.Context.SugarContext.QueryBuilder.QueryableFormats = new List<QueryableFormat>();
- this.Context.SugarContext.QueryBuilder.QueryableFormats.Add(new QueryableFormat()
- {
- Format = "",
- PropertyName = asName,
- MethodName = "OnlyInSelectConvertToString",
- MethodInfo= (MethodInfo)methodInfo
- });
- parameter.Context.Result.Append(this.Context.GetAsString2(asName, name));
- }
- }
- }
|