From c90f35bf71bc4123bb0129f2e5d285f837fa9f4e Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Thu, 5 Oct 2023 19:09:38 +0800 Subject: [PATCH] Synchronization code --- .../DeleteProvider/DeleteNavMethodInfo.cs | 4 ++-- .../InsertableProvider/InsertNavMethodInfo.cs | 4 ++-- .../QueryableProvider/QueryableHelper.cs | 15 ++++++++++++ .../QueryableProvider/QueryableProvider.cs | 9 +++++++ .../ExpressionsToSql/Common/ExpressionTool.cs | 21 ++++++++++++++++ .../Common/ParameterReplacer.cs | 24 +++++++++++++++++++ Src/Asp.Net/SqlSugar/SqlSugar.csproj | 1 + .../SqlSugar/Utilities/UtilExtensions.cs | 2 +- 8 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/ParameterReplacer.cs diff --git a/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/DeleteNavMethodInfo.cs b/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/DeleteNavMethodInfo.cs index c35761c8e..eb8989421 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/DeleteNavMethodInfo.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/DeleteProvider/DeleteNavMethodInfo.cs @@ -11,7 +11,7 @@ namespace SqlSugar internal object MethodInfos { get; set; } internal SqlSugarProvider Context { get; set; } - public DeleteNavMethodInfo IncludeByNameString(string navMemberName, UpdateNavOptions updateNavOptions = null) + public DeleteNavMethodInfo IncludeByNameString(string navMemberName, DeleteNavOptions updateNavOptions = null) { var type = MethodInfos.GetType().GetGenericArguments()[0]; var entityInfo = this.Context.EntityMaintenance.GetEntityInfo(type); @@ -24,7 +24,7 @@ namespace SqlSugar this.MethodInfos = obj; return this; } - public DeleteNavMethodInfo ThenIncludeByNameString(string navMemberName, UpdateNavOptions updateNavOptions = null) + public DeleteNavMethodInfo ThenIncludeByNameString(string navMemberName, DeleteNavOptions updateNavOptions = null) { var type = MethodInfos.GetType().GetGenericArguments()[1]; var entityInfo = this.Context.EntityMaintenance.GetEntityInfo(type); diff --git a/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertNavMethodInfo.cs b/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertNavMethodInfo.cs index 601c76f07..8e25c886d 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertNavMethodInfo.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertNavMethodInfo.cs @@ -11,7 +11,7 @@ namespace SqlSugar internal object MethodInfos { get; set; } internal SqlSugarProvider Context { get; set; } - public InsertNavMethodInfo IncludeByNameString(string navMemberName, UpdateNavOptions updateNavOptions = null) + public InsertNavMethodInfo IncludeByNameString(string navMemberName, InsertNavRootOptions updateNavOptions = null) { var type = MethodInfos.GetType().GetGenericArguments()[0]; var entityInfo = this.Context.EntityMaintenance.GetEntityInfo(type); @@ -24,7 +24,7 @@ namespace SqlSugar this.MethodInfos = obj; return this; } - public InsertNavMethodInfo ThenIncludeByNameString(string navMemberName, UpdateNavOptions updateNavOptions = null) + public InsertNavMethodInfo ThenIncludeByNameString(string navMemberName, InsertNavRootOptions updateNavOptions = null) { var type = MethodInfos.GetType().GetGenericArguments()[1]; var entityInfo = this.Context.EntityMaintenance.GetEntityInfo(type); diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs index dc9fc9d40..58b52daa1 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableHelper.cs @@ -1265,6 +1265,21 @@ namespace SqlSugar #region Other + private bool IsSingleWithChildTableQuery() + { + return this.QueryBuilder.IsSingle() && this.QueryBuilder.TableShortName.HasValue(); + } + + private Expression> ReplaceMasterTableParameters(Expression> expression) + { + var parameterName = (expression as LambdaExpression)?.Parameters?.FirstOrDefault()?.Name; + if (parameterName != null && parameterName != this.QueryBuilder.TableShortName) + { + expression = ExpressionTool.ChangeLambdaExpression(expression, parameterName, this.QueryBuilder.TableShortName); + } + + return expression; + } private void orderPropertyNameByJoin(string orderPropertyName, OrderByType? orderByType) { var shortName = orderPropertyName.Split('.').FirstOrDefault(); diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs index f3dddb78f..f62764b8e 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs @@ -934,9 +934,14 @@ namespace SqlSugar } public virtual ISugarQueryable Where(Expression> expression) { + if (IsSingleWithChildTableQuery()) + { + expression = ReplaceMasterTableParameters(expression); + } this._Where(expression); return this; } + public virtual ISugarQueryable Where(string whereString, object whereObj = null) { if (whereString.HasValue()) @@ -1008,6 +1013,10 @@ namespace SqlSugar public virtual ISugarQueryable WhereIF(bool isWhere, Expression> expression) { if (!isWhere) return this; + if (IsSingleWithChildTableQuery()) + { + expression = ReplaceMasterTableParameters(expression); + } _Where(expression); return this; } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs index 0e1fb3b1b..aeb3979f7 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs @@ -10,6 +10,27 @@ namespace SqlSugar { public class ExpressionTool { + public static Expression> ChangeLambdaExpression(Expression> exp,string replaceParameterName, string newParameterName) + { + var parameter = Expression.Parameter(typeof(T), newParameterName); + + // 替换Lambda表达式中指定参数名 + var visitor = new ParameterReplacer(replaceParameterName, parameter); + var newBody = visitor.Visit(exp); + + return (Expression>)newBody; + } + public static Expression ChangeLambdaExpression(Expression exp, Type targetType, string replaceParameterName, string newParameterName) + { + var parameter = Expression.Parameter(targetType, newParameterName); + + // 替换Lambda表达式中指定参数名 + var visitor = new ParameterReplacer(replaceParameterName, parameter); + var newBody = visitor.Visit(exp); + + return newBody; + } + public static List GetNewArrayMembers(NewArrayExpression newArrayExpression) { List strings = new List(); diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/ParameterReplacer.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/ParameterReplacer.cs new file mode 100644 index 000000000..dd2840d92 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Common/ParameterReplacer.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Text; + +namespace SqlSugar +{ + internal class ParameterReplacer : ExpressionVisitor + { + private readonly string _oldParameterName; + private readonly ParameterExpression _newParameter; + + public ParameterReplacer(string oldParameterName, ParameterExpression newParameter) + { + _oldParameterName = oldParameterName; + _newParameter = newParameter; + } + + protected override Expression VisitParameter(ParameterExpression node) + { + return node.Name == _oldParameterName ? _newParameter : base.VisitParameter(node); + } + } +} diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj index 684f6357e..fd4d5e290 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj @@ -174,6 +174,7 @@ + diff --git a/Src/Asp.Net/SqlSugar/Utilities/UtilExtensions.cs b/Src/Asp.Net/SqlSugar/Utilities/UtilExtensions.cs index df0bf98e1..22a0d58bc 100644 --- a/Src/Asp.Net/SqlSugar/Utilities/UtilExtensions.cs +++ b/Src/Asp.Net/SqlSugar/Utilities/UtilExtensions.cs @@ -8,7 +8,7 @@ namespace SqlSugar.Extensions ///Common Extensions for external users /// public static class UtilExtensions - { + { public static int ObjToInt(this object thisValue) { int reval = 0;