private void ResolveWhereLogic(ExpressionParameter parameter, ExpressionParameter baseParameter, MemberExpression expression, bool?isLeft, bool isSetTempData, bool isSingle) { string fieldName = string.Empty; if (isSetTempData) { if (ExpressionTool.IsConstExpression(expression)) { var value = ExpressionTool.GetMemberValue(expression.Member, expression); baseParameter.CommonTempData = value; } else { fieldName = GetName(parameter, expression, null, isSingle); baseParameter.CommonTempData = fieldName; } } else { if (ExpressionTool.IsConstExpression(expression)) { var value = ExpressionTool.GetMemberValue(expression.Member, expression); base.AppendValue(parameter, isLeft, value); } else { fieldName = GetName(parameter, expression, isLeft, isSingle); AppendMember(parameter, isLeft, fieldName); } } }
private void ResolveWhereLogic(ExpressionParameter parameter, ExpressionParameter baseParameter, MemberExpression expression, bool?isLeft, bool isSetTempData, bool isSingle) { string fieldName = string.Empty; if (isSetTempData) { if (ExpressionTool.IsConstExpression(expression)) { var value = ExpressionTool.GetMemberValue(expression.Member, expression); base.AppendValue(parameter, isLeft, value); } else { fieldName = GetName(parameter, expression, null, isSingle); baseParameter.CommonTempData = fieldName; } } else { if (ExpressionTool.IsConstExpression(expression)) { var value = ExpressionTool.GetMemberValue(expression.Member, expression); base.AppendValue(parameter, isLeft, value); return; } fieldName = GetName(parameter, expression, isLeft, isSingle); if (expression.Type == UtilConstants.BoolType && baseParameter.OperatorValue.IsNullOrEmpty()) { fieldName = this.Context.DbMehtods.EqualTrue(fieldName); } AppendMember(parameter, isLeft, fieldName); } }
private void ResolveMemberValue(ExpressionParameter parameter, ExpressionParameter baseParameter, bool?isLeft, bool isSetTempData, MemberExpression expression) { var value = ExpressionTool.GetMemberValue(expression.Member, expression); if (isSetTempData) { baseParameter.CommonTempData = value; } else { AppendValue(parameter, isLeft, value); } }
public MemberConstExpressionResolve(ExpressionParameter parameter) : base(parameter) { var expression = base.Expression as MemberExpression; var isLeft = parameter.IsLeft; object value = ExpressionTool.GetMemberValue(expression.Member, expression); var baseParameter = parameter.BaseParameter; var isSetTempData = baseParameter.CommonTempData.IsValuable() && baseParameter.CommonTempData.Equals(CommonTempDataType.Result); switch (parameter.Context.ResolveType) { case ResolveExpressType.Update: case ResolveExpressType.SelectSingle: case ResolveExpressType.SelectMultiple: if (value != null && value.GetType().IsEnum()) { value = Convert.ToInt64(value); } parameter.BaseParameter.CommonTempData = value; break; case ResolveExpressType.WhereSingle: case ResolveExpressType.WhereMultiple: if (isSetTempData) { baseParameter.CommonTempData = value; } else { AppendValue(parameter, isLeft, value); } break; case ResolveExpressType.FieldSingle: case ResolveExpressType.FieldMultiple: break; } }
private void ResolveDateValue(ExpressionParameter parameter, bool?isLeft, MemberExpression expression) { var name = expression.Member.Name; var oldCommonTempDate = parameter.CommonTempData; parameter.CommonTempData = CommonTempDataType.Result; this.Expression = expression.Expression; var isConst = this.Expression is ConstantExpression; if (this.Expression.Type == UtilConstants.DateType && this.Expression.ToString() == "DateTime.Now") { this.Expression = expression; var parameterName = base.AppendParameter(ExpressionTool.GetMemberValue(expression.Member, expression)); base.AppendMember(parameter, isLeft, parameterName); } else { this.Start(); var result = this.Context.DbMehtods.DateValue(new MethodCallExpressionModel() { Args = new List <MethodCallExpressionArgs>() { new MethodCallExpressionArgs() { IsMember = !isConst, MemberName = parameter.CommonTempData, MemberValue = null }, new MethodCallExpressionArgs() { IsMember = true, MemberName = name, MemberValue = name } } }); base.AppendMember(parameter, isLeft, result); } parameter.CommonTempData = oldCommonTempDate; }
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.DeclaringType.Name == "Nullable`1"; var isBool = expression.Type == PubConst.BoolType; var isValueBool = isValue && isBool && parameter.BaseExpression == null; var isLength = expression.Member.Name == "Length" && (expression.Expression as MemberExpression).Type == PubConst.StringType; var isDateValue = expression.Member.Name.IsIn(Enum.GetNames(typeof(DateType))) && (expression.Expression as MemberExpression).Type == PubConst.DateType; if (isLength) { var oldCommonTempDate = parameter.CommonTempData; parameter.CommonTempData = CommonTempDataType.Result; this.Expression = expression.Expression; var isConst = this.Expression is ConstantExpression; this.Start(); var methodParamter = new MethodCallExpressionArgs() { IsMember = !isConst, MemberName = parameter.CommonTempData, MemberValue = null }; var result = this.Context.DbMehtods.Length(new MethodCallExpressionModel() { Args = new List <MethodCallExpressionArgs>() { methodParamter } }); base.AppendMember(parameter, isLeft, result); parameter.CommonTempData = oldCommonTempDate; return; } else if (isDateValue) { var name = expression.Member.Name; var oldCommonTempDate = parameter.CommonTempData; parameter.CommonTempData = CommonTempDataType.Result; this.Expression = expression.Expression; var isConst = this.Expression is ConstantExpression; this.Start(); var result = this.Context.DbMehtods.DateValue(new MethodCallExpressionModel() { Args = new List <MethodCallExpressionArgs>() { new MethodCallExpressionArgs() { IsMember = !isConst, MemberName = parameter.CommonTempData, MemberValue = null }, new MethodCallExpressionArgs() { IsMember = true, MemberName = name, MemberValue = name } } }); base.AppendMember(parameter, isLeft, result); parameter.CommonTempData = oldCommonTempDate; return; } else 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; } }
protected void ResolveNewExpressions(ExpressionParameter parameter, Expression item, string asName) { if (item is ConstantExpression) { this.Expression = item; this.Start(); string parameterName = this.Context.SqlParameterKeyWord + "constant" + this.Context.ParameterIndex; this.Context.ParameterIndex++; parameter.Context.Result.Append(this.Context.GetAsString(asName, parameterName)); this.Context.Parameters.Add(new SugarParameter(parameterName, parameter.CommonTempData)); } else if ((item is MemberExpression) && ((MemberExpression)item).Expression == null) { var paramterValue = ExpressionTool.GetPropertyValue(item as MemberExpression); string parameterName = this.Context.SqlParameterKeyWord + "constant" + this.Context.ParameterIndex; this.Context.ParameterIndex++; parameter.Context.Result.Append(this.Context.GetAsString(asName, parameterName)); this.Context.Parameters.Add(new SugarParameter(parameterName, paramterValue)); } else if ((item is MemberExpression) && ((MemberExpression)item).Expression.NodeType == ExpressionType.Constant) { this.Expression = item; this.Start(); string parameterName = this.Context.SqlParameterKeyWord + "constant" + this.Context.ParameterIndex; this.Context.ParameterIndex++; parameter.Context.Result.Append(this.Context.GetAsString(asName, parameterName)); this.Context.Parameters.Add(new SugarParameter(parameterName, parameter.CommonTempData)); } else if (item is MemberExpression) { if (this.Context.Result.IsLockCurrentParameter == false) { this.Context.Result.CurrentParameter = parameter; this.Context.Result.IsLockCurrentParameter = true; parameter.IsAppendTempDate(); this.Expression = item; if (IsBoolValue(item)) { this.Expression = (item as MemberExpression).Expression; } this.Start(); parameter.IsAppendResult(); this.Context.Result.Append(this.Context.GetAsString(asName, parameter.CommonTempData.ObjToString())); this.Context.Result.CurrentParameter = null; } } else if (item is UnaryExpression && ((UnaryExpression)item).Operand is MemberExpression) { if (this.Context.Result.IsLockCurrentParameter == false) { var expression = ((UnaryExpression)item).Operand as MemberExpression; var isDateTimeNow = ((UnaryExpression)item).Operand.ToString() == "DateTime.Now"; if (expression.Expression == null && !isDateTimeNow) { this.Context.Result.CurrentParameter = parameter; this.Context.Result.IsLockCurrentParameter = true; parameter.IsAppendTempDate(); this.Expression = item; this.Start(); parameter.IsAppendResult(); this.Context.Result.Append(this.Context.GetAsString(asName, parameter.CommonTempData.ObjToString())); this.Context.Result.CurrentParameter = null; } else if (expression.Expression is ConstantExpression || isDateTimeNow) { string parameterName = this.Context.SqlParameterKeyWord + "constant" + this.Context.ParameterIndex; this.Context.ParameterIndex++; parameter.Context.Result.Append(this.Context.GetAsString(asName, parameterName)); this.Context.Parameters.Add(new SugarParameter(parameterName, ExpressionTool.GetMemberValue(expression.Member, expression))); } else { this.Context.Result.CurrentParameter = parameter; this.Context.Result.IsLockCurrentParameter = true; parameter.IsAppendTempDate(); this.Expression = expression; this.Start(); parameter.IsAppendResult(); this.Context.Result.Append(this.Context.GetAsString(asName, parameter.CommonTempData.ObjToString())); this.Context.Result.CurrentParameter = null; } } } else if (item is UnaryExpression && ((UnaryExpression)item).Operand is ConstantExpression) { if (this.Context.Result.IsLockCurrentParameter == false) { this.Expression = ((UnaryExpression)item).Operand; this.Start(); string parameterName = this.Context.SqlParameterKeyWord + "constant" + this.Context.ParameterIndex; this.Context.ParameterIndex++; parameter.Context.Result.Append(this.Context.GetAsString(asName, parameterName)); this.Context.Parameters.Add(new SugarParameter(parameterName, parameter.CommonTempData)); } } else if (item is BinaryExpression) { if (this.Context.Result.IsLockCurrentParameter == false) { var newContext = this.Context.GetCopyContextWithMapping(); var resolveExpressType = this.Context.IsSingle ? ResolveExpressType.WhereSingle : ResolveExpressType.WhereMultiple; newContext.Resolve(item, resolveExpressType); this.Context.Index = newContext.Index; this.Context.ParameterIndex = newContext.ParameterIndex; if (newContext.Parameters.HasValue()) { this.Context.Parameters.AddRange(newContext.Parameters); } this.Context.Result.Append(this.Context.GetAsString(asName, newContext.Result.GetString())); this.Context.Result.CurrentParameter = null; if (this.Context.SingleTableNameSubqueryShortName.IsNullOrEmpty() && newContext.SingleTableNameSubqueryShortName.HasValue()) { this.Context.SingleTableNameSubqueryShortName = newContext.SingleTableNameSubqueryShortName; } } } else if (item.Type.IsClass()) { var mappingKeys = GetMappingColumns(parameter.CurrentExpression); var isSameType = mappingKeys.Keys.Count > 0; CallContextThread <Dictionary <string, string> > .SetData("Exp_Select_Mapping_Key", mappingKeys); CallContextAsync <Dictionary <string, string> > .SetData("Exp_Select_Mapping_Key", mappingKeys); this.Expression = item; this.Start(); var shortName = parameter.CommonTempData; var listProperties = item.Type.GetProperties().Cast <PropertyInfo>().ToList(); foreach (var property in listProperties) { var hasIgnore = this.Context.IgnoreComumnList != null && this.Context.IgnoreComumnList.Any(it => it.EntityName.Equals(item.Type.Name, StringComparison.CurrentCultureIgnoreCase) && it.PropertyName.Equals(property.Name, StringComparison.CurrentCultureIgnoreCase)); if (hasIgnore) { continue; } if (property.PropertyType.IsClass()) { var comumnInfo = property.GetCustomAttribute <SugarColumn>(); if (comumnInfo != null && comumnInfo.IsJson) { asName = GetAsName(item, shortName, property); } } else if (isSameType) { asName = GetAsNameAndShortName(item, shortName, property); } else { asName = GetAsName(item, shortName, property); } } } else if (item.Type == UtilConstants.BoolType && item is MethodCallExpression && (item as MethodCallExpression).Method.Name == "Any" && IsSubMethod(item as MethodCallExpression)) { this.Expression = item; this.Start(); var sql = this.Context.DbMehtods.IIF(new MethodCallExpressionModel() { Args = new List <MethodCallExpressionArgs>() { new MethodCallExpressionArgs() { IsMember = true, MemberName = parameter.CommonTempData.ObjToString() }, new MethodCallExpressionArgs() { IsMember = true, MemberName = 1 }, new MethodCallExpressionArgs() { IsMember = true, MemberName = 0 } } }); parameter.Context.Result.Append(this.Context.GetAsString(asName, sql)); } else if (item is MethodCallExpression || item is UnaryExpression || item is ConditionalExpression || item.NodeType == ExpressionType.Coalesce) { this.Expression = item; this.Start(); parameter.Context.Result.Append(this.Context.GetAsString(asName, parameter.CommonTempData.ObjToString())); } else { Check.ThrowNotSupportedException(item.GetType().Name); } }
protected void ResolveNewExpressions(ExpressionParameter parameter, Expression item, string asName) { if (item is ConstantExpression) { this.Expression = item; this.Start(); string parameterName = this.Context.SqlParameterKeyWord + "constant" + this.Context.ParameterIndex; this.Context.ParameterIndex++; parameter.Context.Result.Append(this.Context.GetAsString(asName, parameterName)); this.Context.Parameters.Add(new SugarParameter(parameterName, parameter.CommonTempData)); } else if ((item is MemberExpression) && ((MemberExpression)item).Expression == null) { var paramterValue = ExpressionTool.GetPropertyValue(item as MemberExpression); string parameterName = this.Context.SqlParameterKeyWord + "constant" + this.Context.ParameterIndex; this.Context.ParameterIndex++; parameter.Context.Result.Append(this.Context.GetAsString(asName, parameterName)); this.Context.Parameters.Add(new SugarParameter(parameterName, paramterValue)); } else if ((item is MemberExpression) && ((MemberExpression)item).Expression.NodeType == ExpressionType.Constant) { this.Expression = item; this.Start(); string parameterName = this.Context.SqlParameterKeyWord + "constant" + this.Context.ParameterIndex; this.Context.ParameterIndex++; parameter.Context.Result.Append(this.Context.GetAsString(asName, parameterName)); this.Context.Parameters.Add(new SugarParameter(parameterName, parameter.CommonTempData)); } else if (item is MemberExpression) { if (this.Context.Result.IsLockCurrentParameter == false) { this.Context.Result.CurrentParameter = parameter; this.Context.Result.IsLockCurrentParameter = true; parameter.IsAppendTempDate(); this.Expression = item; this.Start(); parameter.IsAppendResult(); this.Context.Result.Append(this.Context.GetAsString(asName, parameter.CommonTempData.ObjToString())); this.Context.Result.CurrentParameter = null; } } else if (item is UnaryExpression && ((UnaryExpression)item).Operand is MemberExpression) { if (this.Context.Result.IsLockCurrentParameter == false) { var expression = ((UnaryExpression)item).Operand as MemberExpression; if (expression.Expression == null) { this.Context.Result.CurrentParameter = parameter; this.Context.Result.IsLockCurrentParameter = true; parameter.IsAppendTempDate(); this.Expression = item; this.Start(); parameter.IsAppendResult(); this.Context.Result.Append(this.Context.GetAsString(asName, parameter.CommonTempData.ObjToString())); this.Context.Result.CurrentParameter = null; } else if (expression.Expression is ConstantExpression) { string parameterName = this.Context.SqlParameterKeyWord + "constant" + this.Context.ParameterIndex; this.Context.ParameterIndex++; parameter.Context.Result.Append(this.Context.GetAsString(asName, parameterName)); this.Context.Parameters.Add(new SugarParameter(parameterName, ExpressionTool.GetMemberValue(expression.Member, expression))); } else { this.Context.Result.CurrentParameter = parameter; this.Context.Result.IsLockCurrentParameter = true; parameter.IsAppendTempDate(); this.Expression = item; this.Start(); parameter.IsAppendResult(); this.Context.Result.Append(this.Context.GetAsString(asName, parameter.CommonTempData.ObjToString())); this.Context.Result.CurrentParameter = null; } } } else if (item is UnaryExpression && ((UnaryExpression)item).Operand is ConstantExpression) { if (this.Context.Result.IsLockCurrentParameter == false) { this.Expression = ((UnaryExpression)item).Operand; this.Start(); string parameterName = this.Context.SqlParameterKeyWord + "constant" + this.Context.ParameterIndex; this.Context.ParameterIndex++; parameter.Context.Result.Append(this.Context.GetAsString(asName, parameterName)); this.Context.Parameters.Add(new SugarParameter(parameterName, parameter.CommonTempData)); } } else if (item is BinaryExpression) { if (this.Context.Result.IsLockCurrentParameter == false) { var newContext = this.Context.GetCopyContextWithMapping(); var resolveExpressType = this.Context.IsSingle ? ResolveExpressType.WhereSingle : ResolveExpressType.WhereMultiple; newContext.Resolve(item, resolveExpressType); this.Context.Index = newContext.Index; this.Context.ParameterIndex = newContext.ParameterIndex; if (newContext.Parameters.HasValue()) { this.Context.Parameters.AddRange(newContext.Parameters); } this.Context.Result.Append(this.Context.GetAsString(asName, newContext.Result.GetString())); this.Context.Result.CurrentParameter = null; } } else if (item.Type.IsClass()) { this.Expression = item; this.Start(); var shortName = parameter.CommonTempData; var listProperties = item.Type.GetProperties().Cast <PropertyInfo>().ToList(); foreach (var property in listProperties) { var hasIgnore = this.Context.IgnoreComumnList != null && this.Context.IgnoreComumnList.Any(it => it.EntityName.Equals(item.Type.Name, StringComparison.CurrentCultureIgnoreCase) && it.PropertyName.Equals(property.Name, StringComparison.CurrentCultureIgnoreCase)); if (hasIgnore) { continue; } if (property.PropertyType.IsClass()) { } else { asName = this.Context.GetTranslationText(item.Type.Name + "." + property.Name); var columnName = property.Name; if (Context.IsJoin) { this.Context.Result.Append(Context.GetAsString(asName, columnName, shortName.ObjToString())); } else { this.Context.Result.Append(Context.GetAsString(asName, columnName)); } } } } else if (item is MethodCallExpression || item is UnaryExpression) { this.Expression = item; this.Start(); parameter.Context.Result.Append(this.Context.GetAsString(asName, parameter.CommonTempData.ObjToString())); } else { Check.ThrowNotSupportedException(item.GetType().Name); } }