From 20e06ef3a23fed4dceceee3daf45d118433b82a4 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Mon, 25 Nov 2019 22:14:09 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E6=8F=92=E5=85=A5=20Values=20=E6=95=B0=E9=87=8F=E9=99=90?= =?UTF-8?q?=E5=88=B6=E8=B6=85=E5=87=BA=E7=9A=84=E5=88=A4=E6=96=AD=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.Tests/FreeSql.Tests/UnitTest2.cs | 111 ++++++++++++++++-- .../Internal/CommonProvider/InsertProvider.cs | 38 ++---- .../Internal/CommonProvider/UpdateProvider.cs | 38 ++---- 3 files changed, 120 insertions(+), 67 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs index cf9195e2..fb7f5ac3 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs @@ -193,23 +193,108 @@ namespace FreeSql.Tests public DateTime? ct2 { get; set; } } + public class TBatInst + { + public Guid Id { get; set; } + public string Name { get; set; } + } + [Fact] public void Test02() { - var serverTime = g.pgsql.Select().Limit(1).First(a => DateTime.UtcNow); - var timeOffset = DateTime.UtcNow.Subtract(serverTime); //减去数据库时间 + g.sqlserver.Delete().Where("1=1").ExecuteAffrows(); + g.mysql.Delete().Where("1=1").ExecuteAffrows(); + g.pgsql.Delete().Where("1=1").ExecuteAffrows(); + g.oracle.Delete().Where("1=1").ExecuteAffrows(); + g.sqlite.Delete().Where("1=1").ExecuteAffrows(); - g.pgsql.Aop.AuditValue += new EventHandler((_, e) => - { - if (e.Column.Attribute.MapType.NullableTypeOrThis() == typeof(DateTime)) - { - if (e.Value == null || (DateTime)e.Value == default(DateTime)) - { - e.Value = DateTime.Now.Subtract(timeOffset); - return; - } - } - }); + g.sqlserver.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows(); + g.mysql.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows(); + g.pgsql.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows(); + g.oracle.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows(); + g.sqlite.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows(); + + Assert.Equal(1048, g.sqlserver.Select().Count()); + Assert.Equal(1048, g.mysql.Select().Count()); + Assert.Equal(1048, g.pgsql.Select().Count()); + Assert.Equal(1048, g.oracle.Select().Count()); + Assert.Equal(1048, g.sqlite.Select().Count()); + + //---- + + g.sqlserver.Delete().Where("1=1").ExecuteAffrows(); + g.mysql.Delete().Where("1=1").ExecuteAffrows(); + g.pgsql.Delete().Where("1=1").ExecuteAffrows(); + g.oracle.Delete().Where("1=1").ExecuteAffrows(); + g.sqlite.Delete().Where("1=1").ExecuteAffrows(); + + g.sqlserver.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows(); + g.mysql.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows(); + g.pgsql.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows(); + g.oracle.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows(); + g.sqlite.Insert(Enumerable.Range(0, 1048).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows(); + + Assert.Equal(1048, g.sqlserver.Select().Count()); + Assert.Equal(1048, g.mysql.Select().Count()); + Assert.Equal(1048, g.pgsql.Select().Count()); + Assert.Equal(1048, g.oracle.Select().Count()); + Assert.Equal(1048, g.sqlite.Select().Count()); + + //---- + + g.sqlserver.Delete().Where("1=1").ExecuteAffrows(); + g.mysql.Delete().Where("1=1").ExecuteAffrows(); + g.pgsql.Delete().Where("1=1").ExecuteAffrows(); + g.oracle.Delete().Where("1=1").ExecuteAffrows(); + g.sqlite.Delete().Where("1=1").ExecuteAffrows(); + + g.sqlserver.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows(); + g.mysql.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows(); + g.pgsql.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows(); + g.oracle.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows(); + g.sqlite.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).ExecuteAffrows(); + + Assert.Equal(3348, g.sqlserver.Select().Count()); + Assert.Equal(3348, g.mysql.Select().Count()); + Assert.Equal(3348, g.pgsql.Select().Count()); + Assert.Equal(3348, g.oracle.Select().Count()); + Assert.Equal(3348, g.sqlite.Select().Count()); + + //---- + + g.sqlserver.Delete().Where("1=1").ExecuteAffrows(); + g.mysql.Delete().Where("1=1").ExecuteAffrows(); + g.pgsql.Delete().Where("1=1").ExecuteAffrows(); + g.oracle.Delete().Where("1=1").ExecuteAffrows(); + g.sqlite.Delete().Where("1=1").ExecuteAffrows(); + + g.sqlserver.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows(); + g.mysql.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows(); + g.pgsql.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows(); + g.oracle.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows(); + g.sqlite.Insert(Enumerable.Range(0, 3348).Select(a => new TBatInst { Name = "test" + a }).ToList()).NoneParameter().ExecuteAffrows(); + + Assert.Equal(3348, g.sqlserver.Select().Count()); + Assert.Equal(3348, g.mysql.Select().Count()); + Assert.Equal(3348, g.pgsql.Select().Count()); + Assert.Equal(3348, g.oracle.Select().Count()); + Assert.Equal(3348, g.sqlite.Select().Count()); + + + //var serverTime = g.pgsql.Select().Limit(1).First(a => DateTime.UtcNow); + //var timeOffset = DateTime.UtcNow.Subtract(serverTime); //减去数据库时间 + + //g.pgsql.Aop.AuditValue += new EventHandler((_, e) => + //{ + // if (e.Column.Attribute.MapType.NullableTypeOrThis() == typeof(DateTime)) + // { + // if (e.Value == null || (DateTime)e.Value == default(DateTime)) + // { + // e.Value = DateTime.Now.Subtract(timeOffset); + // return; + // } + // } + //}); g.pgsql.Delete().Where("1=1").ExecuteAffrows(); diff --git a/FreeSql/Internal/CommonProvider/InsertProvider.cs b/FreeSql/Internal/CommonProvider/InsertProvider.cs index 83b63483..ed89acca 100644 --- a/FreeSql/Internal/CommonProvider/InsertProvider.cs +++ b/FreeSql/Internal/CommonProvider/InsertProvider.cs @@ -147,37 +147,21 @@ namespace FreeSql.Internal.CommonProvider parameterLimit = parameterLimit - 1; if (_source == null || _source.Any() == false) return new List[0]; if (_source.Count == 1) return new[] { _source }; - if (_noneParameter) - { - if (_source.Count < valuesLimit) return new[] { _source }; - var execCount = (int)Math.Ceiling(1.0 * _source.Count / valuesLimit); - var ret = new List[execCount]; - for (var a = 0; a < execCount; a++) - { - var subSource = new List(); - subSource = _source.GetRange(a * valuesLimit, Math.Min(valuesLimit, _source.Count - a * valuesLimit)); - ret[a] = subSource; - } - return ret; - } - else + var takeMax = valuesLimit; + if (_noneParameter == false) { var colSum = _table.Columns.Count - _ignore.Count; - var takeMax = parameterLimit / colSum; - var pamTotal = colSum * _source.Count; - if (pamTotal < parameterLimit) return new[] { _source }; - - var execCount = (int)Math.Ceiling(1.0 * pamTotal / takeMax / colSum); - var ret = new List[execCount]; - for (var a = 0; a < execCount; a++) - { - var subSource = new List(); - subSource = _source.GetRange(a * takeMax, Math.Min(takeMax, _source.Count - a * takeMax)); - ret[a] = subSource; - } - return ret; + takeMax = parameterLimit / colSum; + if (takeMax > valuesLimit) takeMax = valuesLimit; } + if (_source.Count <= takeMax) return new[] { _source }; + + var execCount = (int)Math.Ceiling(1.0 * _source.Count / takeMax); + var ret = new List[execCount]; + for (var a = 0; a < execCount; a++) + ret[a] = _source.GetRange(a * takeMax, Math.Min(takeMax, _source.Count - a * takeMax)); + return ret; } protected int SplitExecuteAffrows(int valuesLimit, int parameterLimit) { diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 255f7c1d..f8abaa1a 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -107,37 +107,21 @@ namespace FreeSql.Internal.CommonProvider parameterLimit = parameterLimit - 1; if (_source == null || _source.Any() == false) return new List[0]; if (_source.Count == 1) return new[] { _source }; - if (_noneParameter) - { - if (_source.Count < valuesLimit) return new[] { _source }; - var execCount = (int)Math.Ceiling(1.0 * _source.Count / valuesLimit); - var ret = new List[execCount]; - for (var a = 0; a < execCount; a++) - { - var subSource = new List(); - subSource = _source.GetRange(a * valuesLimit, Math.Min(valuesLimit, _source.Count - a * valuesLimit)); - ret[a] = subSource; - } - return ret; - } - else + var takeMax = valuesLimit; + if (_noneParameter == false) { var colSum = _table.Columns.Count - _ignore.Count; - var takeMax = parameterLimit / colSum; - var pamTotal = colSum * _source.Count; - if (pamTotal < parameterLimit) return new[] { _source }; - - var execCount = (int)Math.Ceiling(1.0 * pamTotal / takeMax / colSum); - var ret = new List[execCount]; - for (var a = 0; a < execCount; a++) - { - var subSource = new List(); - subSource = _source.GetRange(a * takeMax, Math.Min(takeMax, _source.Count - a * takeMax)); - ret[a] = subSource; - } - return ret; + takeMax = parameterLimit / colSum; + if (takeMax > valuesLimit) takeMax = valuesLimit; } + if (_source.Count <= takeMax) return new[] { _source }; + + var execCount = (int)Math.Ceiling(1.0 * _source.Count / takeMax); + var ret = new List[execCount]; + for (var a = 0; a < execCount; a++) + ret[a] = _source.GetRange(a * takeMax, Math.Min(takeMax, _source.Count - a * takeMax)); + return ret; } protected int SplitExecuteAffrows(int valuesLimit, int parameterLimit) {