From fdc26fdf603249974a4decdf462198ce773ff745 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Thu, 22 May 2025 19:12:37 +0800 Subject: [PATCH] Update nav query --- .../QueryableProvider/Entities/SqlInfo.cs | 1 + .../QueryableProvider/NavigatManager.cs | 19 ++++++++++++++ .../ExpressionsToSql/Common/ExpressionTool.cs | 26 +++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/Entities/SqlInfo.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/Entities/SqlInfo.cs index 09c6d6f88..94e67733d 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/Entities/SqlInfo.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/Entities/SqlInfo.cs @@ -9,6 +9,7 @@ namespace SqlSugar internal class SqlInfo { + public bool IsSelectNav { get; set; } public int? Take { get; set; } public int? Skip { get; set; } public string WhereString { get; set; } diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs index 4ffc96486..367c6a7d5 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs @@ -856,6 +856,18 @@ namespace SqlSugar { var pkInfo = entityInfo.Columns.FirstOrDefault(x => x.IsPrimarykey); result.SelectString = (" " + queryable.QueryBuilder.GetExpressionValue(exp, ResolveExpressType.SelectSingle).GetString()); + if (ExpressionTool.ContainsTwoLevelAccess(exp)) + { + var shortName = ExpressionTool.GetParameters(exp).FirstOrDefault()?.Name; + if (shortName.HasValue()) + { + if (result.TableShortName == null) + { + result.TableShortName = shortName; + result.IsSelectNav = true; + } + } + } if (pkInfo != null) { var pkName = pkInfo.DbColumnName; @@ -941,6 +953,13 @@ namespace SqlSugar private static void AppColumns(SqlInfo result, ISugarQueryable queryable, string columnName) { var selectPkName = queryable.SqlBuilder.GetTranslationColumnName(columnName); + if (result.IsSelectNav) + { + if (result.SelectString != null && !result.SelectString.ToLower().Contains($" {selectPkName.ToLower()} AS {selectPkName.ToLower()}")) + { + result.SelectString = result.SelectString + "," + (selectPkName + " AS " + selectPkName); + } + } if (result.SelectString!=null && !result.SelectString.ToLower().Contains(selectPkName.ToLower())) { result.SelectString = result.SelectString + "," + (selectPkName +" AS "+ selectPkName); diff --git a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs index d87bd70f9..4904a8522 100644 --- a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs +++ b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Common/ExpressionTool.cs @@ -10,6 +10,32 @@ namespace SqlSugar { public class ExpressionTool { + public static bool ContainsTwoLevelAccess(Expression exp) + { + var result = false; + + if (exp is LambdaExpression lambda && + lambda.Body is MemberInitExpression initExpr) + { + var param = lambda.Parameters[0]; + + foreach (var binding in initExpr.Bindings) + { + if (binding is MemberAssignment assign) + { + if (assign.Expression is MemberExpression outer && + outer.Expression is MemberExpression inner && + inner.Expression == param) + { + result = true; + break; // 已经找到了,就退出循环 + } + } + } + } + + return result; + } public static string GetMemberNameByMethod(Expression expression, string name) {