sqlsugar/Src/OracleUS7ASCII/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve_Append.cs

254 lines
10 KiB
C#
Raw Normal View History

2025-05-11 16:20:50 +08:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
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 ((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 (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
{
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, "-");
}
}
}
}