From 6fffa2397326db2454ff1078a078ebb0bf53b88c Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sun, 18 May 2025 19:20:55 +0800 Subject: [PATCH] Subquery.Take --- .../Subquery/Items/SubTake.cs | 93 +++++++++++++++++++ .../ExpressionsToSql/Subquery/SubTools.cs | 3 +- .../ExpressionsToSql/Subquery/Subquerable.cs | 5 + 3 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Subquery/Items/SubTake.cs diff --git a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Subquery/Items/SubTake.cs b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Subquery/Items/SubTake.cs new file mode 100644 index 000000000..2fe4755a8 --- /dev/null +++ b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Subquery/Items/SubTake.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; + +namespace SqlSugar +{ + public class SubTake : ISubOperation + { + public bool HasWhere + { + get; set; + } + + public ExpressionContext Context + { + get; set; + } + + public Expression Expression + { + get; set; + } + + public string Name + { + get + { + return "Take"; + } + } + + public int Sort + { + get + { + if (this.Context is SqlServerExpressionContext || this.Context.GetType().Name.Contains("Access")) + { + return 150; + } + else if (this.Context is OracleExpressionContext) + { + + return 401; + } + else + { + return 490; + } + } + } + + + public string GetValue(Expression expression) + { + var numExp = (expression as MethodCallExpression).Arguments[0]; + var num =1; + if (ExpressionTool.GetParameters(numExp).Any()) + { + var copyContext = this.Context.GetCopyContextWithMapping(); + copyContext.IsSingle = false; + copyContext.Resolve(numExp, ResolveExpressType.WhereMultiple); + copyContext.Result.GetString(); + } + else + { + num = ExpressionTool.DynamicInvoke(numExp).ObjToInt(); + } + var take = (expression as MethodCallExpression); + if (this.Context is SqlServerExpressionContext || this.Context.GetType().Name.Contains("Access")) + { + return "TOP " + num; + } + else if (this.Context is OracleExpressionContext) + { + return (HasWhere ? "AND" : "WHERE") + " ROWNUM<=" + num; + } + else if (this.Context is PostgreSQLExpressionContext || this.Context?.SugarContext?.Context?.CurrentConnectionConfig?.MoreSettings?.DatabaseModel == DbType.PostgreSQL) + { + return "limit " + num; + } + else if (this.Context.GetLimit() != null) + { + return this.Context.GetLimit(); + } + else + { + return "limit " + num; + } + } + } +} \ No newline at end of file diff --git a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs index 3fc66cb48..fd2126a8d 100644 --- a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs +++ b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs @@ -40,7 +40,8 @@ namespace SqlSugar new SubDistinctCount{ Context=Context }, new SubToList{ Context=Context}, new SubFirst(){ Context=Context }, - new SubAsWithAttr(){ Context=Context } + new SubAsWithAttr(){ Context=Context }, + new SubTake(){ Context=Context } }; } diff --git a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Subquery/Subquerable.cs b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Subquery/Subquerable.cs index a84a930c7..7302b2c7a 100644 --- a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Subquery/Subquerable.cs +++ b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/Subquery/Subquerable.cs @@ -224,5 +224,10 @@ namespace SqlSugar { return this; } + + public Subqueryable Take(int takeNum) + { + return this; + } } }