From 42ef42a97d15e503c0c480b6b20d7a3f984172b2 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Tue, 2 Aug 2022 20:19:14 +0800 Subject: [PATCH] Update exp to sql --- .../ExpressionsToSql/Common/ExpressionTool.cs | 38 +++++++++++++++++++ .../Common/NewExpressionInfo.cs | 16 ++++++++ .../ResolveItems/BaseResolve.cs | 26 ++++++++++++- Src/Asp.Net/SqlSugar/SqlSugar.csproj | 1 + 4 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/NewExpressionInfo.cs diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs index 5459ff517..0769b5feb 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs @@ -430,5 +430,43 @@ namespace SqlSugar { return item is UnaryExpression && item.NodeType == ExpressionType.Convert; } + + internal static List GetNewexpressionInfos(Expression item,ExpressionContext context) + { + List result = new List(); + foreach (MemberBinding binding in ((MemberInitExpression)item).Bindings) + { + if (binding.BindingType != MemberBindingType.Assignment) + { + throw new NotSupportedException(); + } + MemberAssignment memberAssignment = (MemberAssignment)binding; + NewExpressionInfo additem = new NewExpressionInfo(); + if ((memberAssignment.Expression is MemberExpression)) + { + additem.LeftNameName = memberAssignment.Member.Name; + var member = (memberAssignment.Expression as MemberExpression).Expression; + additem.ShortName = member + ""; + additem.RightName = (memberAssignment.Expression as MemberExpression).Member.Name; + additem.RightDbName = context.GetDbColumnName(member.Type.Name, additem.RightName); + result.Add(additem); + } + } + return result; + } + internal static List GetNewDynamicexpressionInfos(Expression item) + { + List result = new List(); + foreach (var binding in ((NewExpression)item).Arguments) + { + //var memberAssignment = binding; + //NewExpressionInfo additem = new NewExpressionInfo(); + //additem.Name = memberAssignment.Member.Name; + //additem.ShortName = (memberAssignment.Expression as MemberExpression).Expression + ""; + //additem.Value = ""; + //result.Add(additem); + } + return result; + } } } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/NewExpressionInfo.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/NewExpressionInfo.cs new file mode 100644 index 000000000..0bbac700b --- /dev/null +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/NewExpressionInfo.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + internal class NewExpressionInfo + { + public string LeftNameName { get; set; } + public string RightName { get; set; } + public string RightDbName { get; set; } + public string ShortName { get; set; } + } +} diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs index 77e5d43b0..962387ced 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs @@ -460,7 +460,31 @@ namespace SqlSugar CallContextThread>.SetData("Exp_Select_Mapping_Key", mappingKeys); CallContextAsync>.SetData("Exp_Select_Mapping_Key", mappingKeys); this.Expression = item; - asName = GetAsNameResolveAnObject(parameter, item, asName, isSameType); + if (this.Context.IsJoin&& (item is MemberInitExpression|| item is NewExpression)) + { + List newExpressionInfos = new List(); + if (item is MemberInitExpression) + { + newExpressionInfos = ExpressionTool.GetNewexpressionInfos(item,this.Context); + } + else + { + newExpressionInfos = ExpressionTool.GetNewexpressionInfos(item, this.Context); + } + foreach (NewExpressionInfo newExpressionInfo in newExpressionInfos) + { + //var property=item.Type.GetProperties().Where(it => it.Name == newExpressionInfo.l).First(); + //asName = GetAsName(item, newExpressionInfo.ShortName, property); + parameter.Context.Result.Append(this.Context.GetAsString( + this.Context.SqlTranslationLeft+asName + "." + newExpressionInfo.RightDbName+this.Context.SqlTranslationRight, + newExpressionInfo.ShortName+"."+newExpressionInfo.RightDbName + )); + } + } + else + { + asName = GetAsNameResolveAnObject(parameter, item, asName, isSameType); + } } else if (item.Type == UtilConstants.BoolType && item is MethodCallExpression && IsNotCaseExpression(item)) { diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj index 43a7c5aef..974366357 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj @@ -125,6 +125,7 @@ +