mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-07-15 23:13:42 +08:00
172 lines
7.2 KiB
C#
172 lines
7.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Linq.Expressions;
|
|
using System.Text;
|
|
namespace SqlSugar
|
|
{
|
|
public class MemberExpressionResolve : BaseResolve
|
|
{
|
|
public ExpressionParameter Parameter { get; set; }
|
|
public MemberExpressionResolve(ExpressionParameter parameter) : base(parameter)
|
|
{
|
|
var baseParameter = parameter.BaseParameter;
|
|
var isLeft = parameter.IsLeft;
|
|
var isSetTempData = baseParameter.CommonTempData.IsValuable() && baseParameter.CommonTempData.Equals(CommonTempDataType.Result);
|
|
var expression = base.Expression as MemberExpression;
|
|
var isValue = expression.Member.Name == "Value" && expression.Member.GetType().Name == "RuntimePropertyInfo";
|
|
var isBool = expression.Type == PubConst.BoolType;
|
|
var isValueBool = isValue && isBool && parameter.BaseExpression == null;
|
|
if (isValueBool)
|
|
{
|
|
isValue = false;
|
|
}
|
|
else if (isValue)
|
|
{
|
|
expression = expression.Expression as MemberExpression;
|
|
}
|
|
else if (expression.Expression != null && expression.Expression.NodeType != ExpressionType.Parameter && !isValueBool)
|
|
{
|
|
var value = ExpressionTool.GetMemberValue(expression.Member, expression);
|
|
if (isSetTempData)
|
|
{
|
|
baseParameter.CommonTempData = value;
|
|
}
|
|
else
|
|
{
|
|
AppendValue(parameter, isLeft, value);
|
|
}
|
|
return;
|
|
}
|
|
string fieldName = string.Empty;
|
|
baseParameter.ChildExpression = expression;
|
|
switch (parameter.Context.ResolveType)
|
|
{
|
|
case ResolveExpressType.SelectSingle:
|
|
fieldName = GetSingleName(parameter, expression, isLeft);
|
|
if (isSetTempData)
|
|
{
|
|
baseParameter.CommonTempData = fieldName;
|
|
}
|
|
else
|
|
{
|
|
base.Context.Result.Append(fieldName);
|
|
}
|
|
break;
|
|
case ResolveExpressType.SelectMultiple:
|
|
fieldName = GetMultipleName(parameter, expression, isLeft);
|
|
if (isSetTempData)
|
|
{
|
|
baseParameter.CommonTempData = fieldName;
|
|
}
|
|
else
|
|
{
|
|
base.Context.Result.Append(fieldName);
|
|
}
|
|
break;
|
|
case ResolveExpressType.WhereSingle:
|
|
case ResolveExpressType.WhereMultiple:
|
|
var isSingle = parameter.Context.ResolveType == ResolveExpressType.WhereSingle;
|
|
if (isSetTempData)
|
|
{
|
|
fieldName = GetName(parameter, expression, null,isSingle);
|
|
baseParameter.CommonTempData = fieldName;
|
|
}
|
|
else
|
|
{
|
|
if (isValueBool)
|
|
{
|
|
fieldName = GetName(parameter, expression.Expression as MemberExpression, isLeft,isSingle);
|
|
}
|
|
else if (ExpressionTool.IsConstExpression(expression))
|
|
{
|
|
var value = ExpressionTool.GetMemberValue(expression.Member, expression);
|
|
base.AppendValue(parameter, isLeft, value);
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
fieldName = GetName(parameter, expression, isLeft,isSingle);
|
|
}
|
|
if (expression.Type == PubConst.BoolType && baseParameter.OperatorValue.IsNullOrEmpty())
|
|
{
|
|
fieldName = "( " + fieldName + "=1 )";
|
|
}
|
|
fieldName = AppendMember(parameter, isLeft, fieldName);
|
|
}
|
|
break;
|
|
case ResolveExpressType.FieldSingle:
|
|
fieldName = GetSingleName(parameter, expression, isLeft);
|
|
base.Context.Result.Append(fieldName);
|
|
break;
|
|
case ResolveExpressType.FieldMultiple:
|
|
fieldName = GetMultipleName(parameter, expression, isLeft);
|
|
base.Context.Result.Append(fieldName);
|
|
break;
|
|
case ResolveExpressType.ArrayMultiple:
|
|
case ResolveExpressType.ArraySingle:
|
|
fieldName = GetName(parameter, expression, isLeft,parameter.Context.ResolveType== ResolveExpressType.ArraySingle);
|
|
base.Context.Result.Append(fieldName);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
private string AppendMember(ExpressionParameter parameter, bool? isLeft, string fieldName)
|
|
{
|
|
if (parameter.BaseExpression is BinaryExpression || (parameter.BaseParameter.CommonTempData != null && parameter.BaseParameter.CommonTempData.Equals(CommonTempDataType.Append)))
|
|
{
|
|
fieldName = string.Format(" {0} ", fieldName);
|
|
if (isLeft == true)
|
|
{
|
|
fieldName += ExpressionConst.Format1 + parameter.BaseParameter.Index;
|
|
}
|
|
if (base.Context.Result.Contains(ExpressionConst.Format0))
|
|
{
|
|
base.Context.Result.Replace(ExpressionConst.Format0, fieldName);
|
|
}
|
|
else
|
|
{
|
|
base.Context.Result.Append(fieldName);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
base.Context.Result.Append(fieldName);
|
|
}
|
|
|
|
return fieldName;
|
|
}
|
|
|
|
private string GetName(ExpressionParameter parameter, MemberExpression expression, bool? isLeft, bool isSingle)
|
|
{
|
|
if (isSingle)
|
|
{
|
|
return GetSingleName(parameter, expression, IsLeft);
|
|
}
|
|
else
|
|
{
|
|
return GetMultipleName(parameter,expression,IsLeft);
|
|
}
|
|
}
|
|
|
|
private string GetMultipleName(ExpressionParameter parameter, MemberExpression expression, bool? isLeft)
|
|
{
|
|
string shortName = expression.Expression.ToString();
|
|
string fieldName = expression.Member.Name;
|
|
fieldName = this.Context.GetDbColumnName(expression.Expression.Type.Name, fieldName);
|
|
fieldName = Context.GetTranslationColumnName(shortName + "." + fieldName);
|
|
return fieldName;
|
|
}
|
|
|
|
private string GetSingleName(ExpressionParameter parameter, MemberExpression expression, bool? isLeft)
|
|
{
|
|
string fieldName = expression.Member.Name;
|
|
fieldName = this.Context.GetDbColumnName(expression.Expression.Type.Name, fieldName);
|
|
fieldName = Context.GetTranslationColumnName(fieldName);
|
|
return fieldName;
|
|
}
|
|
}
|
|
}
|