From f71fb3d9d8afc686232c08e093eb1538cc9f8229 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Tue, 10 Nov 2020 19:33:27 +0800 Subject: [PATCH] Oracle contains num > 1000 --- Src/Asp.Net/OracleTest/Bugs/BugTest1.cs | 46 +++++++++++++++++++ Src/Asp.Net/OracleTest/OracleTest.csproj | 1 + .../SqlBuilder/OracleExpressionContext.cs | 39 +++++++++++++++- 3 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 Src/Asp.Net/OracleTest/Bugs/BugTest1.cs diff --git a/Src/Asp.Net/OracleTest/Bugs/BugTest1.cs b/Src/Asp.Net/OracleTest/Bugs/BugTest1.cs new file mode 100644 index 000000000..0f52f18ae --- /dev/null +++ b/Src/Asp.Net/OracleTest/Bugs/BugTest1.cs @@ -0,0 +1,46 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OrmTest.Test +{ + public class BugTest1 + { + public static void Init() + { + SqlSugarClient Db = new SqlSugarClient(new ConnectionConfig() + { + ConnectionString = Config.ConnectionString, + DbType = DbType.Oracle, + IsAutoCloseConnection = true, + + InitKeyType = InitKeyType.Attribute, + }); + //调式代码 用来打印SQL + Db.Aop.OnLogExecuting = (sql, pars) => + { + Console.WriteLine(sql); + }; + + var id=Enumerable.Range(0, 100).ToList(); + // id = null; + Db.Queryable().Where(it => id.Contains(it.Id)).ToList(); + } + } + + public class testmmxxxmm121 + { + [SugarColumn(IsPrimaryKey =true,IsIdentity =true)] + public int id { get; set; } + [SugarColumn(ColumnDataType ="float4",IsNullable =true)] + public float? name { get; set; } + [SugarColumn(ColumnDataType = "float4", IsNullable = false)] + public float? name2 { get; set; } + + } + +} diff --git a/Src/Asp.Net/OracleTest/OracleTest.csproj b/Src/Asp.Net/OracleTest/OracleTest.csproj index bea5de571..c2a978a51 100644 --- a/Src/Asp.Net/OracleTest/OracleTest.csproj +++ b/Src/Asp.Net/OracleTest/OracleTest.csproj @@ -46,6 +46,7 @@ + diff --git a/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleExpressionContext.cs b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleExpressionContext.cs index 72e2a2165..00ff8fcbb 100644 --- a/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleExpressionContext.cs +++ b/Src/Asp.Net/SqlSugar/Realization/Oracle/SqlBuilder/OracleExpressionContext.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; @@ -14,7 +15,7 @@ namespace SqlSugar public SqlSugarProvider Context { get; set; } public OracleExpressionContext() { - base.DbMehtods = new OracleMethod(); + base.DbMehtods = new OracleMethod(); } public override string SqlParameterKeyWord { @@ -40,6 +41,42 @@ namespace SqlSugar } public partial class OracleMethod : DefaultDbMethod, IDbMethods { + private void PageEach(IEnumerable pageItems, int pageSize, Action> action) + { + if (pageItems != null && pageItems.Any()) + { + int totalRecord = pageItems.Count(); + int pageCount = (totalRecord + pageSize - 1) / pageSize; + for (int i = 1; i <= pageCount; i++) + { + var list = pageItems.Skip((i - 1) * pageSize).Take(pageSize).ToList(); + action(list); + } + } + } + public override string ContainsArray(MethodCallExpressionModel model) + { + if (model.Args[0].MemberValue == null) + { + return base.ContainsArray(model); + } + var inValueIEnumerable = ((IEnumerable)model.Args[0].MemberValue).Cast().ToArray(); + if (inValueIEnumerable.Count() < 1000) + { + return base.ContainsArray(model); + } + else + { + string result = ""; + PageEach(inValueIEnumerable, 999, it => + { + model.Args.First().MemberValue = it; + result+= (base.ContainsArray(model) + " OR "); + + }); + return " ( "+result.TrimEnd(' ').TrimEnd('R').TrimEnd('O')+" ) "; + } + } public override string ToInt64(MethodCallExpressionModel model) { var parameter = model.Args[0];