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

110 lines
4.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
namespace SqlSugar
{
/// <summary>
///BaseResolve New Expression
/// </summary>
public partial class BaseResolve
{
public string GetNewExpressionValue(Expression item)
{
var newContext = this.Context.GetCopyContextWithMapping();
newContext.SugarContext = this.Context.SugarContext;
newContext.Resolve(item, this.Context.IsJoin ? ResolveExpressType.WhereMultiple : ResolveExpressType.WhereSingle);
this.Context.Index = newContext.Index;
this.Context.ParameterIndex = newContext.ParameterIndex;
if (newContext.Parameters.HasValue())
{
this.Context.Parameters.AddRange(newContext.Parameters);
}
if (this.Context.SingleTableNameSubqueryShortName == "Subqueryable()")
{
this.Context.SingleTableNameSubqueryShortName = newContext.SingleTableNameSubqueryShortName;
}
else if (newContext.SingleTableNameSubqueryShortName!=null&& newContext.Result !=null && newContext.Result.Contains(this.Context.SqlTranslationLeft+ newContext.SingleTableNameSubqueryShortName+ this.Context.SqlTranslationRight))
{
this.Context.SingleTableNameSubqueryShortName = newContext.SingleTableNameSubqueryShortName;
}
return newContext.Result.GetResultString();
}
public string GetNewExpressionValue(Expression item, ResolveExpressType type)
{
var newContext = this.Context.GetCopyContextWithMapping();
newContext.SugarContext = this.Context.SugarContext;
newContext.Resolve(item, type);
this.Context.Index = newContext.Index;
this.Context.ParameterIndex = newContext.ParameterIndex;
if (newContext.Parameters.HasValue())
{
this.Context.Parameters.AddRange(newContext.Parameters);
}
return newContext.Result.GetResultString();
}
protected void ResolveNewExpressions(ExpressionParameter parameter, Expression item, string asName)
{
if (item is ConstantExpression)
{
ResolveConst(parameter, item, asName);
}
else if ((item is MemberExpression) && ((MemberExpression)item).Expression == null)
{
ResolveMember(parameter, item, asName);
}
else if ((item is MemberExpression) && ((MemberExpression)item).Expression.NodeType == ExpressionType.Constant)
{
ResolveMemberConst(parameter, item, asName);
}
else if (item is MemberExpression)
{
ResolveMemberOther(parameter, item, asName);
}
else if (item is UnaryExpression && ((UnaryExpression)item).Operand is MemberExpression)
{
ResolveUnaryExpMem(parameter, item, asName);
}
else if (item is UnaryExpression && ((UnaryExpression)item).Operand is ConstantExpression)
{
ResolveUnaryExpConst(parameter, item, asName);
}
else if (item is BinaryExpression)
{
ResolveBinary(item, asName);
}
else if (item.Type.IsClass())
{
asName = ResolveClass(parameter, item, asName);
}
else if (item.Type == UtilConstants.BoolType && item is MethodCallExpression && IsNotCaseExpression(item))
{
ResloveBoolMethod(parameter, item, asName);
}
else if (item.NodeType == ExpressionType.Not
&& (item as UnaryExpression).Operand is MethodCallExpression
&& ((item as UnaryExpression).Operand as MethodCallExpression).Method.Name.IsIn("IsNullOrEmpty", "IsNullOrWhiteSpace"))
{
ResloveNot(parameter, item, asName);
}
else if (item is MethodCallExpression && (item as MethodCallExpression).Method.Name.IsIn("Count", "Any") && !item.ToString().StartsWith("Subqueryable"))
{
ResloveCountAny(parameter, item, asName);
}
else if (item is MethodCallExpression || item is UnaryExpression || item is ConditionalExpression || item.NodeType == ExpressionType.Coalesce)
{
ResloveOtherMUC(parameter, item, asName);
}
else
{
Check.ThrowNotSupportedException(item.GetType().Name);
}
}
}
}