diff --git a/Directory.Build.props b/Directory.Build.props index 374742b9..70925ede 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,4 +1,4 @@ - + https://github.com/dotnetcore/FreeSql true @@ -11,7 +11,7 @@ diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index b09362ba..4efbf7d9 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -600,15 +600,30 @@ namespace base_entity BaseEntity.Initialization(fsql, () => _asyncUow.Value); #endregion + var updatejoin031sql = fsql.Update() + .Join(fsql.Select().Where(a => a.GroupName == "xxx"), (a, b) => a.GroupId == b.Id) + .AsTable("t1", null) + .Set((a, b) => b.GroupName == a.Username + "b.groupname") + .ToSql(); + + fsql.CodeFirst.Entity(e => + { + e.Help().Navigate(b => b.a, nameof(B11.Id)); + }); + fsql.CodeFirst.Entity(e => { }); + + var a11sql01 = fsql.Select().Where(a => a.Id == 1).ToSql(a => new { a.Name, AName = a.a.Name }); + + var risWorkListRepo = fsql.GetRepository(); + risWorkListRepo.InsertOrUpdate(new EBH_RisWorkList + { + RequisitionID = "xxx" + }); + var tqq01 = fsql.Select().Where(a => a.IsDeleted || a.IsDeleted || a.IsDeleted).ToSql(); fsql.GlobalFilter.Apply("test01", a => a.IsDeleted == false); - var updatejoin031sql = fsql.Update() - .Join((a, b) => a.GroupId == b.Id) - .Set((a, b) => b.GroupName == a.Username + "b.groupname") - .ToSql(); - fsql.UseJsonMap(); fsql.Select().Where(a => a.FormLocking == null).Count(); @@ -2678,4 +2693,261 @@ class FormLocking { public string Value { get; set; } public string Text { get; set; } +} +[JsonObject(MemberSerialization.OptIn), Table(Name = "RIS_WORKLIST")] +public class EBH_RisWorkList +{ + [JsonProperty, Column(DbType = "varchar(64)", IsPrimary = true)] + public string RequisitionID { get; set; } + + [JsonProperty, Column(Name = "accession_number", DbType = "varchar(32)")] + public string Accession_number { get; set; } + + [JsonProperty, Column(DbType = "varchar(128)")] + public string Address { get; set; } + + [JsonProperty] + public int? AFCID { get; set; } + + [JsonProperty, Column(IsIdentity = true)] + public int AutoIndex { get; set; } + + [JsonProperty, Column(DbType = "varchar(32)")] + public string Birthday { get; set; } + + [JsonProperty, Column(DbType = "varchar(8)")] + public string BirthTime { get; set; } + + [JsonProperty, Column(DbType = "varchar(32)")] + public string CertificateID { get; set; } + + [JsonProperty, Column(DbType = "varchar(512)")] + public string CheckSTDescribed { get; set; } + + [JsonProperty, Column(DbType = "varchar(2048)")] + public string ClinicDiagnose { get; set; } + + [JsonProperty, Column(DbType = "varchar(32)")] + public string ClinicID { get; set; } + + [JsonProperty] + public int? Confidentiality { get; set; } + + [JsonProperty, Column(DbType = "varchar(32)")] + public string CustomCheckNumber { get; set; } + + [JsonProperty] + public int DepartmentID { get; set; } + + [JsonProperty] + public int EmergencyID { get; set; } + + [JsonProperty, Column(DbType = "varchar(32)")] + public string EndoscopyType { get; set; } + + [JsonProperty, Column(DbType = "varchar(128)")] + public string ExamBodyPart { get; set; } + + [JsonProperty] + public int? ExamBodyPartNum { get; set; } + + [JsonProperty, Column(DbType = "varchar(32)")] + public string ExamDate { get; set; } + + [JsonProperty, Column(DbType = "varchar(128)")] + public string ExamMethod { get; set; } + + [JsonProperty, Column(DbType = "varchar(32)")] + public string ExamParameter { get; set; } + + [JsonProperty, Column(Name = "exampath", DbType = "varchar(50)")] + public string Exampath { get; set; } + + [JsonProperty, Column(DbType = "varchar(32)")] + public string ExamTime { get; set; } + + [JsonProperty, Column(DbType = "varchar(128)")] + public string FamilyTelephe { get; set; } + + [JsonProperty, Column(DbType = "varchar(64)")] + public string FeeTypeName { get; set; } + + [JsonProperty] + public int? FollowFlag { get; set; } + + [JsonProperty] + public int? HaveImage { get; set; } + + [JsonProperty] + public int? HaveRemark { get; set; } + + [JsonProperty, Column(DbType = "varchar(50)")] + public string HospitalAreaName { get; set; } + + [JsonProperty, Column(DbType = "varchar(32)")] + public string HospitalID { get; set; } + + [JsonProperty, Column(DbType = "varchar(32)")] + public string ImageName { get; set; } + + [JsonProperty, Column(DbType = "varchar(128)")] + public string ImagePath { get; set; } + + [JsonProperty, Column(Name = "imagequality", DbType = "varchar(32)")] + public string Imagequality { get; set; } + + [JsonProperty] + public int? InAdvanceQueue { get; set; } + + [JsonProperty] + public int? InDeedQueue { get; set; } + + [JsonProperty, Column(Name = "isAddPatient", DbType = "varchar(2)")] + public string IsAddPatient { get; set; } + + [JsonProperty, Column(Name = "isChangeDate", DbType = "varchar(2)")] + public string IsChangeDate { get; set; } + + [JsonProperty, Column(Name = "isIBD", DbType = "varchar(2)")] + public string IsIBD { get; set; } + + [JsonProperty] + public int? IsNotCallNumber { get; set; } + + [JsonProperty] + public int? IsNotNOScreen { get; set; } + + [JsonProperty, Column(Name = "isOverTime", DbType = "varchar(2)")] + public string IsOverTime { get; set; } + + [JsonProperty] + public int? IsPaSSNumber { get; set; } + + [JsonProperty, Column(Name = "isSEZCJ", DbType = "varchar(2)")] + public string IsSEZCJ { get; set; } + + [JsonProperty] + public int IsSpePatientSign { get; set; } + + [JsonProperty] + public int? IsTexu { get; set; } + + [JsonProperty, Column(Name = "isZhiLiao", DbType = "varchar(2)")] + public string IsZhiLiao { get; set; } + + [JsonProperty] + public DateTime? LastTryForImage { get; set; } + + [JsonProperty, Column(DbType = "varchar(32)")] + public string MedicalCardNumber { get; set; } + + [JsonProperty, Column(DbType = "varchar(4096)")] + public string MedicalHistory { get; set; } + + [JsonProperty, Column(DbType = "varchar(32)")] + public string MIcardNumber { get; set; } + + [JsonProperty, Column(DbType = "varchar(32)")] + public string ModalityAE { get; set; } + + [JsonProperty] + public int? ModalityID { get; set; } + + [JsonProperty, Column(DbType = "varchar(32)")] + public string ModalityName { get; set; } + + [JsonProperty, Column(DbType = "varchar(32)")] + public string ModalityRemark { get; set; } + + [JsonProperty] + public int? ModalityRoomID { get; set; } + + [JsonProperty, Column(DbType = "varchar(32)")] + public string ModalityType { get; set; } + + [JsonProperty] + public int? NurseStationFlag { get; set; } + + [JsonProperty, Column(DbType = "varchar(32)")] + public string PathologicID { get; set; } + + [JsonProperty, Column(DbType = "varchar(32)")] + public string PatientID { get; set; } + + [JsonProperty] + public int PatientTypeID { get; set; } + + [JsonProperty, Column(DbType = "varchar(32)")] + public string PhysicalExamID { get; set; } + + [JsonProperty, Column(DbType = "varchar(128)")] + public string PhysicianRequirements { get; set; } + + [JsonProperty] + public int PrintFlag { get; set; } + + [JsonProperty] + public int? PrintNoticeFlag { get; set; } + + [JsonProperty, Column(DbType = "varchar(128)")] + public string PTN_NAME { get; set; } + + [JsonProperty, Column(DbType = "varchar(128)")] + public string PY { get; set; } + + [JsonProperty] + public int QueueStateID { get; set; } + + [JsonProperty, Column(DbType = "varchar(2048)")] + public string Remarks { get; set; } + + [JsonProperty, Column(DbType = "varchar(32)")] + public string ReqDepartment { get; set; } + + [JsonProperty, Column(DbType = "varchar(32)")] + public string ReqHospital { get; set; } + + [JsonProperty, Column(DbType = "varchar(32)")] + public string ReqPhysician { get; set; } + + [JsonProperty] + public int? ResourceID { get; set; } + + [JsonProperty] + public int? SendRepFlag { get; set; } + + [JsonProperty, Column(Name = "SEX", DbType = "varchar(32)")] + public string Sex { get; set; } + + [JsonProperty, Column(DbType = "varchar(50)")] + public string SickbedID { get; set; } + + [JsonProperty] + public int? StateID { get; set; } + + [JsonProperty] + public int? StationID { get; set; } + + [JsonProperty, Column(DbType = "varchar(32)")] + public string Telephone { get; set; } + + [JsonProperty] + public double? Weight { get; set; } + + [JsonProperty, Column(DbType = "varchar(128)")] + public string WorkStationAddress { get; set; } + + +} +public class A11 +{ + public int Id { get; set; } + public string Name { get; set; } +} + +public class B11 +{ + public int Id { get; set; } + public string Name { get; set; } + public A11 a { get; set; } } \ No newline at end of file diff --git a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj index 548373c9..0e78ff0e 100644 --- a/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj +++ b/Extensions/FreeSql.Extensions.AggregateRoot/FreeSql.Extensions.AggregateRoot.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net45;net40 @@ -18,7 +18,7 @@ true key.snk false - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj index d858d782..37162206 100644 --- a/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj +++ b/Extensions/FreeSql.Extensions.BaseEntity/FreeSql.Extensions.BaseEntity.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net45;net40 @@ -19,7 +19,7 @@ key.snk false latest - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj index 4c1b570c..3fa2ba05 100644 --- a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj +++ b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net45;net40 @@ -18,7 +18,7 @@ true key.snk false - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj index 3e084d11..cf0f3958 100644 --- a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj +++ b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;netstandard2.1;net45;net40 @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj index 82507299..c29ab312 100644 --- a/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj +++ b/Extensions/FreeSql.Extensions.Linq/FreeSql.Extensions.Linq.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net45;net40 @@ -18,7 +18,7 @@ true key.snk false - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj index 864cee04..891e2116 100644 --- a/Extensions/FreeSql.Generator/FreeSql.Generator.csproj +++ b/Extensions/FreeSql.Generator/FreeSql.Generator.csproj @@ -1,4 +1,4 @@ - + Exe @@ -13,7 +13,7 @@ https://github.com/2881099/FreeSql https://github.com/2881099/FreeSql FreeSql DbFirst 实体生成器 - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/FreeSql.All/FreeSql.All.csproj b/FreeSql.All/FreeSql.All.csproj index ce39d84a..ec070df3 100644 --- a/FreeSql.All/FreeSql.All.csproj +++ b/FreeSql.All/FreeSql.All.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net45;net40 @@ -17,7 +17,7 @@ true key.snk false - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj index b33ab433..d07beb1c 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.csproj +++ b/FreeSql.DbContext/FreeSql.DbContext.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net70;net60;net50;netcoreapp31;netcoreapp21;net45;net40 @@ -17,7 +17,7 @@ true key.snk false - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj index 46db453f..cbe49bb1 100644 --- a/FreeSql.Repository/FreeSql.Repository.csproj +++ b/FreeSql.Repository/FreeSql.Repository.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net70;net60;net50;netcoreapp31;netcoreapp21;net45;net40 @@ -17,7 +17,7 @@ true key.snk false - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Custom/MySql/Curd/MySqlInsertOrUpdateIfExistsDoNothingTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Custom/MySql/Curd/MySqlInsertOrUpdateIfExistsDoNothingTest.cs index a9b9c19e..392aa9af 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Custom/MySql/Curd/MySqlInsertOrUpdateIfExistsDoNothingTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Custom/MySql/Curd/MySqlInsertOrUpdateIfExistsDoNothingTest.cs @@ -17,83 +17,27 @@ namespace FreeSql.Tests.Custom.MySql fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb02`(`id`, `name`) SELECT 1, '01' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb02`(`id`, `name`) VALUES(1, '01')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb02`(`id`, `name`) SELECT 1, '011' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb02`(`id`, `name`) VALUES(1, '011')", sql); Assert.Equal(0, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb02 { id = 2, name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb02`(`id`, `name`) SELECT 2, '02' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 2) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb02`(`id`, `name`) VALUES(2, '02')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb02 { id = 1, name = "01" }, new tbioudb02 { id = 2, name = "02" }, new tbioudb02 { id = 3, name = "03" }, new tbioudb02 { id = 4, name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb02`(`id`, `name`) SELECT 1, '01' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '02' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '03' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '04' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb02`(`id`, `name`) VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')", sql); Assert.Equal(2, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb02 { id = 1, name = "001" }, new tbioudb02 { id = 2, name = "002" }, new tbioudb02 { id = 3, name = "003" }, new tbioudb02 { id = 4, name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb02`(`id`, `name`) SELECT 1, '001' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '002' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '003' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '004' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb02`(`id`, `name`) VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')", sql); Assert.Equal(0, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList(); Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count()); @@ -109,83 +53,27 @@ UNION ALL fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 1, '01' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb022`(`id`, `name`) VALUES(1, '01')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 1, '011' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb022`(`id`, `name`) VALUES(1, '011')", sql); Assert.Equal(0, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb022 { id = 2, name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 2, '02' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 2) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb022`(`id`, `name`) VALUES(2, '02')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "01" }, new tbioudb022 { id = 2, name = "02" }, new tbioudb022 { id = 3, name = "03" }, new tbioudb022 { id = 4, name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 1, '01' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '02' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '03' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '04' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb022`(`id`, `name`) VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')", sql); Assert.Equal(2, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "001" }, new tbioudb022 { id = 2, name = "002" }, new tbioudb022 { id = 3, name = "003" }, new tbioudb022 { id = 4, name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 1, '001' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '002' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '003' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '004' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb022`(`id`, `name`) VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')", sql); Assert.Equal(0, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList(); Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count()); @@ -219,29 +107,7 @@ UNION ALL //--no primary and yes iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "100001" }, new tbioudb022 { name = "00001" }, new tbioudb022 { id = 2, name = "100002" }, new tbioudb022 { name = "00002" }, new tbioudb022 { id = 3, name = "100003" }, new tbioudb022 { name = "00003" }, new tbioudb022 { id = 4, name = "100004" }, new tbioudb022 { name = "00004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 1, '100001' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '100002' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '100003' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '100004' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 4) - limit 0,1) + Assert.Equal(@"INSERT IGNORE INTO `tbioudb022`(`id`, `name`) VALUES(1, '100001'), (2, '100002'), (3, '100003'), (4, '100004') ; @@ -263,83 +129,27 @@ INSERT INTO `tbioudb022`(`name`) VALUES('00001'), ('00002'), ('00003'), ('00004' fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb03`(`id1`, `id2`, `name`) SELECT 1, '01', '01' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 1 AND a.`id2` = '01') - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb03`(`id1`, `id2`, `name`) VALUES(1, '01', '01')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb03`(`id1`, `id2`, `name`) SELECT 1, '01', '011' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 1 AND a.`id2` = '01') - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb03`(`id1`, `id2`, `name`) VALUES(1, '01', '011')", sql); Assert.Equal(0, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 2, id2 = "02", name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb03`(`id1`, `id2`, `name`) SELECT 2, '02', '02' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 2 AND a.`id2` = '02') - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb03`(`id1`, `id2`, `name`) VALUES(2, '02', '02')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb03 { id1 = 1, id2 = "01", name = "01" }, new tbioudb03 { id1 = 2, id2 = "02", name = "02" }, new tbioudb03 { id1 = 3, id2 = "03", name = "03" }, new tbioudb03 { id1 = 4, id2 = "04", name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb03`(`id1`, `id2`, `name`) SELECT 1, '01', '01' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 1 AND a.`id2` = '01') - limit 0,1) -UNION ALL - SELECT 2, '02', '02' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 2 AND a.`id2` = '02') - limit 0,1) -UNION ALL - SELECT 3, '03', '03' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 3 AND a.`id2` = '03') - limit 0,1) -UNION ALL - SELECT 4, '04', '04' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 4 AND a.`id2` = '04') - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb03`(`id1`, `id2`, `name`) VALUES(1, '01', '01'), (2, '02', '02'), (3, '03', '03'), (4, '04', '04')", sql); Assert.Equal(2, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb03 { id1 = 1, id2 = "01", name = "001" }, new tbioudb03 { id1 = 2, id2 = "02", name = "002" }, new tbioudb03 { id1 = 3, id2 = "03", name = "003" }, new tbioudb03 { id1 = 4, id2 = "04", name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb03`(`id1`, `id2`, `name`) SELECT 1, '01', '001' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 1 AND a.`id2` = '01') - limit 0,1) -UNION ALL - SELECT 2, '02', '002' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 2 AND a.`id2` = '02') - limit 0,1) -UNION ALL - SELECT 3, '03', '003' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 3 AND a.`id2` = '03') - limit 0,1) -UNION ALL - SELECT 4, '04', '004' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 4 AND a.`id2` = '04') - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb03`(`id1`, `id2`, `name`) VALUES(1, '01', '001'), (2, '02', '002'), (3, '03', '003'), (4, '04', '004')", sql); Assert.Equal(0, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => a.id1 == 1 && a.id2 == "01" || a.id1 == 2 && a.id2 == "02" || a.id1 == 3 && a.id2 == "03" || a.id1 == 4 && a.id2 == "04").ToList(); Assert.Equal(4, lst.Where(a => a.name == "0" + a.id1).Count()); @@ -359,83 +169,27 @@ UNION ALL fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) SELECT 1, '01', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) VALUES(1, '01', 0, now(3))", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) SELECT 1, '011', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) VALUES(1, '011', 0, now(3))", sql); Assert.Equal(0, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb04 { id = 2, name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) SELECT 2, '02', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 2) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) VALUES(2, '02', 0, now(3))", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb04 { id = 1, name = "01" }, new tbioudb04 { id = 2, name = "02" }, new tbioudb04 { id = 3, name = "03" }, new tbioudb04 { id = 4, name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) SELECT 1, '01', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '02', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '03', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '04', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) VALUES(1, '01', 0, now(3)), (2, '02', 0, now(3)), (3, '03', 0, now(3)), (4, '04', 0, now(3))", sql); Assert.Equal(2, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb04 { id = 1, name = "001" }, new tbioudb04 { id = 2, name = "002" }, new tbioudb04 { id = 3, name = "003" }, new tbioudb04 { id = 4, name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) SELECT 1, '001', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '002', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '003', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '004', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) VALUES(1, '001', 0, now(3)), (2, '002', 0, now(3)), (3, '003', 0, now(3)), (4, '004', 0, now(3))", sql); Assert.Equal(0, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList(); Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count()); diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlInsertOrUpdateIfExistsDoNothingTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlInsertOrUpdateIfExistsDoNothingTest.cs index 173fa8eb..f14dc6e8 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlInsertOrUpdateIfExistsDoNothingTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlInsertOrUpdateIfExistsDoNothingTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; using System.Linq; @@ -17,83 +17,27 @@ namespace FreeSql.Tests.MySqlConnector fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb02`(`id`, `name`) SELECT 1, '01' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb02`(`id`, `name`) VALUES(1, '01')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb02`(`id`, `name`) SELECT 1, '011' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb02`(`id`, `name`) VALUES(1, '011')", sql); Assert.Equal(0, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb02 { id = 2, name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb02`(`id`, `name`) SELECT 2, '02' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 2) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb02`(`id`, `name`) VALUES(2, '02')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb02 { id = 1, name = "01" }, new tbioudb02 { id = 2, name = "02" }, new tbioudb02 { id = 3, name = "03" }, new tbioudb02 { id = 4, name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb02`(`id`, `name`) SELECT 1, '01' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '02' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '03' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '04' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb02`(`id`, `name`) VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')", sql); Assert.Equal(2, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb02 { id = 1, name = "001" }, new tbioudb02 { id = 2, name = "002" }, new tbioudb02 { id = 3, name = "003" }, new tbioudb02 { id = 4, name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb02`(`id`, `name`) SELECT 1, '001' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '002' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '003' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '004' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb02`(`id`, `name`) VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')", sql); Assert.Equal(0, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList(); Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count()); @@ -109,83 +53,27 @@ UNION ALL fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 1, '01' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb022`(`id`, `name`) VALUES(1, '01')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 1, '011' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb022`(`id`, `name`) VALUES(1, '011')", sql); Assert.Equal(0, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb022 { id = 2, name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 2, '02' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 2) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb022`(`id`, `name`) VALUES(2, '02')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "01" }, new tbioudb022 { id = 2, name = "02" }, new tbioudb022 { id = 3, name = "03" }, new tbioudb022 { id = 4, name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 1, '01' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '02' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '03' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '04' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb022`(`id`, `name`) VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')", sql); Assert.Equal(2, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "001" }, new tbioudb022 { id = 2, name = "002" }, new tbioudb022 { id = 3, name = "003" }, new tbioudb022 { id = 4, name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 1, '001' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '002' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '003' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '004' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb022`(`id`, `name`) VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')", sql); Assert.Equal(0, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList(); Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count()); @@ -219,29 +107,7 @@ UNION ALL //--no primary and yes iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "100001" }, new tbioudb022 { name = "00001" }, new tbioudb022 { id = 2, name = "100002" }, new tbioudb022 { name = "00002" }, new tbioudb022 { id = 3, name = "100003" }, new tbioudb022 { name = "00003" }, new tbioudb022 { id = 4, name = "100004" }, new tbioudb022 { name = "00004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 1, '100001' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '100002' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '100003' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '100004' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 4) - limit 0,1) + Assert.Equal(@"INSERT IGNORE INTO `tbioudb022`(`id`, `name`) VALUES(1, '100001'), (2, '100002'), (3, '100003'), (4, '100004') ; @@ -263,83 +129,27 @@ INSERT INTO `tbioudb022`(`name`) VALUES('00001'), ('00002'), ('00003'), ('00004' fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb03`(`id1`, `id2`, `name`) SELECT 1, '01', '01' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 1 AND a.`id2` = '01') - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb03`(`id1`, `id2`, `name`) VALUES(1, '01', '01')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb03`(`id1`, `id2`, `name`) SELECT 1, '01', '011' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 1 AND a.`id2` = '01') - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb03`(`id1`, `id2`, `name`) VALUES(1, '01', '011')", sql); Assert.Equal(0, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 2, id2 = "02", name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb03`(`id1`, `id2`, `name`) SELECT 2, '02', '02' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 2 AND a.`id2` = '02') - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb03`(`id1`, `id2`, `name`) VALUES(2, '02', '02')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb03 { id1 = 1, id2 = "01", name = "01" }, new tbioudb03 { id1 = 2, id2 = "02", name = "02" }, new tbioudb03 { id1 = 3, id2 = "03", name = "03" }, new tbioudb03 { id1 = 4, id2 = "04", name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb03`(`id1`, `id2`, `name`) SELECT 1, '01', '01' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 1 AND a.`id2` = '01') - limit 0,1) -UNION ALL - SELECT 2, '02', '02' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 2 AND a.`id2` = '02') - limit 0,1) -UNION ALL - SELECT 3, '03', '03' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 3 AND a.`id2` = '03') - limit 0,1) -UNION ALL - SELECT 4, '04', '04' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 4 AND a.`id2` = '04') - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb03`(`id1`, `id2`, `name`) VALUES(1, '01', '01'), (2, '02', '02'), (3, '03', '03'), (4, '04', '04')", sql); Assert.Equal(2, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb03 { id1 = 1, id2 = "01", name = "001" }, new tbioudb03 { id1 = 2, id2 = "02", name = "002" }, new tbioudb03 { id1 = 3, id2 = "03", name = "003" }, new tbioudb03 { id1 = 4, id2 = "04", name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb03`(`id1`, `id2`, `name`) SELECT 1, '01', '001' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 1 AND a.`id2` = '01') - limit 0,1) -UNION ALL - SELECT 2, '02', '002' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 2 AND a.`id2` = '02') - limit 0,1) -UNION ALL - SELECT 3, '03', '003' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 3 AND a.`id2` = '03') - limit 0,1) -UNION ALL - SELECT 4, '04', '004' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 4 AND a.`id2` = '04') - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb03`(`id1`, `id2`, `name`) VALUES(1, '01', '001'), (2, '02', '002'), (3, '03', '003'), (4, '04', '004')", sql); Assert.Equal(0, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => a.id1 == 1 && a.id2 == "01" || a.id1 == 2 && a.id2 == "02" || a.id1 == 3 && a.id2 == "03" || a.id1 == 4 && a.id2 == "04").ToList(); Assert.Equal(4, lst.Where(a => a.name == "0" + a.id1).Count()); @@ -359,83 +169,27 @@ UNION ALL fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) SELECT 1, '01', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) VALUES(1, '01', 0, now(3))", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) SELECT 1, '011', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) VALUES(1, '011', 0, now(3))", sql); Assert.Equal(0, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb04 { id = 2, name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) SELECT 2, '02', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 2) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) VALUES(2, '02', 0, now(3))", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb04 { id = 1, name = "01" }, new tbioudb04 { id = 2, name = "02" }, new tbioudb04 { id = 3, name = "03" }, new tbioudb04 { id = 4, name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) SELECT 1, '01', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '02', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '03', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '04', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) VALUES(1, '01', 0, now(3)), (2, '02', 0, now(3)), (3, '03', 0, now(3)), (4, '04', 0, now(3))", sql); Assert.Equal(2, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb04 { id = 1, name = "001" }, new tbioudb04 { id = 2, name = "002" }, new tbioudb04 { id = 3, name = "003" }, new tbioudb04 { id = 4, name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) SELECT 1, '001', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '002', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '003', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '004', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) VALUES(1, '001', 0, now(3)), (2, '002', 0, now(3)), (3, '003', 0, now(3)), (4, '004', 0, now(3))", sql); Assert.Equal(0, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList(); Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count()); diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlInsertOrUpdateIfExistsDoNothingTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlInsertOrUpdateIfExistsDoNothingTest.cs index 4b72f7e4..4568ee31 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlInsertOrUpdateIfExistsDoNothingTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlInsertOrUpdateIfExistsDoNothingTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; using System.Linq; @@ -17,83 +17,27 @@ namespace FreeSql.Tests.Odbc.MySql fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb02`(`id`, `name`) SELECT 1, '01' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb02`(`id`, `name`) VALUES(1, '01')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb02`(`id`, `name`) SELECT 1, '011' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb02`(`id`, `name`) VALUES(1, '011')", sql); Assert.Equal(0, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb02 { id = 2, name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb02`(`id`, `name`) SELECT 2, '02' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 2) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb02`(`id`, `name`) VALUES(2, '02')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb02 { id = 1, name = "01" }, new tbioudb02 { id = 2, name = "02" }, new tbioudb02 { id = 3, name = "03" }, new tbioudb02 { id = 4, name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb02`(`id`, `name`) SELECT 1, '01' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '02' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '03' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '04' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb02`(`id`, `name`) VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')", sql); Assert.Equal(2, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb02 { id = 1, name = "001" }, new tbioudb02 { id = 2, name = "002" }, new tbioudb02 { id = 3, name = "003" }, new tbioudb02 { id = 4, name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb02`(`id`, `name`) SELECT 1, '001' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '002' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '003' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '004' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb02`(`id`, `name`) VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')", sql); Assert.Equal(0, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList(); Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count()); @@ -109,83 +53,27 @@ UNION ALL fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 1, '01' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb022`(`id`, `name`) VALUES(1, '01')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 1, '011' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb022`(`id`, `name`) VALUES(1, '011')", sql); Assert.Equal(0, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb022 { id = 2, name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 2, '02' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 2) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb022`(`id`, `name`) VALUES(2, '02')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "01" }, new tbioudb022 { id = 2, name = "02" }, new tbioudb022 { id = 3, name = "03" }, new tbioudb022 { id = 4, name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 1, '01' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '02' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '03' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '04' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb022`(`id`, `name`) VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')", sql); Assert.Equal(2, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "001" }, new tbioudb022 { id = 2, name = "002" }, new tbioudb022 { id = 3, name = "003" }, new tbioudb022 { id = 4, name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 1, '001' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '002' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '003' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '004' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb022`(`id`, `name`) VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')", sql); Assert.Equal(0, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList(); Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count()); @@ -219,29 +107,7 @@ UNION ALL //--no primary and yes iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "100001" }, new tbioudb022 { name = "00001" }, new tbioudb022 { id = 2, name = "100002" }, new tbioudb022 { name = "00002" }, new tbioudb022 { id = 3, name = "100003" }, new tbioudb022 { name = "00003" }, new tbioudb022 { id = 4, name = "100004" }, new tbioudb022 { name = "00004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 1, '100001' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '100002' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '100003' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '100004' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 4) - limit 0,1) + Assert.Equal(@"INSERT IGNORE INTO `tbioudb022`(`id`, `name`) VALUES(1, '100001'), (2, '100002'), (3, '100003'), (4, '100004') ; @@ -263,83 +129,27 @@ INSERT INTO `tbioudb022`(`name`) VALUES('00001'), ('00002'), ('00003'), ('00004' fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb03`(`id1`, `id2`, `name`) SELECT 1, '01', '01' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 1 AND a.`id2` = '01') - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb03`(`id1`, `id2`, `name`) VALUES(1, '01', '01')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb03`(`id1`, `id2`, `name`) SELECT 1, '01', '011' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 1 AND a.`id2` = '01') - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb03`(`id1`, `id2`, `name`) VALUES(1, '01', '011')", sql); Assert.Equal(0, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 2, id2 = "02", name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb03`(`id1`, `id2`, `name`) SELECT 2, '02', '02' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 2 AND a.`id2` = '02') - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb03`(`id1`, `id2`, `name`) VALUES(2, '02', '02')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb03 { id1 = 1, id2 = "01", name = "01" }, new tbioudb03 { id1 = 2, id2 = "02", name = "02" }, new tbioudb03 { id1 = 3, id2 = "03", name = "03" }, new tbioudb03 { id1 = 4, id2 = "04", name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb03`(`id1`, `id2`, `name`) SELECT 1, '01', '01' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 1 AND a.`id2` = '01') - limit 0,1) -UNION ALL - SELECT 2, '02', '02' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 2 AND a.`id2` = '02') - limit 0,1) -UNION ALL - SELECT 3, '03', '03' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 3 AND a.`id2` = '03') - limit 0,1) -UNION ALL - SELECT 4, '04', '04' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 4 AND a.`id2` = '04') - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb03`(`id1`, `id2`, `name`) VALUES(1, '01', '01'), (2, '02', '02'), (3, '03', '03'), (4, '04', '04')", sql); Assert.Equal(2, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb03 { id1 = 1, id2 = "01", name = "001" }, new tbioudb03 { id1 = 2, id2 = "02", name = "002" }, new tbioudb03 { id1 = 3, id2 = "03", name = "003" }, new tbioudb03 { id1 = 4, id2 = "04", name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb03`(`id1`, `id2`, `name`) SELECT 1, '01', '001' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 1 AND a.`id2` = '01') - limit 0,1) -UNION ALL - SELECT 2, '02', '002' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 2 AND a.`id2` = '02') - limit 0,1) -UNION ALL - SELECT 3, '03', '003' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 3 AND a.`id2` = '03') - limit 0,1) -UNION ALL - SELECT 4, '04', '004' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 4 AND a.`id2` = '04') - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb03`(`id1`, `id2`, `name`) VALUES(1, '01', '001'), (2, '02', '002'), (3, '03', '003'), (4, '04', '004')", sql); Assert.Equal(0, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => a.id1 == 1 && a.id2 == "01" || a.id1 == 2 && a.id2 == "02" || a.id1 == 3 && a.id2 == "03" || a.id1 == 4 && a.id2 == "04").ToList(); Assert.Equal(4, lst.Where(a => a.name == "0" + a.id1).Count()); @@ -359,83 +169,27 @@ UNION ALL fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) SELECT 1, '01', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) VALUES(1, '01', 0, now(3))", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) SELECT 1, '011', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) VALUES(1, '011', 0, now(3))", sql); Assert.Equal(0, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb04 { id = 2, name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) SELECT 2, '02', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 2) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) VALUES(2, '02', 0, now(3))", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb04 { id = 1, name = "01" }, new tbioudb04 { id = 2, name = "02" }, new tbioudb04 { id = 3, name = "03" }, new tbioudb04 { id = 4, name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) SELECT 1, '01', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '02', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '03', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '04', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) VALUES(1, '01', 0, now(3)), (2, '02', 0, now(3)), (3, '03', 0, now(3)), (4, '04', 0, now(3))", sql); Assert.Equal(2, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb04 { id = 1, name = "001" }, new tbioudb04 { id = 2, name = "002" }, new tbioudb04 { id = 3, name = "003" }, new tbioudb04 { id = 4, name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) SELECT 1, '001', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '002', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '003', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '004', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) VALUES(1, '001', 0, now(3)), (2, '002', 0, now(3)), (3, '003', 0, now(3)), (4, '004', 0, now(3))", sql); Assert.Equal(0, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList(); Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count()); diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Sqlite.Data/Sqlite/Curd/SqliteInsertOrUpdateIfExistsDoNothingTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Sqlite.Data/Sqlite/Curd/SqliteInsertOrUpdateIfExistsDoNothingTest.cs index 46e0685d..1879055a 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Sqlite.Data/Sqlite/Curd/SqliteInsertOrUpdateIfExistsDoNothingTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Sqlite.Data/Sqlite/Curd/SqliteInsertOrUpdateIfExistsDoNothingTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; using System.Linq; @@ -17,83 +17,27 @@ namespace FreeSql.Tests.Sqlite fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb02""(""id"", ""name"") SELECT 1, '01' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb02"" a - WHERE (a.""id"" = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb02""(""id"", ""name"") VALUES(1, '01')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb02""(""id"", ""name"") SELECT 1, '011' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb02"" a - WHERE (a.""id"" = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb02""(""id"", ""name"") VALUES(1, '011')", sql); Assert.Equal(0, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb02 { id = 2, name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb02""(""id"", ""name"") SELECT 2, '02' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb02"" a - WHERE (a.""id"" = 2) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb02""(""id"", ""name"") VALUES(2, '02')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb02 { id = 1, name = "01" }, new tbioudb02 { id = 2, name = "02" }, new tbioudb02 { id = 3, name = "03" }, new tbioudb02 { id = 4, name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb02""(""id"", ""name"") SELECT 1, '01' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb02"" a - WHERE (a.""id"" = 1) - limit 0,1) -UNION ALL - SELECT 2, '02' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb02"" a - WHERE (a.""id"" = 2) - limit 0,1) -UNION ALL - SELECT 3, '03' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb02"" a - WHERE (a.""id"" = 3) - limit 0,1) -UNION ALL - SELECT 4, '04' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb02"" a - WHERE (a.""id"" = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb02""(""id"", ""name"") VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')", sql); Assert.Equal(2, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb02 { id = 1, name = "001" }, new tbioudb02 { id = 2, name = "002" }, new tbioudb02 { id = 3, name = "003" }, new tbioudb02 { id = 4, name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb02""(""id"", ""name"") SELECT 1, '001' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb02"" a - WHERE (a.""id"" = 1) - limit 0,1) -UNION ALL - SELECT 2, '002' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb02"" a - WHERE (a.""id"" = 2) - limit 0,1) -UNION ALL - SELECT 3, '003' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb02"" a - WHERE (a.""id"" = 3) - limit 0,1) -UNION ALL - SELECT 4, '004' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb02"" a - WHERE (a.""id"" = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb02""(""id"", ""name"") VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')", sql); Assert.Equal(0, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList(); Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count()); @@ -109,83 +53,27 @@ UNION ALL fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb022""(""id"", ""name"") SELECT 1, '01' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb022""(""id"", ""name"") VALUES(1, '01')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb022""(""id"", ""name"") SELECT 1, '011' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb022""(""id"", ""name"") VALUES(1, '011')", sql); Assert.Equal(0, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb022 { id = 2, name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb022""(""id"", ""name"") SELECT 2, '02' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 2) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb022""(""id"", ""name"") VALUES(2, '02')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "01" }, new tbioudb022 { id = 2, name = "02" }, new tbioudb022 { id = 3, name = "03" }, new tbioudb022 { id = 4, name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb022""(""id"", ""name"") SELECT 1, '01' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 1) - limit 0,1) -UNION ALL - SELECT 2, '02' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 2) - limit 0,1) -UNION ALL - SELECT 3, '03' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 3) - limit 0,1) -UNION ALL - SELECT 4, '04' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb022""(""id"", ""name"") VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')", sql); Assert.Equal(2, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "001" }, new tbioudb022 { id = 2, name = "002" }, new tbioudb022 { id = 3, name = "003" }, new tbioudb022 { id = 4, name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb022""(""id"", ""name"") SELECT 1, '001' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 1) - limit 0,1) -UNION ALL - SELECT 2, '002' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 2) - limit 0,1) -UNION ALL - SELECT 3, '003' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 3) - limit 0,1) -UNION ALL - SELECT 4, '004' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb022""(""id"", ""name"") VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')", sql); Assert.Equal(0, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList(); Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count()); @@ -219,29 +107,7 @@ UNION ALL //--no primary and yes iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "100001" }, new tbioudb022 { name = "00001" }, new tbioudb022 { id = 2, name = "100002" }, new tbioudb022 { name = "00002" }, new tbioudb022 { id = 3, name = "100003" }, new tbioudb022 { name = "00003" }, new tbioudb022 { id = 4, name = "100004" }, new tbioudb022 { name = "00004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb022""(""id"", ""name"") SELECT 1, '100001' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 1) - limit 0,1) -UNION ALL - SELECT 2, '100002' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 2) - limit 0,1) -UNION ALL - SELECT 3, '100003' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 3) - limit 0,1) -UNION ALL - SELECT 4, '100004' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 4) - limit 0,1) + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb022""(""id"", ""name"") VALUES(1, '100001'), (2, '100002'), (3, '100003'), (4, '100004') ; @@ -263,83 +129,27 @@ INSERT INTO ""tbioudb022""(""name"") VALUES('00001'), ('00002'), ('00003'), ('00 fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb03""(""id1"", ""id2"", ""name"") SELECT 1, '01', '01' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb03"" a - WHERE (a.""id1"" = 1 AND a.""id2"" = '01') - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '01')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb03""(""id1"", ""id2"", ""name"") SELECT 1, '01', '011' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb03"" a - WHERE (a.""id1"" = 1 AND a.""id2"" = '01') - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '011')", sql); Assert.Equal(0, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 2, id2 = "02", name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb03""(""id1"", ""id2"", ""name"") SELECT 2, '02', '02' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb03"" a - WHERE (a.""id1"" = 2 AND a.""id2"" = '02') - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb03""(""id1"", ""id2"", ""name"") VALUES(2, '02', '02')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb03 { id1 = 1, id2 = "01", name = "01" }, new tbioudb03 { id1 = 2, id2 = "02", name = "02" }, new tbioudb03 { id1 = 3, id2 = "03", name = "03" }, new tbioudb03 { id1 = 4, id2 = "04", name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb03""(""id1"", ""id2"", ""name"") SELECT 1, '01', '01' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb03"" a - WHERE (a.""id1"" = 1 AND a.""id2"" = '01') - limit 0,1) -UNION ALL - SELECT 2, '02', '02' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb03"" a - WHERE (a.""id1"" = 2 AND a.""id2"" = '02') - limit 0,1) -UNION ALL - SELECT 3, '03', '03' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb03"" a - WHERE (a.""id1"" = 3 AND a.""id2"" = '03') - limit 0,1) -UNION ALL - SELECT 4, '04', '04' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb03"" a - WHERE (a.""id1"" = 4 AND a.""id2"" = '04') - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '01'), (2, '02', '02'), (3, '03', '03'), (4, '04', '04')", sql); Assert.Equal(2, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb03 { id1 = 1, id2 = "01", name = "001" }, new tbioudb03 { id1 = 2, id2 = "02", name = "002" }, new tbioudb03 { id1 = 3, id2 = "03", name = "003" }, new tbioudb03 { id1 = 4, id2 = "04", name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb03""(""id1"", ""id2"", ""name"") SELECT 1, '01', '001' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb03"" a - WHERE (a.""id1"" = 1 AND a.""id2"" = '01') - limit 0,1) -UNION ALL - SELECT 2, '02', '002' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb03"" a - WHERE (a.""id1"" = 2 AND a.""id2"" = '02') - limit 0,1) -UNION ALL - SELECT 3, '03', '003' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb03"" a - WHERE (a.""id1"" = 3 AND a.""id2"" = '03') - limit 0,1) -UNION ALL - SELECT 4, '04', '004' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb03"" a - WHERE (a.""id1"" = 4 AND a.""id2"" = '04') - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '001'), (2, '02', '002'), (3, '03', '003'), (4, '04', '004')", sql); Assert.Equal(0, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => a.id1 == 1 && a.id2 == "01" || a.id1 == 2 && a.id2 == "02" || a.id1 == 3 && a.id2 == "03" || a.id1 == 4 && a.id2 == "04").ToList(); Assert.Equal(4, lst.Where(a => a.name == "0" + a.id1).Count()); @@ -359,83 +169,27 @@ UNION ALL fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb04""(""id"", ""name"", ""version"", ""CreateTime"") SELECT 1, '01', 0, datetime(current_timestamp,'localtime') - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb04"" a - WHERE (a.""id"" = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(1, '01', 0, datetime(current_timestamp,'localtime'))", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb04""(""id"", ""name"", ""version"", ""CreateTime"") SELECT 1, '011', 0, datetime(current_timestamp,'localtime') - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb04"" a - WHERE (a.""id"" = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(1, '011', 0, datetime(current_timestamp,'localtime'))", sql); Assert.Equal(0, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb04 { id = 2, name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb04""(""id"", ""name"", ""version"", ""CreateTime"") SELECT 2, '02', 0, datetime(current_timestamp,'localtime') - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb04"" a - WHERE (a.""id"" = 2) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(2, '02', 0, datetime(current_timestamp,'localtime'))", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb04 { id = 1, name = "01" }, new tbioudb04 { id = 2, name = "02" }, new tbioudb04 { id = 3, name = "03" }, new tbioudb04 { id = 4, name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb04""(""id"", ""name"", ""version"", ""CreateTime"") SELECT 1, '01', 0, datetime(current_timestamp,'localtime') - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb04"" a - WHERE (a.""id"" = 1) - limit 0,1) -UNION ALL - SELECT 2, '02', 0, datetime(current_timestamp,'localtime') - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb04"" a - WHERE (a.""id"" = 2) - limit 0,1) -UNION ALL - SELECT 3, '03', 0, datetime(current_timestamp,'localtime') - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb04"" a - WHERE (a.""id"" = 3) - limit 0,1) -UNION ALL - SELECT 4, '04', 0, datetime(current_timestamp,'localtime') - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb04"" a - WHERE (a.""id"" = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(1, '01', 0, datetime(current_timestamp,'localtime')), (2, '02', 0, datetime(current_timestamp,'localtime')), (3, '03', 0, datetime(current_timestamp,'localtime')), (4, '04', 0, datetime(current_timestamp,'localtime'))", sql); Assert.Equal(2, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb04 { id = 1, name = "001" }, new tbioudb04 { id = 2, name = "002" }, new tbioudb04 { id = 3, name = "003" }, new tbioudb04 { id = 4, name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb04""(""id"", ""name"", ""version"", ""CreateTime"") SELECT 1, '001', 0, datetime(current_timestamp,'localtime') - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb04"" a - WHERE (a.""id"" = 1) - limit 0,1) -UNION ALL - SELECT 2, '002', 0, datetime(current_timestamp,'localtime') - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb04"" a - WHERE (a.""id"" = 2) - limit 0,1) -UNION ALL - SELECT 3, '003', 0, datetime(current_timestamp,'localtime') - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb04"" a - WHERE (a.""id"" = 3) - limit 0,1) -UNION ALL - SELECT 4, '004', 0, datetime(current_timestamp,'localtime') - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb04"" a - WHERE (a.""id"" = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(1, '001', 0, datetime(current_timestamp,'localtime')), (2, '002', 0, datetime(current_timestamp,'localtime')), (3, '003', 0, datetime(current_timestamp,'localtime')), (4, '004', 0, datetime(current_timestamp,'localtime'))", sql); Assert.Equal(0, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList(); Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count()); diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Sqlite.Data/Sqlite/Curd/SqliteInsertOrUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Sqlite.Data/Sqlite/Curd/SqliteInsertOrUpdateTest.cs index d0e650ad..200aee51 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Sqlite.Data/Sqlite/Curd/SqliteInsertOrUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Sqlite.Data/Sqlite/Curd/SqliteInsertOrUpdateTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; using System.Linq; @@ -16,27 +16,27 @@ namespace FreeSql.Tests.Sqlite fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().SetSource(new tbiou01 { id = 1 }); var sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou01""(""id"") VALUES(1)", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou01""(""id"") VALUES(1)", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new tbiou01 { id = 1 }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou01""(""id"") VALUES(1)", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou01""(""id"") VALUES(1)", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new tbiou01 { id = 2 }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou01""(""id"") VALUES(2)", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou01""(""id"") VALUES(2)", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou01 { id = 1 }, new tbiou01 { id = 2 }, new tbiou01 { id = 3 }, new tbiou01 { id = 4 } }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou01""(""id"") VALUES(1), (2), (3), (4)", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou01""(""id"") VALUES(1), (2), (3), (4)", sql); Assert.Equal(4, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou01 { id = 1 }, new tbiou01 { id = 2 }, new tbiou01 { id = 3 }, new tbiou01 { id = 4 } }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou01""(""id"") VALUES(1), (2), (3), (4)", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou01""(""id"") VALUES(1), (2), (3), (4)", sql); Assert.Equal(4, iou.ExecuteAffrows()); } class tbiou01 @@ -50,27 +50,27 @@ namespace FreeSql.Tests.Sqlite fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().SetSource(new tbiou02 { id = 1, name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou02""(""id"", ""name"") VALUES(1, '01')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou02""(""id"", ""name"") VALUES(1, '01')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new tbiou02 { id = 1, name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou02""(""id"", ""name"") VALUES(1, '011')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou02""(""id"", ""name"") VALUES(1, '011')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new tbiou02 { id = 2, name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou02""(""id"", ""name"") VALUES(2, '02')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou02""(""id"", ""name"") VALUES(2, '02')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou02 { id = 1, name = "01" }, new tbiou02 { id = 2, name = "02" }, new tbiou02 { id = 3, name = "03" }, new tbiou02 { id = 4, name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou02""(""id"", ""name"") VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou02""(""id"", ""name"") VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')", sql); Assert.Equal(4, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou02 { id = 1, name = "001" }, new tbiou02 { id = 2, name = "002" }, new tbiou02 { id = 3, name = "003" }, new tbiou02 { id = 4, name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou02""(""id"", ""name"") VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou02""(""id"", ""name"") VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')", sql); Assert.Equal(4, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList(); Assert.Equal(4, lst.Where(a => a.name == "00" + a.id).Count()); @@ -87,27 +87,27 @@ namespace FreeSql.Tests.Sqlite fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().SetSource(new tbiou022 { id = 1, name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(1, '01')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(1, '01')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new tbiou022 { id = 1, name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(1, '011')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(1, '011')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new tbiou022 { id = 2, name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(2, '02')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(2, '02')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou022 { id = 1, name = "01" }, new tbiou022 { id = 2, name = "02" }, new tbiou022 { id = 3, name = "03" }, new tbiou022 { id = 4, name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')", sql); Assert.Equal(4, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou022 { id = 1, name = "001" }, new tbiou022 { id = 2, name = "002" }, new tbiou022 { id = 3, name = "003" }, new tbiou022 { id = 4, name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')", sql); Assert.Equal(4, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList(); Assert.Equal(4, lst.Where(a => a.name == "00" + a.id).Count()); @@ -141,7 +141,7 @@ namespace FreeSql.Tests.Sqlite //--no primary and yes iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou022 { id = 1, name = "100001" }, new tbiou022 { name = "00001" }, new tbiou022 { id = 2, name = "100002" }, new tbiou022 { name = "00002" }, new tbiou022 { id = 3, name = "100003" }, new tbiou022 { name = "00003" }, new tbiou022 { id = 4, name = "100004" }, new tbiou022 { name = "00004" } }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(1, '100001'), (2, '100002'), (3, '100003'), (4, '100004') + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(1, '100001'), (2, '100002'), (3, '100003'), (4, '100004') ; @@ -163,27 +163,27 @@ INSERT INTO ""tbiou022""(""name"") VALUES('00001'), ('00002'), ('00003'), ('0000 fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().SetSource(new tbiou03 { id1 = 1, id2 = "01", name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '01')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '01')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new tbiou03 { id1 = 1, id2 = "01", name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '011')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '011')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new tbiou03 { id1 = 2, id2 = "02", name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou03""(""id1"", ""id2"", ""name"") VALUES(2, '02', '02')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou03""(""id1"", ""id2"", ""name"") VALUES(2, '02', '02')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou03 { id1 = 1, id2 = "01", name = "01" }, new tbiou03 { id1 = 2, id2 = "02", name = "02" }, new tbiou03 { id1 = 3, id2 = "03", name = "03" }, new tbiou03 { id1 = 4, id2 = "04", name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '01'), (2, '02', '02'), (3, '03', '03'), (4, '04', '04')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '01'), (2, '02', '02'), (3, '03', '03'), (4, '04', '04')", sql); Assert.Equal(4, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou03 { id1 = 1, id2 = "01", name = "001" }, new tbiou03 { id1 = 2, id2 = "02", name = "002" }, new tbiou03 { id1 = 3, id2 = "03", name = "003" }, new tbiou03 { id1 = 4, id2 = "04", name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '001'), (2, '02', '002'), (3, '03', '003'), (4, '04', '004')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '001'), (2, '02', '002'), (3, '03', '003'), (4, '04', '004')", sql); Assert.Equal(4, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => a.id1 == 1 && a.id2 == "01" || a.id1 == 2 && a.id2 == "02" || a.id1 == 3 && a.id2 == "03" || a.id1 == 4 && a.id2 == "04").ToList(); Assert.Equal(4, lst.Where(a => a.name == "00" + a.id1).Count()); @@ -203,27 +203,27 @@ INSERT INTO ""tbiou022""(""name"") VALUES('00001'), ('00002'), ('00003'), ('0000 fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().SetSource(new tbiou04 { id = 1, name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(1, '01', 0, datetime(current_timestamp,'localtime'))", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(1, '01', 0, datetime(current_timestamp,'localtime'))", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new tbiou04 { id = 1, name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(1, '011', 0, datetime(current_timestamp,'localtime'))", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(1, '011', 0, datetime(current_timestamp,'localtime'))", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new tbiou04 { id = 2, name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(2, '02', 0, datetime(current_timestamp,'localtime'))", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(2, '02', 0, datetime(current_timestamp,'localtime'))", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou04 { id = 1, name = "01" }, new tbiou04 { id = 2, name = "02" }, new tbiou04 { id = 3, name = "03" }, new tbiou04 { id = 4, name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(1, '01', 0, datetime(current_timestamp,'localtime')), (2, '02', 0, datetime(current_timestamp,'localtime')), (3, '03', 0, datetime(current_timestamp,'localtime')), (4, '04', 0, datetime(current_timestamp,'localtime'))", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(1, '01', 0, datetime(current_timestamp,'localtime')), (2, '02', 0, datetime(current_timestamp,'localtime')), (3, '03', 0, datetime(current_timestamp,'localtime')), (4, '04', 0, datetime(current_timestamp,'localtime'))", sql); Assert.Equal(4, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou04 { id = 1, name = "001" }, new tbiou04 { id = 2, name = "002" }, new tbiou04 { id = 3, name = "003" }, new tbiou04 { id = 4, name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(1, '001', 0, datetime(current_timestamp,'localtime')), (2, '002', 0, datetime(current_timestamp,'localtime')), (3, '003', 0, datetime(current_timestamp,'localtime')), (4, '004', 0, datetime(current_timestamp,'localtime'))", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(1, '001', 0, datetime(current_timestamp,'localtime')), (2, '002', 0, datetime(current_timestamp,'localtime')), (3, '003', 0, datetime(current_timestamp,'localtime')), (4, '004', 0, datetime(current_timestamp,'localtime'))", sql); Assert.Equal(4, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList(); Assert.Equal(4, lst.Where(a => a.name == "00" + a.id).Count()); diff --git a/FreeSql.Tests/FreeSql.Tests/Issues/663.cs b/FreeSql.Tests/FreeSql.Tests/Issues/663.cs index 4e4bfe41..e21d9962 100644 --- a/FreeSql.Tests/FreeSql.Tests/Issues/663.cs +++ b/FreeSql.Tests/FreeSql.Tests/Issues/663.cs @@ -28,11 +28,7 @@ namespace FreeSql.Tests.Issues .SetSource(new[] { new Song_Tag { SongId = 1, TagId = 1 } }) .IfExistsDoNothing() .ToSql(); - Assert.Equal(@"INSERT INTO `Song_Tag663`(`SongId`, `TagId`) SELECT 1, 1 - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `Song_Tag663` a - WHERE (a.`SongId` = 1 AND a.`TagId` = 1) - limit 0,1)", rst); + Assert.Equal(@"INSERT IGNORE INTO `Song_Tag663`(`SongId`, `TagId`) VALUES(1, 1)", rst); } [Table(Name = "Song663")] diff --git a/FreeSql.Tests/FreeSql.Tests/Issues/804.cs b/FreeSql.Tests/FreeSql.Tests/Issues/804.cs index cf387d81..4735abb7 100644 --- a/FreeSql.Tests/FreeSql.Tests/Issues/804.cs +++ b/FreeSql.Tests/FreeSql.Tests/Issues/804.cs @@ -111,7 +111,7 @@ WHERE (strftime('%Y',a."CreateTime") = 2021) Assert.Single(dmonth1); Assert.Single(d1); Assert.Single(d1); - Assert.Single(d5); + //Assert.Single(d5); } } } diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlInsertOrUpdateIfExistsDoNothingTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlInsertOrUpdateIfExistsDoNothingTest.cs index 6b6a02d1..e8485174 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlInsertOrUpdateIfExistsDoNothingTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlInsertOrUpdateIfExistsDoNothingTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; using System.Linq; @@ -17,83 +17,27 @@ namespace FreeSql.Tests.MySql fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb02`(`id`, `name`) SELECT 1, '01' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb02`(`id`, `name`) VALUES(1, '01')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb02`(`id`, `name`) SELECT 1, '011' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb02`(`id`, `name`) VALUES(1, '011')", sql); Assert.Equal(0, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb02 { id = 2, name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb02`(`id`, `name`) SELECT 2, '02' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 2) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb02`(`id`, `name`) VALUES(2, '02')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb02 { id = 1, name = "01" }, new tbioudb02 { id = 2, name = "02" }, new tbioudb02 { id = 3, name = "03" }, new tbioudb02 { id = 4, name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb02`(`id`, `name`) SELECT 1, '01' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '02' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '03' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '04' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb02`(`id`, `name`) VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')", sql); Assert.Equal(2, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb02 { id = 1, name = "001" }, new tbioudb02 { id = 2, name = "002" }, new tbioudb02 { id = 3, name = "003" }, new tbioudb02 { id = 4, name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb02`(`id`, `name`) SELECT 1, '001' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '002' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '003' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '004' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb02` a - WHERE (a.`id` = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb02`(`id`, `name`) VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')", sql); Assert.Equal(0, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList(); Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count()); @@ -109,83 +53,27 @@ UNION ALL fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 1, '01' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb022`(`id`, `name`) VALUES(1, '01')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 1, '011' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb022`(`id`, `name`) VALUES(1, '011')", sql); Assert.Equal(0, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb022 { id = 2, name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 2, '02' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 2) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb022`(`id`, `name`) VALUES(2, '02')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "01" }, new tbioudb022 { id = 2, name = "02" }, new tbioudb022 { id = 3, name = "03" }, new tbioudb022 { id = 4, name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 1, '01' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '02' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '03' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '04' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb022`(`id`, `name`) VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')", sql); Assert.Equal(2, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "001" }, new tbioudb022 { id = 2, name = "002" }, new tbioudb022 { id = 3, name = "003" }, new tbioudb022 { id = 4, name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 1, '001' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '002' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '003' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '004' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb022`(`id`, `name`) VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')", sql); Assert.Equal(0, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList(); Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count()); @@ -219,29 +107,7 @@ UNION ALL //--no primary and yes iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "100001" }, new tbioudb022 { name = "00001" }, new tbioudb022 { id = 2, name = "100002" }, new tbioudb022 { name = "00002" }, new tbioudb022 { id = 3, name = "100003" }, new tbioudb022 { name = "00003" }, new tbioudb022 { id = 4, name = "100004" }, new tbioudb022 { name = "00004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb022`(`id`, `name`) SELECT 1, '100001' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '100002' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '100003' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '100004' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb022` a - WHERE (a.`id` = 4) - limit 0,1) + Assert.Equal(@"INSERT IGNORE INTO `tbioudb022`(`id`, `name`) VALUES(1, '100001'), (2, '100002'), (3, '100003'), (4, '100004') ; @@ -263,83 +129,27 @@ INSERT INTO `tbioudb022`(`name`) VALUES('00001'), ('00002'), ('00003'), ('00004' fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb03`(`id1`, `id2`, `name`) SELECT 1, '01', '01' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 1 AND a.`id2` = '01') - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb03`(`id1`, `id2`, `name`) VALUES(1, '01', '01')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb03`(`id1`, `id2`, `name`) SELECT 1, '01', '011' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 1 AND a.`id2` = '01') - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb03`(`id1`, `id2`, `name`) VALUES(1, '01', '011')", sql); Assert.Equal(0, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 2, id2 = "02", name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb03`(`id1`, `id2`, `name`) SELECT 2, '02', '02' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 2 AND a.`id2` = '02') - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb03`(`id1`, `id2`, `name`) VALUES(2, '02', '02')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb03 { id1 = 1, id2 = "01", name = "01" }, new tbioudb03 { id1 = 2, id2 = "02", name = "02" }, new tbioudb03 { id1 = 3, id2 = "03", name = "03" }, new tbioudb03 { id1 = 4, id2 = "04", name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb03`(`id1`, `id2`, `name`) SELECT 1, '01', '01' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 1 AND a.`id2` = '01') - limit 0,1) -UNION ALL - SELECT 2, '02', '02' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 2 AND a.`id2` = '02') - limit 0,1) -UNION ALL - SELECT 3, '03', '03' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 3 AND a.`id2` = '03') - limit 0,1) -UNION ALL - SELECT 4, '04', '04' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 4 AND a.`id2` = '04') - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb03`(`id1`, `id2`, `name`) VALUES(1, '01', '01'), (2, '02', '02'), (3, '03', '03'), (4, '04', '04')", sql); Assert.Equal(2, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb03 { id1 = 1, id2 = "01", name = "001" }, new tbioudb03 { id1 = 2, id2 = "02", name = "002" }, new tbioudb03 { id1 = 3, id2 = "03", name = "003" }, new tbioudb03 { id1 = 4, id2 = "04", name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb03`(`id1`, `id2`, `name`) SELECT 1, '01', '001' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 1 AND a.`id2` = '01') - limit 0,1) -UNION ALL - SELECT 2, '02', '002' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 2 AND a.`id2` = '02') - limit 0,1) -UNION ALL - SELECT 3, '03', '003' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 3 AND a.`id2` = '03') - limit 0,1) -UNION ALL - SELECT 4, '04', '004' - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb03` a - WHERE (a.`id1` = 4 AND a.`id2` = '04') - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb03`(`id1`, `id2`, `name`) VALUES(1, '01', '001'), (2, '02', '002'), (3, '03', '003'), (4, '04', '004')", sql); Assert.Equal(0, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => a.id1 == 1 && a.id2 == "01" || a.id1 == 2 && a.id2 == "02" || a.id1 == 3 && a.id2 == "03" || a.id1 == 4 && a.id2 == "04").ToList(); Assert.Equal(4, lst.Where(a => a.name == "0" + a.id1).Count()); @@ -359,83 +169,27 @@ UNION ALL fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) SELECT 1, '01', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) VALUES(1, '01', 0, now(3))", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) SELECT 1, '011', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) VALUES(1, '011', 0, now(3))", sql); Assert.Equal(0, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb04 { id = 2, name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) SELECT 2, '02', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 2) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) VALUES(2, '02', 0, now(3))", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb04 { id = 1, name = "01" }, new tbioudb04 { id = 2, name = "02" }, new tbioudb04 { id = 3, name = "03" }, new tbioudb04 { id = 4, name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) SELECT 1, '01', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '02', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '03', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '04', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) VALUES(1, '01', 0, now(3)), (2, '02', 0, now(3)), (3, '03', 0, now(3)), (4, '04', 0, now(3))", sql); Assert.Equal(2, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb04 { id = 1, name = "001" }, new tbioudb04 { id = 2, name = "002" }, new tbioudb04 { id = 3, name = "003" }, new tbioudb04 { id = 4, name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) SELECT 1, '001', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 1) - limit 0,1) -UNION ALL - SELECT 2, '002', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 2) - limit 0,1) -UNION ALL - SELECT 3, '003', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 3) - limit 0,1) -UNION ALL - SELECT 4, '004', 0, now(3) - FROM dual WHERE NOT EXISTS(SELECT 1 - FROM `tbioudb04` a - WHERE (a.`id` = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT IGNORE INTO `tbioudb04`(`id`, `name`, `version`, `CreateTime`) VALUES(1, '001', 0, now(3)), (2, '002', 0, now(3)), (3, '003', 0, now(3)), (4, '004', 0, now(3))", sql); Assert.Equal(0, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList(); Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count()); diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteInsertOrUpdateIfExistsDoNothingTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteInsertOrUpdateIfExistsDoNothingTest.cs index 46e0685d..1879055a 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteInsertOrUpdateIfExistsDoNothingTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteInsertOrUpdateIfExistsDoNothingTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; using System.Linq; @@ -17,83 +17,27 @@ namespace FreeSql.Tests.Sqlite fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb02""(""id"", ""name"") SELECT 1, '01' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb02"" a - WHERE (a.""id"" = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb02""(""id"", ""name"") VALUES(1, '01')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb02""(""id"", ""name"") SELECT 1, '011' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb02"" a - WHERE (a.""id"" = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb02""(""id"", ""name"") VALUES(1, '011')", sql); Assert.Equal(0, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb02 { id = 2, name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb02""(""id"", ""name"") SELECT 2, '02' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb02"" a - WHERE (a.""id"" = 2) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb02""(""id"", ""name"") VALUES(2, '02')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb02 { id = 1, name = "01" }, new tbioudb02 { id = 2, name = "02" }, new tbioudb02 { id = 3, name = "03" }, new tbioudb02 { id = 4, name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb02""(""id"", ""name"") SELECT 1, '01' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb02"" a - WHERE (a.""id"" = 1) - limit 0,1) -UNION ALL - SELECT 2, '02' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb02"" a - WHERE (a.""id"" = 2) - limit 0,1) -UNION ALL - SELECT 3, '03' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb02"" a - WHERE (a.""id"" = 3) - limit 0,1) -UNION ALL - SELECT 4, '04' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb02"" a - WHERE (a.""id"" = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb02""(""id"", ""name"") VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')", sql); Assert.Equal(2, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb02 { id = 1, name = "001" }, new tbioudb02 { id = 2, name = "002" }, new tbioudb02 { id = 3, name = "003" }, new tbioudb02 { id = 4, name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb02""(""id"", ""name"") SELECT 1, '001' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb02"" a - WHERE (a.""id"" = 1) - limit 0,1) -UNION ALL - SELECT 2, '002' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb02"" a - WHERE (a.""id"" = 2) - limit 0,1) -UNION ALL - SELECT 3, '003' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb02"" a - WHERE (a.""id"" = 3) - limit 0,1) -UNION ALL - SELECT 4, '004' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb02"" a - WHERE (a.""id"" = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb02""(""id"", ""name"") VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')", sql); Assert.Equal(0, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList(); Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count()); @@ -109,83 +53,27 @@ UNION ALL fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb022""(""id"", ""name"") SELECT 1, '01' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb022""(""id"", ""name"") VALUES(1, '01')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb022""(""id"", ""name"") SELECT 1, '011' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb022""(""id"", ""name"") VALUES(1, '011')", sql); Assert.Equal(0, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb022 { id = 2, name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb022""(""id"", ""name"") SELECT 2, '02' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 2) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb022""(""id"", ""name"") VALUES(2, '02')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "01" }, new tbioudb022 { id = 2, name = "02" }, new tbioudb022 { id = 3, name = "03" }, new tbioudb022 { id = 4, name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb022""(""id"", ""name"") SELECT 1, '01' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 1) - limit 0,1) -UNION ALL - SELECT 2, '02' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 2) - limit 0,1) -UNION ALL - SELECT 3, '03' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 3) - limit 0,1) -UNION ALL - SELECT 4, '04' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb022""(""id"", ""name"") VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')", sql); Assert.Equal(2, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "001" }, new tbioudb022 { id = 2, name = "002" }, new tbioudb022 { id = 3, name = "003" }, new tbioudb022 { id = 4, name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb022""(""id"", ""name"") SELECT 1, '001' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 1) - limit 0,1) -UNION ALL - SELECT 2, '002' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 2) - limit 0,1) -UNION ALL - SELECT 3, '003' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 3) - limit 0,1) -UNION ALL - SELECT 4, '004' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb022""(""id"", ""name"") VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')", sql); Assert.Equal(0, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList(); Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count()); @@ -219,29 +107,7 @@ UNION ALL //--no primary and yes iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "100001" }, new tbioudb022 { name = "00001" }, new tbioudb022 { id = 2, name = "100002" }, new tbioudb022 { name = "00002" }, new tbioudb022 { id = 3, name = "100003" }, new tbioudb022 { name = "00003" }, new tbioudb022 { id = 4, name = "100004" }, new tbioudb022 { name = "00004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb022""(""id"", ""name"") SELECT 1, '100001' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 1) - limit 0,1) -UNION ALL - SELECT 2, '100002' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 2) - limit 0,1) -UNION ALL - SELECT 3, '100003' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 3) - limit 0,1) -UNION ALL - SELECT 4, '100004' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb022"" a - WHERE (a.""id"" = 4) - limit 0,1) + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb022""(""id"", ""name"") VALUES(1, '100001'), (2, '100002'), (3, '100003'), (4, '100004') ; @@ -263,83 +129,27 @@ INSERT INTO ""tbioudb022""(""name"") VALUES('00001'), ('00002'), ('00003'), ('00 fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb03""(""id1"", ""id2"", ""name"") SELECT 1, '01', '01' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb03"" a - WHERE (a.""id1"" = 1 AND a.""id2"" = '01') - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '01')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb03""(""id1"", ""id2"", ""name"") SELECT 1, '01', '011' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb03"" a - WHERE (a.""id1"" = 1 AND a.""id2"" = '01') - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '011')", sql); Assert.Equal(0, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 2, id2 = "02", name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb03""(""id1"", ""id2"", ""name"") SELECT 2, '02', '02' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb03"" a - WHERE (a.""id1"" = 2 AND a.""id2"" = '02') - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb03""(""id1"", ""id2"", ""name"") VALUES(2, '02', '02')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb03 { id1 = 1, id2 = "01", name = "01" }, new tbioudb03 { id1 = 2, id2 = "02", name = "02" }, new tbioudb03 { id1 = 3, id2 = "03", name = "03" }, new tbioudb03 { id1 = 4, id2 = "04", name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb03""(""id1"", ""id2"", ""name"") SELECT 1, '01', '01' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb03"" a - WHERE (a.""id1"" = 1 AND a.""id2"" = '01') - limit 0,1) -UNION ALL - SELECT 2, '02', '02' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb03"" a - WHERE (a.""id1"" = 2 AND a.""id2"" = '02') - limit 0,1) -UNION ALL - SELECT 3, '03', '03' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb03"" a - WHERE (a.""id1"" = 3 AND a.""id2"" = '03') - limit 0,1) -UNION ALL - SELECT 4, '04', '04' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb03"" a - WHERE (a.""id1"" = 4 AND a.""id2"" = '04') - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '01'), (2, '02', '02'), (3, '03', '03'), (4, '04', '04')", sql); Assert.Equal(2, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb03 { id1 = 1, id2 = "01", name = "001" }, new tbioudb03 { id1 = 2, id2 = "02", name = "002" }, new tbioudb03 { id1 = 3, id2 = "03", name = "003" }, new tbioudb03 { id1 = 4, id2 = "04", name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb03""(""id1"", ""id2"", ""name"") SELECT 1, '01', '001' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb03"" a - WHERE (a.""id1"" = 1 AND a.""id2"" = '01') - limit 0,1) -UNION ALL - SELECT 2, '02', '002' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb03"" a - WHERE (a.""id1"" = 2 AND a.""id2"" = '02') - limit 0,1) -UNION ALL - SELECT 3, '03', '003' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb03"" a - WHERE (a.""id1"" = 3 AND a.""id2"" = '03') - limit 0,1) -UNION ALL - SELECT 4, '04', '004' - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb03"" a - WHERE (a.""id1"" = 4 AND a.""id2"" = '04') - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '001'), (2, '02', '002'), (3, '03', '003'), (4, '04', '004')", sql); Assert.Equal(0, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => a.id1 == 1 && a.id2 == "01" || a.id1 == 2 && a.id2 == "02" || a.id1 == 3 && a.id2 == "03" || a.id1 == 4 && a.id2 == "04").ToList(); Assert.Equal(4, lst.Where(a => a.name == "0" + a.id1).Count()); @@ -359,83 +169,27 @@ UNION ALL fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb04""(""id"", ""name"", ""version"", ""CreateTime"") SELECT 1, '01', 0, datetime(current_timestamp,'localtime') - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb04"" a - WHERE (a.""id"" = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(1, '01', 0, datetime(current_timestamp,'localtime'))", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb04""(""id"", ""name"", ""version"", ""CreateTime"") SELECT 1, '011', 0, datetime(current_timestamp,'localtime') - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb04"" a - WHERE (a.""id"" = 1) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(1, '011', 0, datetime(current_timestamp,'localtime'))", sql); Assert.Equal(0, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb04 { id = 2, name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb04""(""id"", ""name"", ""version"", ""CreateTime"") SELECT 2, '02', 0, datetime(current_timestamp,'localtime') - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb04"" a - WHERE (a.""id"" = 2) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(2, '02', 0, datetime(current_timestamp,'localtime'))", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb04 { id = 1, name = "01" }, new tbioudb04 { id = 2, name = "02" }, new tbioudb04 { id = 3, name = "03" }, new tbioudb04 { id = 4, name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb04""(""id"", ""name"", ""version"", ""CreateTime"") SELECT 1, '01', 0, datetime(current_timestamp,'localtime') - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb04"" a - WHERE (a.""id"" = 1) - limit 0,1) -UNION ALL - SELECT 2, '02', 0, datetime(current_timestamp,'localtime') - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb04"" a - WHERE (a.""id"" = 2) - limit 0,1) -UNION ALL - SELECT 3, '03', 0, datetime(current_timestamp,'localtime') - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb04"" a - WHERE (a.""id"" = 3) - limit 0,1) -UNION ALL - SELECT 4, '04', 0, datetime(current_timestamp,'localtime') - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb04"" a - WHERE (a.""id"" = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(1, '01', 0, datetime(current_timestamp,'localtime')), (2, '02', 0, datetime(current_timestamp,'localtime')), (3, '03', 0, datetime(current_timestamp,'localtime')), (4, '04', 0, datetime(current_timestamp,'localtime'))", sql); Assert.Equal(2, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb04 { id = 1, name = "001" }, new tbioudb04 { id = 2, name = "002" }, new tbioudb04 { id = 3, name = "003" }, new tbioudb04 { id = 4, name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"INSERT INTO ""tbioudb04""(""id"", ""name"", ""version"", ""CreateTime"") SELECT 1, '001', 0, datetime(current_timestamp,'localtime') - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb04"" a - WHERE (a.""id"" = 1) - limit 0,1) -UNION ALL - SELECT 2, '002', 0, datetime(current_timestamp,'localtime') - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb04"" a - WHERE (a.""id"" = 2) - limit 0,1) -UNION ALL - SELECT 3, '003', 0, datetime(current_timestamp,'localtime') - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb04"" a - WHERE (a.""id"" = 3) - limit 0,1) -UNION ALL - SELECT 4, '004', 0, datetime(current_timestamp,'localtime') - WHERE NOT EXISTS(SELECT 1 - FROM ""tbioudb04"" a - WHERE (a.""id"" = 4) - limit 0,1)", sql); + Assert.Equal(@"INSERT OR IGNORE INTO ""tbioudb04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(1, '001', 0, datetime(current_timestamp,'localtime')), (2, '002', 0, datetime(current_timestamp,'localtime')), (3, '003', 0, datetime(current_timestamp,'localtime')), (4, '004', 0, datetime(current_timestamp,'localtime'))", sql); Assert.Equal(0, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList(); Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count()); diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteInsertOrUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteInsertOrUpdateTest.cs index d0e650ad..200aee51 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteInsertOrUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteInsertOrUpdateTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; using System.Linq; @@ -16,27 +16,27 @@ namespace FreeSql.Tests.Sqlite fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().SetSource(new tbiou01 { id = 1 }); var sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou01""(""id"") VALUES(1)", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou01""(""id"") VALUES(1)", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new tbiou01 { id = 1 }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou01""(""id"") VALUES(1)", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou01""(""id"") VALUES(1)", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new tbiou01 { id = 2 }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou01""(""id"") VALUES(2)", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou01""(""id"") VALUES(2)", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou01 { id = 1 }, new tbiou01 { id = 2 }, new tbiou01 { id = 3 }, new tbiou01 { id = 4 } }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou01""(""id"") VALUES(1), (2), (3), (4)", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou01""(""id"") VALUES(1), (2), (3), (4)", sql); Assert.Equal(4, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou01 { id = 1 }, new tbiou01 { id = 2 }, new tbiou01 { id = 3 }, new tbiou01 { id = 4 } }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou01""(""id"") VALUES(1), (2), (3), (4)", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou01""(""id"") VALUES(1), (2), (3), (4)", sql); Assert.Equal(4, iou.ExecuteAffrows()); } class tbiou01 @@ -50,27 +50,27 @@ namespace FreeSql.Tests.Sqlite fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().SetSource(new tbiou02 { id = 1, name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou02""(""id"", ""name"") VALUES(1, '01')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou02""(""id"", ""name"") VALUES(1, '01')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new tbiou02 { id = 1, name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou02""(""id"", ""name"") VALUES(1, '011')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou02""(""id"", ""name"") VALUES(1, '011')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new tbiou02 { id = 2, name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou02""(""id"", ""name"") VALUES(2, '02')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou02""(""id"", ""name"") VALUES(2, '02')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou02 { id = 1, name = "01" }, new tbiou02 { id = 2, name = "02" }, new tbiou02 { id = 3, name = "03" }, new tbiou02 { id = 4, name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou02""(""id"", ""name"") VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou02""(""id"", ""name"") VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')", sql); Assert.Equal(4, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou02 { id = 1, name = "001" }, new tbiou02 { id = 2, name = "002" }, new tbiou02 { id = 3, name = "003" }, new tbiou02 { id = 4, name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou02""(""id"", ""name"") VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou02""(""id"", ""name"") VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')", sql); Assert.Equal(4, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList(); Assert.Equal(4, lst.Where(a => a.name == "00" + a.id).Count()); @@ -87,27 +87,27 @@ namespace FreeSql.Tests.Sqlite fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().SetSource(new tbiou022 { id = 1, name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(1, '01')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(1, '01')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new tbiou022 { id = 1, name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(1, '011')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(1, '011')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new tbiou022 { id = 2, name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(2, '02')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(2, '02')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou022 { id = 1, name = "01" }, new tbiou022 { id = 2, name = "02" }, new tbiou022 { id = 3, name = "03" }, new tbiou022 { id = 4, name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')", sql); Assert.Equal(4, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou022 { id = 1, name = "001" }, new tbiou022 { id = 2, name = "002" }, new tbiou022 { id = 3, name = "003" }, new tbiou022 { id = 4, name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')", sql); Assert.Equal(4, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList(); Assert.Equal(4, lst.Where(a => a.name == "00" + a.id).Count()); @@ -141,7 +141,7 @@ namespace FreeSql.Tests.Sqlite //--no primary and yes iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou022 { id = 1, name = "100001" }, new tbiou022 { name = "00001" }, new tbiou022 { id = 2, name = "100002" }, new tbiou022 { name = "00002" }, new tbiou022 { id = 3, name = "100003" }, new tbiou022 { name = "00003" }, new tbiou022 { id = 4, name = "100004" }, new tbiou022 { name = "00004" } }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(1, '100001'), (2, '100002'), (3, '100003'), (4, '100004') + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(1, '100001'), (2, '100002'), (3, '100003'), (4, '100004') ; @@ -163,27 +163,27 @@ INSERT INTO ""tbiou022""(""name"") VALUES('00001'), ('00002'), ('00003'), ('0000 fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().SetSource(new tbiou03 { id1 = 1, id2 = "01", name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '01')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '01')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new tbiou03 { id1 = 1, id2 = "01", name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '011')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '011')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new tbiou03 { id1 = 2, id2 = "02", name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou03""(""id1"", ""id2"", ""name"") VALUES(2, '02', '02')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou03""(""id1"", ""id2"", ""name"") VALUES(2, '02', '02')", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou03 { id1 = 1, id2 = "01", name = "01" }, new tbiou03 { id1 = 2, id2 = "02", name = "02" }, new tbiou03 { id1 = 3, id2 = "03", name = "03" }, new tbiou03 { id1 = 4, id2 = "04", name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '01'), (2, '02', '02'), (3, '03', '03'), (4, '04', '04')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '01'), (2, '02', '02'), (3, '03', '03'), (4, '04', '04')", sql); Assert.Equal(4, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou03 { id1 = 1, id2 = "01", name = "001" }, new tbiou03 { id1 = 2, id2 = "02", name = "002" }, new tbiou03 { id1 = 3, id2 = "03", name = "003" }, new tbiou03 { id1 = 4, id2 = "04", name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '001'), (2, '02', '002'), (3, '03', '003'), (4, '04', '004')", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou03""(""id1"", ""id2"", ""name"") VALUES(1, '01', '001'), (2, '02', '002'), (3, '03', '003'), (4, '04', '004')", sql); Assert.Equal(4, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => a.id1 == 1 && a.id2 == "01" || a.id1 == 2 && a.id2 == "02" || a.id1 == 3 && a.id2 == "03" || a.id1 == 4 && a.id2 == "04").ToList(); Assert.Equal(4, lst.Where(a => a.name == "00" + a.id1).Count()); @@ -203,27 +203,27 @@ INSERT INTO ""tbiou022""(""name"") VALUES('00001'), ('00002'), ('00003'), ('0000 fsql.Delete().Where("1=1").ExecuteAffrows(); var iou = fsql.InsertOrUpdate().SetSource(new tbiou04 { id = 1, name = "01" }); var sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(1, '01', 0, datetime(current_timestamp,'localtime'))", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(1, '01', 0, datetime(current_timestamp,'localtime'))", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new tbiou04 { id = 1, name = "011" }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(1, '011', 0, datetime(current_timestamp,'localtime'))", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(1, '011', 0, datetime(current_timestamp,'localtime'))", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new tbiou04 { id = 2, name = "02" }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(2, '02', 0, datetime(current_timestamp,'localtime'))", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(2, '02', 0, datetime(current_timestamp,'localtime'))", sql); Assert.Equal(1, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou04 { id = 1, name = "01" }, new tbiou04 { id = 2, name = "02" }, new tbiou04 { id = 3, name = "03" }, new tbiou04 { id = 4, name = "04" } }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(1, '01', 0, datetime(current_timestamp,'localtime')), (2, '02', 0, datetime(current_timestamp,'localtime')), (3, '03', 0, datetime(current_timestamp,'localtime')), (4, '04', 0, datetime(current_timestamp,'localtime'))", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(1, '01', 0, datetime(current_timestamp,'localtime')), (2, '02', 0, datetime(current_timestamp,'localtime')), (3, '03', 0, datetime(current_timestamp,'localtime')), (4, '04', 0, datetime(current_timestamp,'localtime'))", sql); Assert.Equal(4, iou.ExecuteAffrows()); iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou04 { id = 1, name = "001" }, new tbiou04 { id = 2, name = "002" }, new tbiou04 { id = 3, name = "003" }, new tbiou04 { id = 4, name = "004" } }); sql = iou.ToSql(); - Assert.Equal(@"REPLACE INTO ""tbiou04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(1, '001', 0, datetime(current_timestamp,'localtime')), (2, '002', 0, datetime(current_timestamp,'localtime')), (3, '003', 0, datetime(current_timestamp,'localtime')), (4, '004', 0, datetime(current_timestamp,'localtime'))", sql); + Assert.Equal(@"INSERT OR REPLACE INTO ""tbiou04""(""id"", ""name"", ""version"", ""CreateTime"") VALUES(1, '001', 0, datetime(current_timestamp,'localtime')), (2, '002', 0, datetime(current_timestamp,'localtime')), (3, '003', 0, datetime(current_timestamp,'localtime')), (4, '004', 0, datetime(current_timestamp,'localtime'))", sql); Assert.Equal(4, iou.ExecuteAffrows()); var lst = fsql.Select().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList(); Assert.Equal(4, lst.Where(a => a.name == "00" + a.id).Count()); diff --git a/FreeSql/Extensions/AdoNetExtensions.cs b/FreeSql/Extensions/AdoNetExtensions.cs index ed46fd09..d38f3522 100644 --- a/FreeSql/Extensions/AdoNetExtensions.cs +++ b/FreeSql/Extensions/AdoNetExtensions.cs @@ -29,7 +29,8 @@ namespace FreeSql break; case "SqlConnection": providerType = Type.GetType("FreeSql.SqlServer.SqlServerProvider`1,FreeSql.Provider.SqlServer")?.MakeGenericType(connType); - if (providerType == null) throw new Exception(CoreStrings.Missing_FreeSqlProvider_Package("SqlServer")); + if (providerType == null) providerType = Type.GetType("FreeSql.SqlServer.SqlServerProvider`1,FreeSql.Provider.SqlServerForSystem")?.MakeGenericType(connType); + if (providerType == null) throw new Exception(CoreStrings.Missing_FreeSqlProvider_Package("SqlServer/SqlServerForSystem")); break; case "NpgsqlConnection": providerType = Type.GetType("FreeSql.PostgreSQL.PostgreSQLProvider`1,FreeSql.Provider.PostgreSQL")?.MakeGenericType(connType); @@ -42,6 +43,7 @@ namespace FreeSql case "SQLiteConnection": case "SqliteConnection": providerType = Type.GetType("FreeSql.Sqlite.SqliteProvider`1,FreeSql.Provider.Sqlite")?.MakeGenericType(connType); + if (providerType == null) providerType = Type.GetType("FreeSql.Sqlite.SqliteProvider`1,FreeSql.Provider.SqliteCore")?.MakeGenericType(connType); //Microsoft.Data.Sqlite.Core.dll if (providerType == null) throw new Exception(CoreStrings.Missing_FreeSqlProvider_Package("Sqlite/SqliteCore")); break; case "DmConnection": diff --git a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs index 339470e7..1890dccc 100644 --- a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs +++ b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs @@ -733,6 +733,7 @@ JOIN {select._commonUtils.QuoteSqlName(tbDbName)} a ON cte_tbc.cte_id = a.{selec } var sql1ctePath = ""; + string wct2ctePath = null; if (pathSelector != null) { select._tables[0].Parameter = pathSelector?.Parameters[0]; @@ -751,6 +752,13 @@ JOIN {select._commonUtils.QuoteSqlName(tbDbName)} a ON cte_tbc.cte_id = a.{selec case DataType.ClickHouse: sql1ctePath = select._commonExpression.ExpressionWhereLambda(select._tables, select._tableRule, Expression.Call(typeof(Convert).GetMethod("ToString", new Type[] { typeof(string) }), pathSelector?.Body), select._diymemexpWithTempQuery, null, null); break; + case DataType.MySql: + case DataType.OdbcMySql: + case DataType.CustomMySql: + sql1ctePath = select._commonExpression.ExpressionWhereLambda(select._tables, select._tableRule, pathSelector?.Body, select._diymemexpWithTempQuery, null, null); + sql1ctePath = $"CAST({sql1ctePath} as char(2000))"; + wct2ctePath = sql1ctePath; + break; default: sql1ctePath = select._commonExpression.ExpressionWhereLambda(select._tables, select._tableRule, pathSelector?.Body, select._diymemexpWithTempQuery, null, null); break; @@ -770,7 +778,8 @@ JOIN {select._commonUtils.QuoteSqlName(tbDbName)} a ON cte_tbc.cte_id = a.{selec if (pathSelector != null) { select._tables[0].Parameter = pathSelector?.Parameters[0]; - var wct2ctePath = select._commonExpression.ExpressionWhereLambda(select._tables, select._tableRule, pathSelector?.Body, select._diymemexpWithTempQuery, null, null); + if (wct2ctePath == null) + wct2ctePath = select._commonExpression.ExpressionWhereLambda(select._tables, select._tableRule, pathSelector?.Body, select._diymemexpWithTempQuery, null, null); sql2ctePath = select._commonUtils.StringConcat( new string[] { up == false ? "wct1.cte_path" : wct2ctePath, diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index 137392e3..9cdf6492 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -1,4 +1,4 @@ - + netstandard2.1;netstandard2.0;net451;net45;net40 @@ -17,7 +17,7 @@ true key.snk false - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 368317df..9843c757 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1445,6 +1445,14 @@ 提供者的类型,一般不需要指定,如果一直提示“缺少 FreeSql 数据库实现包:FreeSql.Provider.MySql.dll,可前往 nuget 下载”的错误,说明反射获取不到类型,此时该参数可排上用场例如:typeof(FreeSql.SqlServer.SqlServerProvider<>) + + + 用于指定自定义实现TableEntiy 的缓存集合 + 解决多实例下相同类型映射到不同表的问题 + + + + 使用原始连接池(ado.net、odbc、oledb) @@ -1543,7 +1551,7 @@ - 指定映射优先级 + 指定映射优先级(从小到大) 例如表名:实体类名 < Aop < FluentApi < Attribute < AsTable 事件 Aop -------> fsql.Aop.ConfigEntity/fsql.Aop.ConfigEntityProperty 方法 FluentApi -> fsql.CodeFirst.ConfigEntity/fsql.CodeFirst.Entity @@ -3404,11 +3412,12 @@ 零个或多个过滤器名字 - + 设置表名 + @@ -4060,6 +4069,11 @@ DataReader 对应的 Index 位置 + + + DataReader 对应的 PropertyInfo + + 获取 Index 对应的值,也可以设置拦截的新值 @@ -5002,6 +5016,11 @@ + + + 用于解决多实例情况下的静态集合缓存问题 + + diff --git a/FreeSql/FreeSqlBuilder.cs b/FreeSql/FreeSqlBuilder.cs index 8b0854a9..6508933f 100644 --- a/FreeSql/FreeSqlBuilder.cs +++ b/FreeSql/FreeSqlBuilder.cs @@ -11,6 +11,7 @@ using System.Linq.Expressions; using System.Runtime; using FreeSql.Internal.Model.Interface; using System.Threading; +using FreeSql.Internal.Model; namespace FreeSql { @@ -50,6 +51,18 @@ namespace FreeSql _providerType = providerType; return this; } + + /// + /// 用于指定自定义实现TableEntiy 的缓存集合 + /// 解决多实例下相同类型映射到不同表的问题 + /// + /// + /// + public FreeSqlBuilder UseCustomTableEntityCacheFactory(Func>> factory) + { + Utils.ChacheTableEntityFactory = factory; + return this; + } /// /// 使用原始连接池(ado.net、odbc、oledb) /// 默认:false @@ -63,7 +76,7 @@ namespace FreeSql /// public FreeSqlBuilder UseAdoConnectionPool(bool value) { - _isAdoConnectionPool = value ; + _isAdoConnectionPool = value; return this; } /// @@ -194,7 +207,7 @@ namespace FreeSql } /// - /// 指定映射优先级 + /// 指定映射优先级(从小到大) /// 例如表名:实体类名 < Aop < FluentApi < Attribute < AsTable /// 事件 Aop -------> fsql.Aop.ConfigEntity/fsql.Aop.ConfigEntityProperty /// 方法 FluentApi -> fsql.CodeFirst.ConfigEntity/fsql.CodeFirst.Entity @@ -577,7 +590,8 @@ namespace FreeSql { FreeSql.Internal.Utils.GetDataReaderValueBlockExpressionSwitchTypeFullName.Add((LabelTarget returnTarget, Expression valueExp, Type type2) => { - if (FreeSql.Internal.Utils.TypeHandlers.TryGetValue(type2, out var typeHandler)) { + if (FreeSql.Internal.Utils.TypeHandlers.TryGetValue(type2, out var typeHandler)) + { var valueExpRet = Expression.Call( Expression.Constant(typeHandler, typeof(ITypeHandler)), typeof(ITypeHandler).GetMethod(nameof(typeHandler.Deserialize)), @@ -598,9 +612,10 @@ namespace FreeSql { if (e.Property.PropertyType == typeHandler.Type) { - if (_dicTypeHandlerTypes.ContainsKey(e.Property.PropertyType) == false && + if (_dicTypeHandlerTypes.ContainsKey(e.Property.PropertyType)) return; + if (e.Property.PropertyType.NullableTypeOrThis() != typeof(DateTime) && FreeSql.Internal.Utils.dicExecuteArrayRowReadClassOrTuple.ContainsKey(e.Property.PropertyType)) - return; //基础类型无效 + return; //基础类型无效,DateTime 除外 if (_dicTypeHandlerTypes.TryAdd(e.Property.PropertyType, true)) { diff --git a/FreeSql/Interface/Curd/IUpdateJoin.cs b/FreeSql/Interface/Curd/IUpdateJoin.cs index 1ebecf36..fef72130 100644 --- a/FreeSql/Interface/Curd/IUpdateJoin.cs +++ b/FreeSql/Interface/Curd/IUpdateJoin.cs @@ -106,8 +106,9 @@ namespace FreeSql /// 设置表名 /// /// + /// /// - IUpdateJoin AsTable(string tableName); + IUpdateJoin AsTable(string tableName, string joinTableName); /// /// 返回即将执行的SQL语句 /// diff --git a/FreeSql/Interface/IAop.cs b/FreeSql/Interface/IAop.cs index e4c66df7..6efba9ff 100644 --- a/FreeSql/Interface/IAop.cs +++ b/FreeSql/Interface/IAop.cs @@ -360,10 +360,11 @@ namespace FreeSql.Aop #region AuditDataReader public class AuditDataReaderEventArgs : EventArgs { - public AuditDataReaderEventArgs(DbDataReader dataReader, int index) + public AuditDataReaderEventArgs(DbDataReader dataReader, int index, PropertyInfo property) { this.DataReader = dataReader; this.Index = index; + this.Property = property; } /// @@ -375,6 +376,10 @@ namespace FreeSql.Aop /// public int Index { get; } /// + /// DataReader 对应的 PropertyInfo + /// + public PropertyInfo Property { get; } + /// /// 获取 Index 对应的值,也可以设置拦截的新值 /// public object Value diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 7be3a010..16b5dacc 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -570,7 +570,7 @@ namespace FreeSql.Internal return Utils.GetDataReaderValue(parent.Property.PropertyType, null); return Utils.GetDataReaderValue(parent.CsType, null); } - object objval = Utils.InternalDataReaderGetValue(_common, dr, ++index); // dr.GetValue(++index); + object objval = Utils.InternalDataReaderGetValue(_common, dr, ++index, parent.Property); // dr.GetValue(++index); if (dbValue != null) dbValue.DbValue = objval == DBNull.Value ? null : objval; if (parent.CsType != parent.MapType) objval = Utils.GetDataReaderValue(parent.MapType, objval); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 30826ac7..bd6e2e13 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -40,7 +40,7 @@ namespace FreeSql.Internal.CommonProvider #else public List> _includeToListAsync = new List>(); #endif - public Dictionary _includeInfo = new Dictionary(); + public Dictionary> _includeInfo = new Dictionary>(); public bool _distinct; public Expression _selectExpression; public List _whereGlobalFilter; @@ -672,9 +672,12 @@ namespace FreeSql.Internal.CommonProvider _join.Append(" \r\n").Append(sql); //fsql.Select().RawJoin("FULL JOIN UserGroup b ON b.id = a.GroupId").ToSql((a, b) => new { user = a, group = b }); - foreach (var tb in _tables) + for (var a = 1; a < _tables.Count; a++) + { + var tb = _tables[a]; if (sql.Contains($" {tb.Table.DbName} ") || sql.Contains($" {_commonUtils.QuoteSqlName(tb.Table.DbName)} ")) tb.Type = SelectTableInfoType.RawJoin; + } return this as TSelect; } diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0ProviderReader.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0ProviderReader.cs index 3908e4c0..be40ee34 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0ProviderReader.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0ProviderReader.cs @@ -600,7 +600,7 @@ namespace FreeSql.Internal.CommonProvider var name = dr.GetName(a); //expando[name] = row2.GetValue(a); if (expandodic.ContainsKey(name)) continue; - expandodic.Add(name, Utils.InternalDataReaderGetValue(_commonUtils, dr, a)); + expandodic.Add(name, Utils.InternalDataReaderGetValue(_commonUtils, dr, a, null)); } //expando = expandodic; return (T1)((object)expandodic); @@ -682,8 +682,7 @@ namespace FreeSql.Internal.CommonProvider var propGetSetMethod = prop.GetSetMethod(true); Expression readExpAssign = null; //加速缓存 if (prop.PropertyType.IsArray) readExpAssign = Expression.New(Utils.RowInfo.Constructor, - Utils.GetDataReaderValueBlockExpression(prop.PropertyType, Expression.Call(Utils.MethodDataReaderGetValue, new Expression[] { Expression.Constant(_commonUtils), rowExp, dataIndexExp })), - //Expression.Call(Utils.MethodGetDataReaderValue, new Expression[] { Expression.Constant(prop.PropertyType), Expression.Call(rowExp, Utils.MethodDataReaderGetValue, dataIndexExp) }), + Utils.GetDataReaderValueBlockExpression(prop.PropertyType, Expression.Call(Utils.MethodDataReaderGetValue, new Expression[] { Expression.Constant(_commonUtils), rowExp, dataIndexExp, Expression.Constant(prop) })), Expression.Add(dataIndexExp, Expression.Constant(1)) ); else @@ -692,8 +691,7 @@ namespace FreeSql.Internal.CommonProvider if (proptypeGeneric.IsNullableType()) proptypeGeneric = proptypeGeneric.GetGenericArguments().First(); if (proptypeGeneric.IsEnum || Utils.dicExecuteArrayRowReadClassOrTuple.ContainsKey(proptypeGeneric)) readExpAssign = Expression.New(Utils.RowInfo.Constructor, - Utils.GetDataReaderValueBlockExpression(prop.PropertyType, Expression.Call(Utils.MethodDataReaderGetValue, new Expression[] { Expression.Constant(_commonUtils), rowExp, dataIndexExp })), - //Expression.Call(Utils.MethodGetDataReaderValue, new Expression[] { Expression.Constant(prop.PropertyType), Expression.Call(rowExp, Utils.MethodDataReaderGetValue, dataIndexExp) }), + Utils.GetDataReaderValueBlockExpression(prop.PropertyType, Expression.Call(Utils.MethodDataReaderGetValue, new Expression[] { Expression.Constant(_commonUtils), rowExp, dataIndexExp, Expression.Constant(prop) })), Expression.Add(dataIndexExp, Expression.Constant(1)) ); else @@ -739,7 +737,8 @@ namespace FreeSql.Internal.CommonProvider foreach (var col in tb.Table.Columns.Values) { var drvalType = col.Attribute.MapType.NullableTypeOrThis(); - var propGetSetMethod = tb.Table.Properties[col.CsName].GetSetMethod(true); + var colprop = tb.Table.Properties[col.CsName]; + var propGetSetMethod = colprop.GetSetMethod(true); if (col.CsType == col.Attribute.MapType && _orm.Aop.AuditDataReaderHandler == null && _dicMethodDataReaderGetValue.TryGetValue(col.Attribute.MapType.NullableTypeOrThis(), out var drGetValueMethod)) @@ -755,7 +754,7 @@ namespace FreeSql.Internal.CommonProvider { var drvalExpCatch = Utils.GetDataReaderValueBlockExpression( col.CsType, - Expression.Call(Utils.MethodDataReaderGetValue, new Expression[] { Expression.Constant(_commonUtils), rowExp, Expression.Constant(colidx) }) + Expression.Call(Utils.MethodDataReaderGetValue, new Expression[] { Expression.Constant(_commonUtils), rowExp, Expression.Constant(colidx), Expression.Constant(colprop) }) ); blockExp.Add(Expression.TryCatch( Expression.Call(retExp, propGetSetMethod, drvalExp), @@ -780,7 +779,7 @@ namespace FreeSql.Internal.CommonProvider { var drvalExp = Utils.GetDataReaderValueBlockExpression( col.CsType, - Expression.Call(Utils.MethodDataReaderGetValue, new Expression[] { Expression.Constant(_commonUtils), rowExp, Expression.Constant(colidx) }) + Expression.Call(Utils.MethodDataReaderGetValue, new Expression[] { Expression.Constant(_commonUtils), rowExp, Expression.Constant(colidx), Expression.Constant(colprop) }) ); blockExp.Add(Expression.Call(retExp, propGetSetMethod, Expression.Convert(drvalExp, col.CsType))); } diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs index d33d7c1c..3a513597 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs @@ -287,6 +287,7 @@ namespace FreeSql.Internal.CommonProvider public Dictionary Childs { get; } = new Dictionary(); public Expression CurrentExpression { get; } public bool IsOutputPrimary { get; set; } + public List OutputColumns { get; } = new List(); public IncludeManyNewInit(TableInfo table, Expression currentExpression) { this.Table = table; @@ -313,20 +314,26 @@ namespace FreeSql.Internal.CommonProvider { var curIncNewInit = incNewInit; Expression curParmExp = parmExp; - for (var a = 0; a < inc.Value.Length - 1; a++) + for (var a = 0; a < inc.Value.Item1.Length - 1; a++) { - curParmExp = Expression.MakeMemberAccess(parmExp, inc.Value[a].Member); - if (curIncNewInit.Childs.ContainsKey(inc.Value[a].Member.Name) == false) - curIncNewInit.Childs.Add(inc.Value[a].Member.Name, curIncNewInit = new IncludeManyNewInit(_orm.CodeFirst.GetTableByEntity(inc.Value[a].Type), curParmExp)); + curParmExp = Expression.MakeMemberAccess(parmExp, inc.Value.Item1[a].Member); + if (curIncNewInit.Childs.ContainsKey(inc.Value.Item1[a].Member.Name) == false) + curIncNewInit.Childs.Add(inc.Value.Item1[a].Member.Name, curIncNewInit = new IncludeManyNewInit(_orm.CodeFirst.GetTableByEntity(inc.Value.Item1[a].Type), curParmExp)); else - curIncNewInit = curIncNewInit.Childs[inc.Value[a].Member.Name]; + curIncNewInit = curIncNewInit.Childs[inc.Value.Item1[a].Member.Name]; } curIncNewInit.IsOutputPrimary = true; + var outcols = inc.Value.Item2.Columns.Where(a => a.Attribute.IsPrimary == false).ToArray(); + if (outcols.Any()) curIncNewInit.OutputColumns.AddRange(outcols); } MemberInitExpression GetIncludeManyNewInitExpression(IncludeManyNewInit imni) { var bindings = new List(); - if (imni.IsOutputPrimary) bindings.AddRange(imni.Table.Primarys.Select(a => Expression.Bind(imni.Table.Properties[a.CsName], Expression.MakeMemberAccess(imni.CurrentExpression, imni.Table.Properties[a.CsName])))); + if (imni.IsOutputPrimary) + { + bindings.AddRange(imni.Table.Primarys.Select(a => Expression.Bind(imni.Table.Properties[a.CsName], Expression.MakeMemberAccess(imni.CurrentExpression, imni.Table.Properties[a.CsName])))); + if (imni.OutputColumns.Any()) bindings.AddRange(imni.OutputColumns.Select(a => Expression.Bind(imni.Table.Properties[a.CsName], Expression.MakeMemberAccess(imni.CurrentExpression, imni.Table.Properties[a.CsName])))); + } if (imni.Childs.Any()) bindings.AddRange(imni.Childs.Select(a => Expression.Bind(imni.Table.Properties[a.Key], GetIncludeManyNewInitExpression(a.Value)))); var pgarrayToManys = imni.Table.GetAllTableRef().Select(tr => { @@ -1514,7 +1521,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < members.Count; a++) includeValue[a] = members[a]; includeValue[includeValue.Length - 1] = expBody as MemberExpression; var includeKey = $"{string.Join(".", includeValue.Select(a => a.Member.Name))}"; - if (_includeInfo.ContainsKey(includeKey) == false) _includeInfo.Add(includeKey, includeValue); + if (_includeInfo.ContainsKey(includeKey) == false) _includeInfo.Add(includeKey, NativeTuple.Create(includeValue, tbref)); return this; } @@ -1577,20 +1584,26 @@ namespace FreeSql.Internal.CommonProvider { var curIncNewInit = incNewInit; Expression curParmExp = parmExp; - for (var a = 0; a < inc.Value.Length - 1; a++) + for (var a = 0; a < inc.Value.Item1.Length - 1; a++) { - curParmExp = Expression.MakeMemberAccess(parmExp, inc.Value[a].Member); - if (curIncNewInit.Childs.ContainsKey(inc.Value[a].Member.Name) == false) - curIncNewInit.Childs.Add(inc.Value[a].Member.Name, curIncNewInit = new IncludeManyNewInit(_orm.CodeFirst.GetTableByEntity(inc.Value[a].Type), curParmExp)); + curParmExp = Expression.MakeMemberAccess(parmExp, inc.Value.Item1[a].Member); + if (curIncNewInit.Childs.ContainsKey(inc.Value.Item1[a].Member.Name) == false) + curIncNewInit.Childs.Add(inc.Value.Item1[a].Member.Name, curIncNewInit = new IncludeManyNewInit(_orm.CodeFirst.GetTableByEntity(inc.Value.Item1[a].Type), curParmExp)); else - curIncNewInit = curIncNewInit.Childs[inc.Value[a].Member.Name]; + curIncNewInit = curIncNewInit.Childs[inc.Value.Item1[a].Member.Name]; } curIncNewInit.IsOutputPrimary = true; + var outcols = inc.Value.Item2.Columns.Where(a => a.Attribute.IsPrimary == false).ToArray(); + if (outcols.Any()) curIncNewInit.OutputColumns.AddRange(outcols); } MemberInitExpression GetIncludeManyNewInitExpression(IncludeManyNewInit imni) { var bindings = new List(); - if (imni.IsOutputPrimary) bindings.AddRange(imni.Table.Primarys.Select(a => Expression.Bind(imni.Table.Properties[a.CsName], Expression.MakeMemberAccess(imni.CurrentExpression, imni.Table.Properties[a.CsName])))); + if (imni.IsOutputPrimary) + { + bindings.AddRange(imni.Table.Primarys.Select(a => Expression.Bind(imni.Table.Properties[a.CsName], Expression.MakeMemberAccess(imni.CurrentExpression, imni.Table.Properties[a.CsName])))); + if (imni.OutputColumns.Any()) bindings.AddRange(imni.OutputColumns.Select(a => Expression.Bind(imni.Table.Properties[a.CsName], Expression.MakeMemberAccess(imni.CurrentExpression, imni.Table.Properties[a.CsName])))); + } if (imni.Childs.Any()) bindings.AddRange(imni.Childs.Select(a => Expression.Bind(imni.Table.Properties[a.Key], GetIncludeManyNewInitExpression(a.Value)))); var pgarrayToManys = imni.Table.GetAllTableRef().Select(tr => { diff --git a/FreeSql/Internal/CommonProvider/UpdateJoinProvider.cs b/FreeSql/Internal/CommonProvider/UpdateJoinProvider.cs index ce7e9241..c4d51f3a 100644 --- a/FreeSql/Internal/CommonProvider/UpdateJoinProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateJoinProvider.cs @@ -98,9 +98,19 @@ namespace FreeSql.Internal.CommonProvider } #region proxy IUpdate - public IUpdateJoin AsTable(string tableName) + public IUpdateJoin AsTable(string tableName, string joinTableName) { - _update.AsTable(tableName); + if (string.IsNullOrWhiteSpace(tableName) == false) + _update.AsTable(tableName); + if (string.IsNullOrWhiteSpace(joinTableName) == false) + { + _query2Provider._tableRules.Clear(); + _query2Provider._tableRules.Add((t, old) => + { + if (t == typeof(T2)) return joinTableName; + return old; + }); + } return this; } public IUpdateJoin WithConnection(DbConnection connection) diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 27059ad1..50388446 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -1216,6 +1216,24 @@ namespace FreeSql.Internal.CommonProvider if (_versionColumn != null && _versionColumn.Attribute.CanUpdate) { var vcname = _commonUtils.QuoteSqlName(_versionColumn.Attribute.Name); + var vcvalue = vcname; + if (string.IsNullOrWhiteSpace(_tableAlias) == false) + { + switch (_orm.Ado.DataType) + { + case DataType.PostgreSQL: + case DataType.OdbcPostgreSQL: + case DataType.CustomPostgreSQL: + case DataType.KingbaseES: + case DataType.OdbcKingbaseES: + case DataType.ShenTong: + vcvalue = $"{_tableAlias}.{vcname}"; //set name = b.name + break; + default: + vcname = vcvalue = $"{_tableAlias}.{vcname}"; //set a.name = b.name + break; + } + } if (_versionColumn.Attribute.MapType == typeof(byte[])) { _updateVersionValue = Utils.GuidToBytes(Guid.NewGuid()); @@ -1227,7 +1245,7 @@ namespace FreeSql.Internal.CommonProvider sb.Append(", ").Append(vcname).Append(" = ").Append(_commonUtils.GetNoneParamaterSqlValue(_paramsSource, "uv", _versionColumn, _versionColumn.Attribute.MapType, _updateVersionValue)); } else - sb.Append(", ").Append(vcname).Append(" = ").Append(_commonUtils.IsNull(vcname, 0)).Append(" + 1"); + sb.Append(", ").Append(vcname).Append(" = ").Append(_commonUtils.IsNull(vcvalue, 0)).Append(" + 1"); } ToSqlWhere(sb); _interceptSql?.Invoke(sb); diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index 38513aab..95180312 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -19,8 +19,12 @@ namespace FreeSql.Internal { public class Utils { - - static ConcurrentDictionary> _cacheGetTableByEntity = new ConcurrentDictionary>(); + /// + /// 用于解决多实例情况下的静态集合缓存问题 + /// + public static Func>> ChacheTableEntityFactory = null; + private static ConcurrentDictionary> __cacheGetTableByEntity = new ConcurrentDictionary>(); + public static ConcurrentDictionary> _cacheGetTableByEntity => ChacheTableEntityFactory?.Invoke() ?? __cacheGetTableByEntity; internal static void RemoveTableByEntity(Type entity, CommonUtils common) { if (entity.IsAnonymousType() || @@ -258,9 +262,14 @@ namespace FreeSql.Internal commonNow = $"{commonNow.TrimEnd('(', ')')}({timeLength})"; commonNowUtc = $"{commonNowUtc.TrimEnd('(', ')')}({timeLength})"; } + //https://github.com/dotnetcore/FreeSql/issues/1604 mysql 不支持默认值 utc_timestamp DDL + if (colattr.ServerTime == DateTimeKind.Local) + col.DbDefaultValue = commonNow; + break; + default: + col.DbDefaultValue = colattr.ServerTime == DateTimeKind.Local ? commonNow : commonNowUtc; break; } - col.DbDefaultValue = colattr.ServerTime == DateTimeKind.Local ? commonNow : commonNowUtc; col.DbInsertValue = colattr.ServerTime == DateTimeKind.Local ? commonNow : commonNowUtc; col.DbUpdateValue = colattr.ServerTime == DateTimeKind.Local ? commonNow : commonNowUtc; } @@ -500,10 +509,6 @@ namespace FreeSql.Internal }); } trytb.Indexes = indexesDict.Values.ToArray(); - trytb.ColumnsByPosition = columnsList.Where(a => a.Attribute.Position > 0).OrderBy(a => a.Attribute.Position) - .Concat(columnsList.Where(a => a.Attribute.Position == 0)) - .Concat(columnsList.Where(a => a.Attribute.Position < 0).OrderBy(a => a.Attribute.Position)).ToArray(); - trytb.ColumnsByCanUpdateDbUpdateValue = columnsList.Where(a => a.Attribute.CanUpdate == true && string.IsNullOrEmpty(a.DbUpdateValue) == false).ToArray(); trytb.Primarys = trytb.Columns.Values.Where(a => a.Attribute.IsPrimary == true).ToArray(); if (trytb.Primarys.Any() == false) @@ -529,7 +534,7 @@ namespace FreeSql.Internal { col.Attribute.IsNullable = false; col.Attribute.DbType = col.Attribute.DbType.Replace("NOT NULL", "").Replace(" NULL", "").Trim(); - switch(common._orm.Ado.DataType) + switch (common._orm.Ado.DataType) { case DataType.Sqlite: col.Attribute.DbType += " NOT NULL"; //sqlite 主键也可以插入 null @@ -538,6 +543,7 @@ namespace FreeSql.Internal } foreach (var col in trytb.Columns.Values) { + if (col.Attribute.IsPrimary == false && col.Attribute.IsIdentity) col.Attribute.CanUpdate = false; var ltp = @"\(([^\)]+)\)"; col.DbTypeText = Regex.Replace(col.Attribute.DbType.Replace("NOT NULL", "").Replace(" NULL", "").Trim(), ltp, ""); var m = Regex.Match(col.Attribute.DbType, ltp); @@ -573,6 +579,10 @@ namespace FreeSql.Internal } } trytb.IsRereadSql = trytb.Columns.Where(a => string.IsNullOrWhiteSpace(a.Value.Attribute.RereadSql) == false).Any(); + trytb.ColumnsByPosition = columnsList.Where(a => a.Attribute.Position > 0).OrderBy(a => a.Attribute.Position) + .Concat(columnsList.Where(a => a.Attribute.Position == 0)) + .Concat(columnsList.Where(a => a.Attribute.Position < 0).OrderBy(a => a.Attribute.Position)).ToArray(); + trytb.ColumnsByCanUpdateDbUpdateValue = columnsList.Where(a => a.Attribute.CanUpdate == true && string.IsNullOrEmpty(a.DbUpdateValue) == false).ToArray(); tbc.AddOrUpdate(entity, trytb, (oldkey, oldval) => trytb); #region 查找导航属性的关系、virtual 属性延时加载,动态产生新的重写类 @@ -1673,12 +1683,12 @@ namespace FreeSql.Internal } internal static MethodInfo MethodDataReaderGetValue = typeof(Utils).GetMethod("InternalDataReaderGetValue", BindingFlags.Static | BindingFlags.NonPublic); internal static PropertyInfo PropertyDataReaderFieldCount = typeof(DbDataReader).GetProperty("FieldCount"); - internal static object InternalDataReaderGetValue(CommonUtils commonUtil, DbDataReader dr, int index) + internal static object InternalDataReaderGetValue(CommonUtils commonUtil, DbDataReader dr, int index, PropertyInfo property) { var orm = commonUtil._orm; if (orm.Aop.AuditDataReaderHandler != null) { - var args = new Aop.AuditDataReaderEventArgs(dr, index); + var args = new Aop.AuditDataReaderEventArgs(dr, index, property); orm.Aop.AuditDataReaderHandler(orm, args); return args.Value; } @@ -1715,8 +1725,7 @@ namespace FreeSql.Internal if (type.IsArray) return Expression.Lambda>( Expression.New(RowInfo.Constructor, - GetDataReaderValueBlockExpression(type, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp })), - //Expression.Call(MethodGetDataReaderValue, new Expression[] { typeExp, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp }) }), + GetDataReaderValueBlockExpression(type, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp, Expression.Default(typeof(PropertyInfo)) })), Expression.Add(dataIndexExp, Expression.Constant(1)) ), new[] { typeExp, indexesExp, rowExp, dataIndexExp, commonUtilExp }).Compile(); @@ -1726,8 +1735,7 @@ namespace FreeSql.Internal dicExecuteArrayRowReadClassOrTuple.ContainsKey(typeGeneric)) return Expression.Lambda>( Expression.New(RowInfo.Constructor, - GetDataReaderValueBlockExpression(type, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp })), - //Expression.Call(MethodGetDataReaderValue, new Expression[] { typeExp, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp }) }), + GetDataReaderValueBlockExpression(type, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp, Expression.Default(typeof(PropertyInfo)) })), Expression.Add(dataIndexExp, Expression.Constant(1)) ), new[] { typeExp, indexesExp, rowExp, dataIndexExp, commonUtilExp }).Compile(); @@ -1747,8 +1755,7 @@ namespace FreeSql.Internal { Expression read2ExpAssign = null; //加速缓存 if (field.FieldType.IsArray) read2ExpAssign = Expression.New(RowInfo.Constructor, - GetDataReaderValueBlockExpression(field.FieldType, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp })), - //Expression.Call(MethodGetDataReaderValue, new Expression[] { Expression.Constant(field.FieldType), Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp }) }), + GetDataReaderValueBlockExpression(field.FieldType, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp, Expression.Default(typeof(PropertyInfo)) })), Expression.Add(dataIndexExp, Expression.Constant(1)) ); else @@ -1757,8 +1764,7 @@ namespace FreeSql.Internal if (fieldtypeGeneric.IsNullableType()) fieldtypeGeneric = fieldtypeGeneric.GetGenericArguments().First(); if (fieldtypeGeneric.IsEnum || dicExecuteArrayRowReadClassOrTuple.ContainsKey(fieldtypeGeneric)) read2ExpAssign = Expression.New(RowInfo.Constructor, - GetDataReaderValueBlockExpression(field.FieldType, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp })), - //Expression.Call(MethodGetDataReaderValue, new Expression[] { Expression.Constant(field.FieldType), Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp }) }), + GetDataReaderValueBlockExpression(field.FieldType, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp, Expression.Default(typeof(PropertyInfo)) })), Expression.Add(dataIndexExp, Expression.Constant(1)) ); else @@ -1775,16 +1781,16 @@ namespace FreeSql.Internal Expression.IfThenElse(Expression.Equal(read2ExpValue, Expression.Constant(null)), Expression.Assign(Expression.MakeMemberAccess(ret2Exp, field), Expression.Default(field.FieldType)), Expression.Assign(Expression.MakeMemberAccess(ret2Exp, field), Expression.Convert(read2ExpValue, field.FieldType))) - //), - //Expression.Catch(typeof(Exception), Expression.Block( - // Expression.IfThen(Expression.Equal(read2ExpDataIndex, Expression.Constant(0)), Expression.Throw(Expression.Constant(new Exception(field.Name + "," + 0)))), - // Expression.IfThen(Expression.Equal(read2ExpDataIndex, Expression.Constant(1)), Expression.Throw(Expression.Constant(new Exception(field.Name + "," + 1)))), - // Expression.IfThen(Expression.Equal(read2ExpDataIndex, Expression.Constant(2)), Expression.Throw(Expression.Constant(new Exception(field.Name + "," + 2)))), - // Expression.IfThen(Expression.Equal(read2ExpDataIndex, Expression.Constant(3)), Expression.Throw(Expression.Constant(new Exception(field.Name + "," + 3)))), - // Expression.IfThen(Expression.Equal(read2ExpDataIndex, Expression.Constant(4)), Expression.Throw(Expression.Constant(new Exception(field.Name + "," + 4)))) - // ) - //)) - }); + //), + //Expression.Catch(typeof(Exception), Expression.Block( + // Expression.IfThen(Expression.Equal(read2ExpDataIndex, Expression.Constant(0)), Expression.Throw(Expression.Constant(new Exception(field.Name + "," + 0)))), + // Expression.IfThen(Expression.Equal(read2ExpDataIndex, Expression.Constant(1)), Expression.Throw(Expression.Constant(new Exception(field.Name + "," + 1)))), + // Expression.IfThen(Expression.Equal(read2ExpDataIndex, Expression.Constant(2)), Expression.Throw(Expression.Constant(new Exception(field.Name + "," + 2)))), + // Expression.IfThen(Expression.Equal(read2ExpDataIndex, Expression.Constant(3)), Expression.Throw(Expression.Constant(new Exception(field.Name + "," + 3)))), + // Expression.IfThen(Expression.Equal(read2ExpDataIndex, Expression.Constant(4)), Expression.Throw(Expression.Constant(new Exception(field.Name + "," + 4)))) + // ) + //)) + }); } block2Exp.AddRange(new Expression[] { Expression.Return(returnTarget, Expression.New(RowInfo.Constructor, Expression.Convert(ret2Exp, typeof(object)), dataIndexExp)), @@ -1799,8 +1805,7 @@ namespace FreeSql.Internal Expression.IfThen( Expression.LessThan(dataIndexExp, rowLenExp), Expression.Return(returnTarget, Expression.New(RowInfo.Constructor, - GetDataReaderValueBlockExpression(type, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp })), - //Expression.Call(MethodGetDataReaderValue, new Expression[] { typeExp, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp }) }), + GetDataReaderValueBlockExpression(type, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp, Expression.Default(typeof(PropertyInfo)) })), Expression.Add(dataIndexExp, Expression.Constant(1)))) ), Expression.Label(returnTarget, Expression.Default(typeof(RowInfo))) @@ -1819,7 +1824,7 @@ namespace FreeSql.Internal var name = row2.GetName(a); //expando[name] = row2.GetValue(a); if (expandodic.ContainsKey(name)) continue; - expandodic.Add(name, Utils.InternalDataReaderGetValue(commonUtils2, row2, a)); + expandodic.Add(name, Utils.InternalDataReaderGetValue(commonUtils2, row2, a, null)); } //expando = expandodic; return new RowInfo(expandodic, fc); @@ -1854,9 +1859,10 @@ namespace FreeSql.Internal { if (typetb.ColumnsByCsIgnore.ContainsKey(ctorParm.Name)) continue; var readType = typetb.ColumnsByCs.TryGetValue(ctorParm.Name, out var trycol) ? trycol.Attribute.MapType : ctorParm.ParameterType; + var colprop = trycol != null ? typetb.Table.Properties[trycol.CsName] : null; var ispkExp = new List(); - Expression readVal = Expression.Assign(readpkvalExp, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp })); + Expression readVal = Expression.Assign(readpkvalExp, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp, Expression.Constant(colprop) })); Expression readExpAssign = null; //加速缓存 if (readType.IsArray) readExpAssign = Expression.New(RowInfo.Constructor, GetDataReaderValueBlockExpression(readType, readpkvalExp), @@ -1872,7 +1878,7 @@ namespace FreeSql.Internal { //判断主键为空,则整个对象不读取 - //blockExp.Add(Expression.Assign(readpkvalExp, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp }))); + //blockExp.Add(Expression.Assign(readpkvalExp, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp, Expression.Constant(colprop) }))); if (trycol?.Attribute.IsPrimary == true) { ispkExp.Add( @@ -1975,7 +1981,7 @@ namespace FreeSql.Internal } var ispkExp = new List(); var propGetSetMethod = prop.GetSetMethod(true); - Expression readVal = Expression.Assign(readpkvalExp, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, tryidxExp })); + Expression readVal = Expression.Assign(readpkvalExp, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, tryidxExp, Expression.Constant(prop) })); Expression readExpAssign = null; //加速缓存 if (readType.IsArray) readExpAssign = Expression.New(RowInfo.Constructor, GetDataReaderValueBlockExpression(readType, readpkvalExp), @@ -1991,7 +1997,7 @@ namespace FreeSql.Internal { //判断主键为空,则整个对象不读取 - //blockExp.Add(Expression.Assign(readpkvalExp, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp }))); + //blockExp.Add(Expression.Assign(readpkvalExp, Expression.Call(MethodDataReaderGetValue, new Expression[] { commonUtilExp, rowExp, dataIndexExp, Expression.Constant(prop) }))); if (flagStr.StartsWith("adoQuery") == false && //Ado.Query 的时候不作此判断 trycol?.Attribute.IsPrimary == true) //若主键值为 null,则整行读取出来的对象为 null { @@ -2078,7 +2084,7 @@ namespace FreeSql.Internal indexes2 = ctor.GetParameters().Select(c => row2.GetOrdinal(c.Name)).ToArray(); for (var c = 0; c < ctorParms.Length; c++) - ctorParms[c] = Utils.InternalDataReaderGetValue(commonUtils2, row2, indexes2[c]); + ctorParms[c] = Utils.InternalDataReaderGetValue(commonUtils2, row2, indexes2[c], null); return new RowInfo(ctor.Invoke(ctorParms), ctorParms.Length); } @@ -2438,6 +2444,14 @@ namespace FreeSql.Internal ); break; case "System.DateTime": + if (TypeHandlers.ContainsKey(type)) + { + foreach (var switchFunc in GetDataReaderValueBlockExpressionSwitchTypeFullName) + { + var switchFuncRet = switchFunc(returnTarget, valueExp, type); + if (switchFuncRet != null) return switchFuncRet; + } + } tryparseExp = Expression.Block( new[] { tryparseVarExp = Expression.Variable(typeof(DateTime)) }, new Expression[] { diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseAdo.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseAdo.cs index 8018e31e..3ba93410 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseAdo.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseAdo.cs @@ -57,8 +57,18 @@ namespace FreeSql.ClickHouse return string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\"), "'"); //((Enum)val).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) + + else if (param is DateTime) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'"); + } + else if (param is DateTime?) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'"); + } + else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; else if (param is byte[]) diff --git a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj index b3c693a2..119d7d9c 100644 --- a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj +++ b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj @@ -19,7 +19,7 @@ False key.snk false - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/Providers/FreeSql.Provider.Custom/CustomAdapter.cs b/Providers/FreeSql.Provider.Custom/CustomAdapter.cs index b32c2bfc..70d0db06 100644 --- a/Providers/FreeSql.Provider.Custom/CustomAdapter.cs +++ b/Providers/FreeSql.Provider.Custom/CustomAdapter.cs @@ -51,6 +51,9 @@ namespace FreeSql.Custom { if (value == null) return "NULL"; if (value.Equals(DateTime.MinValue) == true) value = new DateTime(1970, 1, 1); + + if (value is DateTime && Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(value)?.ToString(); + if (value is DateTime? && Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler2)) return typeHandler2.Serialize(value)?.ToString(); return string.Concat("'", ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss"), "'"); } public virtual string TimeSpanRawSql(object value) => value == null ? "NULL" : ((TimeSpan)value).TotalSeconds.ToString(); diff --git a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj index fe345322..f418c095 100644 --- a/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj +++ b/Providers/FreeSql.Provider.Custom/FreeSql.Provider.Custom.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net45;net40 @@ -18,7 +18,7 @@ true key.snk false - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlAdo/CustomMySqlAdo.cs b/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlAdo/CustomMySqlAdo.cs index 2fa8378b..8520980f 100644 --- a/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlAdo/CustomMySqlAdo.cs +++ b/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlAdo/CustomMySqlAdo.cs @@ -42,8 +42,18 @@ namespace FreeSql.Custom.MySql return string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\").Replace(", ", ","), "'"); //((Enum)val).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) + + else if (param is DateTime) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); + } + else if (param is DateTime?) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); + } + else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; else if (param is byte[]) diff --git a/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlUtils.cs b/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlUtils.cs index 41d81cf0..82db8cfc 100644 --- a/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlUtils.cs +++ b/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlUtils.cs @@ -68,7 +68,7 @@ namespace FreeSql.Custom.MySql public override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}"; public override string Div(string left, string right, Type leftType, Type rightType) => $"{left} div {right}"; public override string Now => "now()"; - public override string NowUtc => "current_timestamp()"; + public override string NowUtc => "utc_timestamp()"; public override string QuoteWriteParamterAdapter(Type type, string paramterName) { diff --git a/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleAdo/CustomOracleAdo.cs b/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleAdo/CustomOracleAdo.cs index 9e4e24ae..72bfe249 100644 --- a/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleAdo/CustomOracleAdo.cs +++ b/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleAdo/CustomOracleAdo.cs @@ -56,8 +56,18 @@ namespace FreeSql.Custom.Oracle return ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) + + else if (param is DateTime) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); + } + else if (param is DateTime?) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); + } + else if (param is TimeSpan || param is TimeSpan?) return $"numtodsinterval({((TimeSpan)param).Ticks * 1.0 / 10000000},'second')"; else if (param is IEnumerable) diff --git a/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleCodeFirst.cs b/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleCodeFirst.cs index fc03a10c..4877de4b 100644 --- a/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleCodeFirst.cs +++ b/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleCodeFirst.cs @@ -59,8 +59,8 @@ namespace FreeSql.Custom.Oracle if (enumType != null) { var newItem = enumType.GetCustomAttributes(typeof(FlagsAttribute), false).Any() ? - CsToDb.New(DbType.Int32, "number", $"number(16){(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, enumType.CreateInstanceGetDefaultValue()) : - CsToDb.New(DbType.Int64, "number", $"number(32){(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, enumType.CreateInstanceGetDefaultValue()); + CsToDb.New(DbType.Int32, "number", $"number(32){(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, enumType.CreateInstanceGetDefaultValue()) : + CsToDb.New(DbType.Int64, "number", $"number(16){(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, enumType.CreateInstanceGetDefaultValue()); if (_dicCsToDb.ContainsKey(type.FullName) == false) { lock (_dicCsToDbLock) diff --git a/Providers/FreeSql.Provider.Custom/OracleAdapter.cs b/Providers/FreeSql.Provider.Custom/OracleAdapter.cs index 9d52af36..3cd12cda 100644 --- a/Providers/FreeSql.Provider.Custom/OracleAdapter.cs +++ b/Providers/FreeSql.Provider.Custom/OracleAdapter.cs @@ -51,6 +51,9 @@ namespace FreeSql.Custom { if (value == null) return "NULL"; if (value.Equals(DateTime.MinValue) == true) value = new DateTime(1970, 1, 1); + + if (value is DateTime && Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(value)?.ToString(); + if (value is DateTime? && Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler2)) return typeHandler2.Serialize(value)?.ToString(); return string.Concat("'", ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss"), "'"); } public virtual string TimeSpanRawSql(object value) => value == null ? "NULL" : ((TimeSpan)value).TotalSeconds.ToString(); diff --git a/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLAdo/CustomPostgreSQLAdo.cs b/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLAdo/CustomPostgreSQLAdo.cs index 8fe48386..a76f9ebe 100644 --- a/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLAdo/CustomPostgreSQLAdo.cs +++ b/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLAdo/CustomPostgreSQLAdo.cs @@ -44,8 +44,18 @@ namespace FreeSql.Custom.PostgreSQL return ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) + + else if (param is DateTime) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); + } + else if (param is DateTime?) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); + } + else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; else if (param is byte[]) diff --git a/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerAdo/CustomSqlServerAdo.cs b/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerAdo/CustomSqlServerAdo.cs index 61e61caa..d71ff666 100644 --- a/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerAdo/CustomSqlServerAdo.cs +++ b/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerAdo/CustomSqlServerAdo.cs @@ -49,11 +49,20 @@ namespace FreeSql.Custom.SqlServer return ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) + + else if (param is DateTime) { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); if (param.Equals(DateTime.MinValue) == true) param = new DateTime(1970, 1, 1); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); } + else if (param is DateTime?) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + if (param.Equals(DateTime.MinValue) == true) param = new DateTime(1970, 1, 1); + return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); + } + else if (param is DateTimeOffset || param is DateTimeOffset?) { if (param.Equals(DateTimeOffset.MinValue) == true) param = new DateTimeOffset(new DateTime(1970, 1, 1), TimeSpan.Zero); diff --git a/Providers/FreeSql.Provider.Dameng/DamengAdo/DamengAdo.cs b/Providers/FreeSql.Provider.Dameng/DamengAdo/DamengAdo.cs index 3b108a8d..f8d65b66 100644 --- a/Providers/FreeSql.Provider.Dameng/DamengAdo/DamengAdo.cs +++ b/Providers/FreeSql.Provider.Dameng/DamengAdo/DamengAdo.cs @@ -58,8 +58,18 @@ namespace FreeSql.Dameng return ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) + + else if (param is DateTime) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); + } + else if (param is DateTime?) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); + } + else if (param is TimeSpan || param is TimeSpan?) return $"numtodsinterval({((TimeSpan)param).Ticks * 1.0 / 10000000},'second')"; else if (param is IEnumerable) diff --git a/Providers/FreeSql.Provider.Dameng/DamengCodeFirst.cs b/Providers/FreeSql.Provider.Dameng/DamengCodeFirst.cs index 0724ba61..2ac88b6e 100644 --- a/Providers/FreeSql.Provider.Dameng/DamengCodeFirst.cs +++ b/Providers/FreeSql.Provider.Dameng/DamengCodeFirst.cs @@ -60,8 +60,8 @@ namespace FreeSql.Dameng if (enumType != null) { var newItem = enumType.GetCustomAttributes(typeof(FlagsAttribute), false).Any() ? - CsToDb.New(DmDbType.Int32, "number", $"number(16){(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, enumType.CreateInstanceGetDefaultValue()) : - CsToDb.New(DmDbType.Int64, "number", $"number(32){(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, enumType.CreateInstanceGetDefaultValue()); + CsToDb.New(DmDbType.Int32, "number", $"number(32){(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, enumType.CreateInstanceGetDefaultValue()) : + CsToDb.New(DmDbType.Int64, "number", $"number(16){(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, enumType.CreateInstanceGetDefaultValue()); if (_dicCsToDb.ContainsKey(type.FullName) == false) { lock (_dicCsToDbLock) diff --git a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj index 821ed25b..ab7c851a 100644 --- a/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj +++ b/Providers/FreeSql.Provider.Dameng/FreeSql.Provider.Dameng.csproj @@ -1,4 +1,4 @@ - + net60;netcoreapp3.1;netstandard2.0;net45;net40 @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/Providers/FreeSql.Provider.Firebird/FirebirdAdo/FirebirdAdo.cs b/Providers/FreeSql.Provider.Firebird/FirebirdAdo/FirebirdAdo.cs index f4121a14..b769ec71 100644 --- a/Providers/FreeSql.Provider.Firebird/FirebirdAdo/FirebirdAdo.cs +++ b/Providers/FreeSql.Provider.Firebird/FirebirdAdo/FirebirdAdo.cs @@ -79,8 +79,18 @@ namespace FreeSql.Firebird return ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) + + else if (param is DateTime) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); return string.Concat("timestamp '", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); + } + else if (param is DateTime?) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + return string.Concat("timestamp '", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); + } + else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; else if (param is byte[]) diff --git a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj index cc57398c..1e3ef25d 100644 --- a/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj +++ b/Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net452 @@ -18,7 +18,7 @@ true key.snk false - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj index 84a60e63..6567e5ee 100644 --- a/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj +++ b/Providers/FreeSql.Provider.GBase/FreeSql.Provider.GBase.csproj @@ -1,4 +1,4 @@ - + netstandard2.0 @@ -18,7 +18,7 @@ true key.snk false - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/Providers/FreeSql.Provider.GBase/GBaseAdo/GBaseAdo.cs b/Providers/FreeSql.Provider.GBase/GBaseAdo/GBaseAdo.cs index 413393c5..fc9d082c 100644 --- a/Providers/FreeSql.Provider.GBase/GBaseAdo/GBaseAdo.cs +++ b/Providers/FreeSql.Provider.GBase/GBaseAdo/GBaseAdo.cs @@ -57,12 +57,22 @@ namespace FreeSql.GBase return ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) + + else if (param is DateTime) { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); if (mapColumn?.DbPrecision > 0) return string.Concat("'", ((DateTime)param).ToString($"yyyy-MM-dd HH:mm:ss.{"f".PadRight(mapColumn.DbPrecision, 'f')}"), "'"); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'"); } + else if (param is DateTime?) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + if (mapColumn?.DbPrecision > 0) + return string.Concat("'", ((DateTime)param).ToString($"yyyy-MM-dd HH:mm:ss.{"f".PadRight(mapColumn.DbPrecision, 'f')}"), "'"); + return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'"); + } + else if (param is TimeSpan || param is TimeSpan?) { var ts = (TimeSpan)param; diff --git a/Providers/FreeSql.Provider.GBase/GBaseUtils.cs b/Providers/FreeSql.Provider.GBase/GBaseUtils.cs index c59177f2..a1331a55 100644 --- a/Providers/FreeSql.Provider.GBase/GBaseUtils.cs +++ b/Providers/FreeSql.Provider.GBase/GBaseUtils.cs @@ -100,8 +100,16 @@ namespace FreeSql.GBase var ts = (TimeSpan)value; return $"interval({ts.Days} {ts.Hours}:{ts.Minutes}:{ts.Seconds}.{ts.Milliseconds}) day(9) to fraction"; } - if (type == typeof(DateTime) || type == typeof(DateTime?)) + if (type == typeof(DateTime)) { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(value)?.ToString(); + if (col?.DbPrecision > 0) + return string.Concat("'", ((DateTime)value).ToString($"yyyy-MM-dd HH:mm:ss.{"f".PadRight(col.DbPrecision, 'f')}"), "'"); + return string.Concat("'", ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss"), "'"); + } + if (type == typeof(DateTime?)) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(value)?.ToString(); if (col?.DbPrecision > 0) return string.Concat("'", ((DateTime)value).ToString($"yyyy-MM-dd HH:mm:ss.{"f".PadRight(col.DbPrecision, 'f')}"), "'"); return string.Concat("'", ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss"), "'"); diff --git a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj index ddbbd357..59053fd9 100644 --- a/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj +++ b/Providers/FreeSql.Provider.KingbaseES/FreeSql.Provider.KingbaseES.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net461 @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/Providers/FreeSql.Provider.KingbaseES/KingbaseESAdo/KingbaseESAdo.cs b/Providers/FreeSql.Provider.KingbaseES/KingbaseESAdo/KingbaseESAdo.cs index b3d16999..f14c1536 100644 --- a/Providers/FreeSql.Provider.KingbaseES/KingbaseESAdo/KingbaseESAdo.cs +++ b/Providers/FreeSql.Provider.KingbaseES/KingbaseESAdo/KingbaseESAdo.cs @@ -56,8 +56,18 @@ namespace FreeSql.KingbaseES return ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) + + else if (param is DateTime) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); + } + else if (param is DateTime?) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); + } + else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; else if (param is byte[]) diff --git a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj index 1a1bf38b..fe131ff9 100644 --- a/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj +++ b/Providers/FreeSql.Provider.MsAccess/FreeSql.Provider.MsAccess.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net45;net40 @@ -18,7 +18,7 @@ true key.snk false - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/Providers/FreeSql.Provider.MsAccess/MsAccessAdo/MsAccessAdo.cs b/Providers/FreeSql.Provider.MsAccess/MsAccessAdo/MsAccessAdo.cs index 5c2b0b67..c10affcb 100644 --- a/Providers/FreeSql.Provider.MsAccess/MsAccessAdo/MsAccessAdo.cs +++ b/Providers/FreeSql.Provider.MsAccess/MsAccessAdo/MsAccessAdo.cs @@ -57,11 +57,20 @@ namespace FreeSql.MsAccess return ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) + + else if (param is DateTime) { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); if (param.Equals(DateTime.MinValue) == true) param = new DateTime(1970, 1, 1); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'"); } + else if (param is DateTime?) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + if (param.Equals(DateTime.MinValue) == true) param = new DateTime(1970, 1, 1); + return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'"); + } + else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).TotalSeconds; else if (param is byte[]) diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj index ea83b5c8..f8fdadcc 100644 --- a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net452;net451;net45;net40 @@ -18,7 +18,7 @@ true key.snk false - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlAdo.cs b/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlAdo.cs index 1504f947..6eac3e07 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlAdo.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlAdo.cs @@ -61,8 +61,18 @@ namespace FreeSql.MySql return string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\").Replace(", ", ","), "'"); //((Enum)val).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) + + else if (param is DateTime) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); + } + else if (param is DateTime?) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); + } + else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; else if (param is byte[]) diff --git a/Providers/FreeSql.Provider.MySql/MySqlUtils.cs b/Providers/FreeSql.Provider.MySql/MySqlUtils.cs index f8d17211..a1622cc6 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlUtils.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlUtils.cs @@ -100,7 +100,7 @@ namespace FreeSql.MySql public override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}"; public override string Div(string left, string right, Type leftType, Type rightType) => $"{left} div {right}"; public override string Now => "now()"; - public override string NowUtc => "current_timestamp()"; + public override string NowUtc => "utc_timestamp()"; public override string QuoteWriteParamterAdapter(Type type, string paramterName) { diff --git a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj index 05d1d52f..eb9de138 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj +++ b/Providers/FreeSql.Provider.MySqlConnector/FreeSql.Provider.MySqlConnector.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net60;net50;net45;netstandard2.1;netcoreapp2.1;netcoreapp3.1; @@ -18,7 +18,7 @@ true key.snk false - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs b/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs index 27374291..ad08572d 100644 --- a/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs +++ b/Providers/FreeSql.Provider.MySqlConnector/MySqlConnectorUtils.cs @@ -118,7 +118,7 @@ namespace FreeSql.MySql public override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}"; public override string Div(string left, string right, Type leftType, Type rightType) => $"{left} div {right}"; public override string Now => "now()"; - public override string NowUtc => "current_timestamp()"; + public override string NowUtc => "utc_timestamp()"; public override string QuoteWriteParamterAdapter(Type type, string paramterName) { diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengAdo/OdbcDamengAdo.cs b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengAdo/OdbcDamengAdo.cs index 2b996cf8..50379ff1 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengAdo/OdbcDamengAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengAdo/OdbcDamengAdo.cs @@ -59,8 +59,18 @@ namespace FreeSql.Odbc.Dameng return ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) + + else if (param is DateTime) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); + } + else if (param is DateTime?) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); + } + else if (param is TimeSpan || param is TimeSpan?) return $"numtodsinterval({((TimeSpan)param).Ticks * 1.0 / 10000000},'second')"; else if (param is IEnumerable) diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengCodeFirst.cs index 2de3d900..52fb7a4d 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengCodeFirst.cs @@ -61,8 +61,8 @@ namespace FreeSql.Odbc.Dameng if (enumType != null) { var newItem = enumType.GetCustomAttributes(typeof(FlagsAttribute), false).Any() ? - CsToDb.New(OdbcType.Int, "number", $"number(16){(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, enumType.CreateInstanceGetDefaultValue()) : - CsToDb.New(OdbcType.BigInt, "number", $"number(32){(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, enumType.CreateInstanceGetDefaultValue()); + CsToDb.New(OdbcType.Int, "number", $"number(32){(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, enumType.CreateInstanceGetDefaultValue()) : + CsToDb.New(OdbcType.BigInt, "number", $"number(16){(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, enumType.CreateInstanceGetDefaultValue()); if (_dicCsToDb.ContainsKey(type.FullName) == false) { lock (_dicCsToDbLock) diff --git a/Providers/FreeSql.Provider.Odbc/Default/OdbcAdapter.cs b/Providers/FreeSql.Provider.Odbc/Default/OdbcAdapter.cs index 7a9cbfd4..0613e5b3 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/OdbcAdapter.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/OdbcAdapter.cs @@ -51,6 +51,9 @@ namespace FreeSql.Odbc.Default { if (value == null) return "NULL"; if (value.Equals(DateTime.MinValue) == true) value = new DateTime(1970, 1, 1); + + if (value is DateTime && Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(value)?.ToString(); + if (value is DateTime? && Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler2)) return typeHandler2.Serialize(value)?.ToString(); return string.Concat("'", ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss"), "'"); } public virtual string TimeSpanRawSql(object value) => value == null ? "NULL" : ((TimeSpan)value).TotalSeconds.ToString(); diff --git a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj index ba3b654a..9dc24e0b 100644 --- a/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj +++ b/Providers/FreeSql.Provider.Odbc/FreeSql.Provider.Odbc.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net45;net40 @@ -18,7 +18,7 @@ true key.snk false - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESAdo/OdbcKingbaseESAdo.cs b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESAdo/OdbcKingbaseESAdo.cs index 6aae0a43..f2d91d3f 100644 --- a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESAdo/OdbcKingbaseESAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESAdo/OdbcKingbaseESAdo.cs @@ -59,8 +59,18 @@ namespace FreeSql.Odbc.KingbaseES return ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) + + else if (param is DateTime) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); + } + else if (param is DateTime?) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); + } + else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; else if (param is byte[]) diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlAdo.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlAdo.cs index e84bf3c1..e0ec77f3 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlAdo.cs @@ -59,8 +59,18 @@ namespace FreeSql.Odbc.MySql return string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\").Replace(", ", ","), "'"); //((Enum)val).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) + + else if (param is DateTime) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); + } + else if (param is DateTime?) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); + } + else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; else if (param is byte[]) diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlUtils.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlUtils.cs index c451aeb2..d78f43ea 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlUtils.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlUtils.cs @@ -64,7 +64,7 @@ namespace FreeSql.Odbc.MySql public override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}"; public override string Div(string left, string right, Type leftType, Type rightType) => $"{left} div {right}"; public override string Now => "now()"; - public override string NowUtc => "current_timestamp()"; + public override string NowUtc => "utc_timestamp()"; public override string QuoteWriteParamterAdapter(Type type, string paramterName) { diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleAdo.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleAdo.cs index 19a482d3..a54c5b2c 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleAdo.cs @@ -60,8 +60,18 @@ namespace FreeSql.Odbc.Oracle return ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) + + else if (param is DateTime) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); + } + else if (param is DateTime?) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); + } + else if (param is TimeSpan || param is TimeSpan?) return $"numtodsinterval({((TimeSpan)param).Ticks * 1.0 / 10000000},'second')"; else if (param is IEnumerable) diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleCodeFirst.cs index 0ce0c843..12ad0db3 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleCodeFirst.cs @@ -61,8 +61,8 @@ namespace FreeSql.Odbc.Oracle if (enumType != null) { var newItem = enumType.GetCustomAttributes(typeof(FlagsAttribute), false).Any() ? - CsToDb.New(OdbcType.Int, "number", $"number(16){(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, enumType.CreateInstanceGetDefaultValue()) : - CsToDb.New(OdbcType.BigInt, "number", $"number(32){(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, enumType.CreateInstanceGetDefaultValue()); + CsToDb.New(OdbcType.Int, "number", $"number(32){(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, enumType.CreateInstanceGetDefaultValue()) : + CsToDb.New(OdbcType.BigInt, "number", $"number(16){(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, enumType.CreateInstanceGetDefaultValue()); if (_dicCsToDb.ContainsKey(type.FullName) == false) { lock (_dicCsToDbLock) diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLAdo.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLAdo.cs index 7a764f7b..83afa20b 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLAdo.cs @@ -60,8 +60,18 @@ namespace FreeSql.Odbc.PostgreSQL return ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) + + else if (param is DateTime) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); + } + else if (param is DateTime?) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); + } + else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; else if (param is byte[]) diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerAdo.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerAdo.cs index 070f5272..0fdcf5ac 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerAdo.cs @@ -64,11 +64,20 @@ namespace FreeSql.Odbc.SqlServer return ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) + + else if (param is DateTime) { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); if (param.Equals(DateTime.MinValue) == true) param = new DateTime(1970, 1, 1); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); } + else if (param is DateTime?) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + if (param.Equals(DateTime.MinValue) == true) param = new DateTime(1970, 1, 1); + return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); + } + else if (param is DateTimeOffset || param is DateTimeOffset?) { if (param.Equals(DateTimeOffset.MinValue) == true) param = new DateTimeOffset(new DateTime(1970, 1, 1), TimeSpan.Zero); diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj index 4ba3ed8a..59fd85d3 100644 --- a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;netstandard2.1;net60;net50;net45;net40 @@ -18,7 +18,7 @@ true key.snk false - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleAdo.cs b/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleAdo.cs index 73fe54bf..2126c54e 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleAdo.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleAdo.cs @@ -57,8 +57,18 @@ namespace FreeSql.Oracle return ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) + + else if (param is DateTime) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); + } + else if (param is DateTime?) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')"); + } + else if (param is TimeSpan || param is TimeSpan?) return $"numtodsinterval({((TimeSpan)param).Ticks * 1.0 / 10000000},'second')"; else if (param is IEnumerable) diff --git a/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs b/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs index 80f32817..358b0c19 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs @@ -96,8 +96,8 @@ namespace FreeSql.Oracle if (enumType != null) { var newItem = enumType.GetCustomAttributes(typeof(FlagsAttribute), false).Any() ? - CsToDb.New(_dicCsToDb[typeof(int)].type, "number", $"number(16){(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, enumType.CreateInstanceGetDefaultValue()) : - CsToDb.New(_dicCsToDb[typeof(long)].type, "number", $"number(32){(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, enumType.CreateInstanceGetDefaultValue()); + CsToDb.New(_dicCsToDb[typeof(int)].type, "number", $"number(32){(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, enumType.CreateInstanceGetDefaultValue()) : + CsToDb.New(_dicCsToDb[typeof(long)].type, "number", $"number(16){(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, enumType.CreateInstanceGetDefaultValue()); if (_dicCsToDb.ContainsKey(type) == false) { lock (_dicCsToDbLock) diff --git a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj index d9c4eaa3..b8d63cba 100644 --- a/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj +++ b/Providers/FreeSql.Provider.OracleOledb/FreeSql.Provider.OracleOledb.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net45;net40 @@ -18,7 +18,7 @@ true key.snk false - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj index e30fa0fb..72833000 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj +++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net461;net452;net451;net45 @@ -18,7 +18,7 @@ true key.snk false - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs index cb8dc80c..4e2c3216 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs @@ -61,8 +61,18 @@ namespace FreeSql.PostgreSQL return ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) + + else if (param is DateTime) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); + } + else if (param is DateTime?) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); + } + else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; else if (param is byte[]) diff --git a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj index 74ef5f22..d623cbb2 100644 --- a/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj +++ b/Providers/FreeSql.Provider.QuestDb/FreeSql.Provider.QuestDb.csproj @@ -1,4 +1,4 @@ - + netstandard2.0; @@ -18,7 +18,7 @@ true key.snk false - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/Providers/FreeSql.Provider.QuestDb/QuestDbAdo/QuestDbAdo.cs b/Providers/FreeSql.Provider.QuestDb/QuestDbAdo/QuestDbAdo.cs index d5b7071e..81c5c97f 100644 --- a/Providers/FreeSql.Provider.QuestDb/QuestDbAdo/QuestDbAdo.cs +++ b/Providers/FreeSql.Provider.QuestDb/QuestDbAdo/QuestDbAdo.cs @@ -63,8 +63,18 @@ namespace FreeSql.QuestDb return ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) + + else if (param is DateTime) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); + } + else if (param is DateTime?) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); + } + else if (param is TimeSpan || param is TimeSpan?) return (long)((TimeSpan)param).TotalSeconds; else if (param is byte[]) diff --git a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj index 211e6c68..85e27d80 100644 --- a/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj +++ b/Providers/FreeSql.Provider.ShenTong/FreeSql.Provider.ShenTong.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net45;net40 @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/Providers/FreeSql.Provider.ShenTong/ShenTongAdo/ShenTongAdo.cs b/Providers/FreeSql.Provider.ShenTong/ShenTongAdo/ShenTongAdo.cs index bc89fc1e..d217fc3e 100644 --- a/Providers/FreeSql.Provider.ShenTong/ShenTongAdo/ShenTongAdo.cs +++ b/Providers/FreeSql.Provider.ShenTong/ShenTongAdo/ShenTongAdo.cs @@ -57,8 +57,18 @@ namespace FreeSql.ShenTong return ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) + + else if (param is DateTime) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); + } + else if (param is DateTime?) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); + } + else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).TotalSeconds; else if (param is byte[]) diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj index 9bca4b70..111db651 100644 --- a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net60;net50;net451;net45;net40 @@ -18,7 +18,7 @@ true false key.snk - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerAdo.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerAdo.cs index e42d69f6..98bc119f 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerAdo.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerAdo.cs @@ -68,11 +68,20 @@ namespace FreeSql.SqlServer return ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) + + else if (param is DateTime) { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); if (param.Equals(DateTime.MinValue) == true) param = new DateTime(1970, 1, 1); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); } + else if (param is DateTime?) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + if (param.Equals(DateTime.MinValue) == true) param = new DateTime(1970, 1, 1); + return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); + } + else if (param is DateTimeOffset || param is DateTimeOffset?) { if (param.Equals(DateTimeOffset.MinValue) == true) param = new DateTimeOffset(new DateTime(1970, 1, 1), TimeSpan.Zero); diff --git a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj index 845e2b3d..5e2bbae3 100644 --- a/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj +++ b/Providers/FreeSql.Provider.SqlServerForSystem/FreeSql.Provider.SqlServerForSystem.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net60;net50;net451;net45;net40 @@ -18,7 +18,7 @@ true key.snk false - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj index 23e2dd95..d76f77ad 100644 --- a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -1,4 +1,4 @@ - + netstandard2.0;net45;net40 @@ -18,7 +18,7 @@ true key.snk false - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteAdo.cs b/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteAdo.cs index 39e9cefc..fa851020 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteAdo.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteAdo.cs @@ -62,8 +62,18 @@ namespace FreeSql.Sqlite return ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) + + else if (param is DateTime) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'"); + } + else if (param is DateTime?) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'"); + } + else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).TotalSeconds; else if (param is byte[]) diff --git a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj index 4aa94df7..6bcce1cf 100644 --- a/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj +++ b/Providers/FreeSql.Provider.SqliteCore/FreeSql.Provider.SqliteCore.csproj @@ -18,7 +18,7 @@ true key.snk false - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj index cfcba12d..7b574332 100644 --- a/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj +++ b/Providers/FreeSql.Provider.Xugu/FreeSql.Provider.Xugu.csproj @@ -15,7 +15,7 @@ $(AssemblyName) true true - 3.2.801-preview20230917 + 3.2.802-preview20231024 diff --git a/Providers/FreeSql.Provider.Xugu/XuguAdo/XuguAdo.cs b/Providers/FreeSql.Provider.Xugu/XuguAdo/XuguAdo.cs index 883a7b5b..8eaba42f 100644 --- a/Providers/FreeSql.Provider.Xugu/XuguAdo/XuguAdo.cs +++ b/Providers/FreeSql.Provider.Xugu/XuguAdo/XuguAdo.cs @@ -59,8 +59,18 @@ namespace FreeSql.Xugu return ((Enum)param).ToInt64(); else if (decimal.TryParse(string.Concat(param), out var trydec)) return param; - else if (param is DateTime || param is DateTime?) + + else if (param is DateTime) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param); return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); + } + else if (param is DateTime?) + { + if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param); + return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); + } + else if (param is TimeSpan || param is TimeSpan?) return ((TimeSpan)param).Ticks / 10; else if (param is byte[]) diff --git a/Providers/FreeSql.Provider.Xugu/XuguCodeFirst.cs b/Providers/FreeSql.Provider.Xugu/XuguCodeFirst.cs index 06641b8e..4ecded02 100644 --- a/Providers/FreeSql.Provider.Xugu/XuguCodeFirst.cs +++ b/Providers/FreeSql.Provider.Xugu/XuguCodeFirst.cs @@ -22,39 +22,35 @@ namespace FreeSql.Xugu } static object _dicCsToDbLock = new object(); - static Dictionary> _dicCsToDb = new Dictionary>() { + static Dictionary> _dicCsToDb = new Dictionary>() { - { - typeof(byte).FullName, - CsToDb.New(XGDbType.SmallInt, "TINYINT","TINYINT NOT NULL", false, false, 0) - }, - - { typeof(byte?).FullName, CsToDb.New(XGDbType.SmallInt, "TINYINT", "TINYINT", false, true, null) }, - { typeof(short).FullName, CsToDb.New(XGDbType.SmallInt, "SMALLINT","SMALLINT NOT NULL", false, false, 0) },{ typeof(short?).FullName, CsToDb.New(XGDbType.SmallInt, "SMALLINT", "SMALLINT", false, true, null) }, - { typeof(int).FullName, CsToDb.New(XGDbType.Int, "INTEGER","INTEGER NOT NULL", false, false, 0) },{ typeof(int?).FullName, CsToDb.New(XGDbType.Int, "INTEGER", "INTEGER", false, true, null) }, - { typeof(long).FullName, CsToDb.New(XGDbType.BigInt, "BIGINT","BIGINT NOT NULL", false, false, 0) },{ typeof(long?).FullName, CsToDb.New(XGDbType.BigInt, "BIGINT", "BIGINT", false, true, null) }, + { typeof(byte), CsToDb.New(XGDbType.SmallInt, "TINYINT","TINYINT NOT NULL", false, false, 0) }, + { typeof(byte?), CsToDb.New(XGDbType.SmallInt, "TINYINT", "TINYINT", false, true, null) }, + { typeof(short), CsToDb.New(XGDbType.SmallInt, "SMALLINT","SMALLINT NOT NULL", false, false, 0) },{ typeof(short?), CsToDb.New(XGDbType.SmallInt, "SMALLINT", "SMALLINT", false, true, null) }, + { typeof(int), CsToDb.New(XGDbType.Int, "INTEGER","INTEGER NOT NULL", false, false, 0) },{ typeof(int?), CsToDb.New(XGDbType.Int, "INTEGER", "INTEGER", false, true, null) }, + { typeof(long), CsToDb.New(XGDbType.BigInt, "BIGINT","BIGINT NOT NULL", false, false, 0) },{ typeof(long?), CsToDb.New(XGDbType.BigInt, "BIGINT", "BIGINT", false, true, null) }, - { typeof(ushort).FullName, CsToDb.New(XGDbType.Int, "INT","INT NOT NULL", false, false, 0) },{ typeof(ushort?).FullName, CsToDb.New(XGDbType.Int, "INT", "INT", false, true, null) }, - { typeof(uint).FullName, CsToDb.New(XGDbType.BigInt, "BIGINT","BIGINT NOT NULL", false, false, 0) },{ typeof(uint?).FullName, CsToDb.New(XGDbType.BigInt, "BIGINT", "BIGINT", false, true, null) }, - { typeof(ulong).FullName, CsToDb.New(XGDbType.Numeric, "NUMERIC","NUMERIC(20,0) NOT NULL", false, false, 0) },{ typeof(ulong?).FullName, CsToDb.New(XGDbType.Numeric, "NUMERIC", "NUMERIC(20,0)", false, true, null) }, + { typeof(ushort), CsToDb.New(XGDbType.Int, "INT","INT NOT NULL", false, false, 0) },{ typeof(ushort?), CsToDb.New(XGDbType.Int, "INT", "INT", false, true, null) }, + { typeof(uint), CsToDb.New(XGDbType.BigInt, "BIGINT","BIGINT NOT NULL", false, false, 0) },{ typeof(uint?), CsToDb.New(XGDbType.BigInt, "BIGINT", "BIGINT", false, true, null) }, + { typeof(ulong), CsToDb.New(XGDbType.Numeric, "NUMERIC","NUMERIC(20,0) NOT NULL", false, false, 0) },{ typeof(ulong?), CsToDb.New(XGDbType.Numeric, "NUMERIC", "NUMERIC(20,0)", false, true, null) }, - { typeof(float).FullName, CsToDb.New(XGDbType.Real, "FLOAT","FLOAT NOT NULL", false, false, 0) },{ typeof(float?).FullName, CsToDb.New(XGDbType.Real, "FLOAT", "FLOAT", false, true, null) }, - { typeof(double).FullName, CsToDb.New(XGDbType.Double, "DOUBLE","DOUBLE NOT NULL", false, false, 0) },{ typeof(double?).FullName, CsToDb.New(XGDbType.Double, "DOUBLE", "DOUBLE", false, true, null) }, - { typeof(decimal).FullName, CsToDb.New(XGDbType.Numeric, "NUMERIC", "NUMERIC(10,2) NOT NULL", false, false, 0) },{ typeof(decimal?).FullName, CsToDb.New(XGDbType.Numeric, "NUMERIC", "NUMERIC(10,2)", false, true, null) }, + { typeof(float), CsToDb.New(XGDbType.Real, "FLOAT","FLOAT NOT NULL", false, false, 0) },{ typeof(float?), CsToDb.New(XGDbType.Real, "FLOAT", "FLOAT", false, true, null) }, + { typeof(double), CsToDb.New(XGDbType.Double, "DOUBLE","DOUBLE NOT NULL", false, false, 0) },{ typeof(double?), CsToDb.New(XGDbType.Double, "DOUBLE", "DOUBLE", false, true, null) }, + { typeof(decimal), CsToDb.New(XGDbType.Numeric, "NUMERIC", "NUMERIC(10,2) NOT NULL", false, false, 0) },{ typeof(decimal?), CsToDb.New(XGDbType.Numeric, "NUMERIC", "NUMERIC(10,2)", false, true, null) }, - { typeof(string).FullName, CsToDb.New(XGDbType.VarChar, "VARCHAR", "VARCHAR(255)", false, null, "") }, + { typeof(string), CsToDb.New(XGDbType.VarChar, "VARCHAR", "VARCHAR(255)", false, null, "") }, - { typeof(char).FullName, CsToDb.New(XGDbType.Char, "CHAR", "CHAR(1)", false, null, '\0') }, + { typeof(char), CsToDb.New(XGDbType.Char, "CHAR", "CHAR(1)", false, null, '\0') }, - //{ typeof(TimeSpan).FullName, CsToDb.New(XGDbType.Time, "time","time NOT NULL", false, false, 0) },{ typeof(TimeSpan?).FullName, CsToDb.New(XGDbType.Time, "time", "time",false, true, null) }, - { typeof(DateTime).FullName, CsToDb.New(XGDbType.DateTime, "DATETIME", "DATETIME NOT NULL", false, false, new DateTime(1970,1,1)) }, - { typeof(DateTime?).FullName, CsToDb.New(XGDbType.DateTime, "DATETIME", "DATETIME", false, true, null) }, + //{ typeof(TimeSpan), CsToDb.New(XGDbType.Time, "time","time NOT NULL", false, false, 0) },{ typeof(TimeSpan?), CsToDb.New(XGDbType.Time, "time", "time",false, true, null) }, + { typeof(DateTime), CsToDb.New(XGDbType.DateTime, "DATETIME", "DATETIME NOT NULL", false, false, new DateTime(1970,1,1)) }, + { typeof(DateTime?), CsToDb.New(XGDbType.DateTime, "DATETIME", "DATETIME", false, true, null) }, - { typeof(bool).FullName, CsToDb.New(XGDbType.Bool, "BOOLEAN","BOOLEAN NOT NULL", null, false, false) },{ typeof(bool?).FullName, CsToDb.New(XGDbType.Bool, "BOOLEAN","BOOLEAN", null, true, null) }, + { typeof(bool), CsToDb.New(XGDbType.Bool, "BOOLEAN","BOOLEAN NOT NULL", null, false, false) },{ typeof(bool?), CsToDb.New(XGDbType.Bool, "BOOLEAN","BOOLEAN", null, true, null) }, - { typeof(byte[]).FullName, CsToDb.New(XGDbType.VarBinary, "blob", "blob NULL", false, null, new byte[0]) }, - { typeof(Guid).FullName, CsToDb.New(XGDbType.Char, "char", "char(36) NOT NULL", false, false, Guid.Empty) },{ typeof(Guid?).FullName, CsToDb.New(XGDbType.Char, "char", "char(36) NULL", false, true, null) }, + { typeof(byte[]), CsToDb.New(XGDbType.VarBinary, "blob", "blob NULL", false, null, new byte[0]) }, + { typeof(Guid), CsToDb.New(XGDbType.Char, "char", "char(36) NOT NULL", false, false, Guid.Empty) },{ typeof(Guid?), CsToDb.New(XGDbType.Char, "char", "char(36) NULL", false, true, null) }, @@ -65,9 +61,30 @@ namespace FreeSql.Xugu public override DbInfoResult GetDbInfo(Type type) { - _dicCsToDb.TryGetValue(type.FullName, out var info); - if (info == null) return null; - return new DbInfoResult((int)info.type, info.dbtype, info.dbtypeFull, info.isnullable, info.defaultValue); + if (_dicCsToDb.TryGetValue(type, out var trydc)) return new DbInfoResult((int)trydc.type, trydc.dbtype, trydc.dbtypeFull, trydc.isnullable, trydc.defaultValue); + if (type.IsArray) return null; + var enumType = type.IsEnum ? type : null; + if (enumType == null && type.IsNullableType()) + { + var genericTypes = type.GetGenericArguments(); + if (genericTypes.Length == 1 && genericTypes.First().IsEnum) enumType = genericTypes.First(); + } + if (enumType != null) + { + var newItem = enumType.GetCustomAttributes(typeof(FlagsAttribute), false).Any() ? + CsToDb.New(_dicCsToDb[typeof(int)].type, "INT", $"INT{(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, enumType.CreateInstanceGetDefaultValue()) : + CsToDb.New(_dicCsToDb[typeof(long)].type, "BIGINT", $"BIGINT{(type.IsEnum ? " NOT NULL" : "")}", false, type.IsEnum ? false : true, enumType.CreateInstanceGetDefaultValue()); + if (_dicCsToDb.ContainsKey(type) == false) + { + lock (_dicCsToDbLock) + { + if (_dicCsToDb.ContainsKey(type) == false) + _dicCsToDb.Add(type, newItem); + } + } + return new DbInfoResult((int)newItem.type, newItem.dbtype, newItem.dbtypeFull, newItem.isnullable, newItem.defaultValue); + } + return null; } internal static string GetXuguSqlTypeFullName(object[] row) { diff --git a/Providers/FreeSql.Provider.Xugu/XuguDbFirst.cs b/Providers/FreeSql.Provider.Xugu/XuguDbFirst.cs index b58e90e7..19df6f89 100644 --- a/Providers/FreeSql.Provider.Xugu/XuguDbFirst.cs +++ b/Providers/FreeSql.Provider.Xugu/XuguDbFirst.cs @@ -70,7 +70,7 @@ namespace FreeSql.Xugu case "VARCHAR": ret = XGDbType.VarChar; break; case "CLOB": ret = XGDbType.LongVarChar; break; - //case "timestamp": ret = XGDbType.DateTime; break; + case "DATETIME": ret = XGDbType.DateTime; break; //case "timestamptz": ret = XGDbType.DateTime; break; //case "date": ret = XGDbType.Date; break; //case "time": ret = XGDbType.Time; break; @@ -78,7 +78,7 @@ namespace FreeSql.Xugu //case "interval": ret = XGDbType.Interval; break; case "BOOLEAN": ret = XGDbType.Bool; break; - //case "bytea": ret = XGDbType.Bytea; break; + case "BLOB": ret = XGDbType.LongVarBinary; break; //case "bit": ret = XGDbType.Bool; break; //case "varbit": ret = XGDbType.Varbit; break; diff --git a/Providers/FreeSql.Provider.Xugu/XuguUtils.cs b/Providers/FreeSql.Provider.Xugu/XuguUtils.cs index 573536b8..d73ef89f 100644 --- a/Providers/FreeSql.Provider.Xugu/XuguUtils.cs +++ b/Providers/FreeSql.Provider.Xugu/XuguUtils.cs @@ -92,7 +92,7 @@ namespace FreeSql.Xugu { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; if (value != null) value = getParamterValue(type, value); - var ret = new XGParameters { ParameterName = QuoteParamterName(parameterName), Value = value }; + var ret = new XGParameters { ParameterName = parameterName, Value = value }; var tp = _orm.CodeFirst.GetDbInfo(type)?.type; if (col != null) @@ -109,10 +109,10 @@ namespace FreeSql.Xugu } public override DbParameter[] GetDbParamtersByObject(string sql, object obj) => - Utils.GetDbParamtersByObject(sql, obj, "@", (name, type, value) => + Utils.GetDbParamtersByObject(sql, obj, ":", (name, type, value) => { if (value != null) value = getParamterValue(type, value); - var ret = new XGParameters { ParameterName = $"@{name}", Value = value }; + var ret = new XGParameters { ParameterName = name, Value = value }; var tp = _orm.CodeFirst.GetDbInfo(type)?.type; @@ -129,7 +129,7 @@ namespace FreeSql.Xugu return $"{nametrim.Trim('"').Replace("\".\"", ".").Replace(".\"", ".")}"; } public override string[] SplitTableName(string name) => GetSplitTableNames(name, '"', '"', 2); - public override string QuoteParamterName(string name) => $"@{name}"; + public override string QuoteParamterName(string name) => $":{name}"; public override string IsNull(string sql, object value) => $"coalesce({sql}, {value})"; public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}"; public override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}";