- 优化未发布的功能 IFreeSql.InsertOrUpdate

This commit is contained in:
28810
2020-05-23 18:17:54 +08:00
parent 45f06c3025
commit 511d8f909a
26 changed files with 1948 additions and 184 deletions

View File

@ -57,6 +57,93 @@ ON DUPLICATE KEY UPDATE
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndIdentity()
{
fsql.Delete<tbiou022>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbiou022`(`id`, `name`) VALUES(1, '01')
ON DUPLICATE KEY UPDATE
`name` = VALUES(`name`)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbiou022`(`id`, `name`) VALUES(1, '011')
ON DUPLICATE KEY UPDATE
`name` = VALUES(`name`)", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbiou022`(`id`, `name`) VALUES(2, '02')
ON DUPLICATE KEY UPDATE
`name` = VALUES(`name`)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().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(@"INSERT INTO `tbiou022`(`id`, `name`) VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')
ON DUPLICATE KEY UPDATE
`name` = VALUES(`name`)", sql);
Assert.Equal(5, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().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(@"INSERT INTO `tbiou022`(`id`, `name`) VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')
ON DUPLICATE KEY UPDATE
`name` = VALUES(`name`)", sql);
Assert.Equal(8, iou.ExecuteAffrows());
var lst = fsql.Select<tbiou022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "00" + a.id).Count());
//--no primary
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "01" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbiou022`(`name`) VALUES('01')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbiou022`(`name`) VALUES('011')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbiou022`(`name`) VALUES('02')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new[] { new tbiou022 { name = "01" }, new tbiou022 { name = "02" }, new tbiou022 { name = "03" }, new tbiou022 { name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbiou022`(`name`) VALUES('01'), ('02'), ('03'), ('04')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new[] { new tbiou022 { name = "001" }, new tbiou022 { name = "002" }, new tbiou022 { name = "003" }, new tbiou022 { name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbiou022`(`name`) VALUES('001'), ('002'), ('003'), ('004')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
//--no primary and yes
iou = fsql.InsertOrUpdate<tbiou022>().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(@"INSERT INTO `tbiou022`(`id`, `name`) VALUES(1, '100001'), (2, '100002'), (3, '100003'), (4, '100004')
ON DUPLICATE KEY UPDATE
`name` = VALUES(`name`)
;
INSERT INTO `tbiou022`(`name`) VALUES('00001'), ('00002'), ('00003'), ('00004')", sql);
Assert.Equal(12, iou.ExecuteAffrows());
lst = fsql.Select<tbiou022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "10000" + a.id).Count());
}
class tbiou022
{
[Column(IsIdentity = true)]
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_TwoPrimary()

View File

@ -154,6 +154,149 @@ WHEN NOT MATCHED THEN
public int id { get; set; }
public string name { get; set; }
}
public void InsertOrUpdate_OnePrimaryAndIdentity()
{
fsql.Delete<tbiou022>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOU022"" t1
USING (SELECT 1 as ID, '01' as NAME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOU022"" t1
USING (SELECT 1 as ID, '011' as NAME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOU022"" t1
USING (SELECT 2 as ID, '02' as NAME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou022>().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(@"MERGE INTO ""TBIOU022"" t1
USING (SELECT 1 as ID, '01' as NAME FROM dual
UNION ALL
SELECT 2, '02' FROM dual
UNION ALL
SELECT 3, '03' FROM dual
UNION ALL
SELECT 4, '04' FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou022>().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(@"MERGE INTO ""TBIOU022"" t1
USING (SELECT 1 as ID, '001' as NAME FROM dual
UNION ALL
SELECT 2, '002' FROM dual
UNION ALL
SELECT 3, '003' FROM dual
UNION ALL
SELECT 4, '004' FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
var lst = fsql.Select<tbiou022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
//Assert.Equal(4, lst.Where(a => a.name == "00" + a.id).Count());
//--no primary
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "01" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOU022""(""NAME"") VALUES('01')", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOU022""(""NAME"") VALUES('011')", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOU022""(""NAME"") VALUES('02')", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new[] { new tbiou022 { name = "01" }, new tbiou022 { name = "02" }, new tbiou022 { name = "03" }, new tbiou022 { name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT ALL
INTO ""TBIOU022""(""NAME"") VALUES('01')
INTO ""TBIOU022""(""NAME"") VALUES('02')
INTO ""TBIOU022""(""NAME"") VALUES('03')
INTO ""TBIOU022""(""NAME"") VALUES('04')
SELECT 1 FROM DUAL", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new[] { new tbiou022 { name = "001" }, new tbiou022 { name = "002" }, new tbiou022 { name = "003" }, new tbiou022 { name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT ALL
INTO ""TBIOU022""(""NAME"") VALUES('001')
INTO ""TBIOU022""(""NAME"") VALUES('002')
INTO ""TBIOU022""(""NAME"") VALUES('003')
INTO ""TBIOU022""(""NAME"") VALUES('004')
SELECT 1 FROM DUAL", sql);
iou.ExecuteAffrows();
//--no primary and yes
iou = fsql.InsertOrUpdate<tbiou022>().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(@"MERGE INTO ""TBIOU022"" t1
USING (SELECT 1 as ID, '100001' as NAME FROM dual
UNION ALL
SELECT 2, '100002' FROM dual
UNION ALL
SELECT 3, '100003' FROM dual
UNION ALL
SELECT 4, '100004' FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)
;
INSERT ALL
INTO ""TBIOU022""(""NAME"") VALUES('00001')
INTO ""TBIOU022""(""NAME"") VALUES('00002')
INTO ""TBIOU022""(""NAME"") VALUES('00003')
INTO ""TBIOU022""(""NAME"") VALUES('00004')
SELECT 1 FROM DUAL", sql);
iou.ExecuteAffrows();
lst = fsql.Select<tbiou022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
//Assert.Equal(4, lst.Where(a => a.name == "10000" + a.id).Count());
}
class tbiou022
{
[Column(IsIdentity = true)]
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_TwoPrimary()

View File

@ -57,6 +57,93 @@ ON DUPLICATE KEY UPDATE
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndIdentity()
{
fsql.Delete<tbiou022>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbiou022`(`id`, `name`) VALUES(1, '01')
ON DUPLICATE KEY UPDATE
`name` = VALUES(`name`)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbiou022`(`id`, `name`) VALUES(1, '011')
ON DUPLICATE KEY UPDATE
`name` = VALUES(`name`)", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbiou022`(`id`, `name`) VALUES(2, '02')
ON DUPLICATE KEY UPDATE
`name` = VALUES(`name`)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().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(@"INSERT INTO `tbiou022`(`id`, `name`) VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')
ON DUPLICATE KEY UPDATE
`name` = VALUES(`name`)", sql);
Assert.Equal(4, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().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(@"INSERT INTO `tbiou022`(`id`, `name`) VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')
ON DUPLICATE KEY UPDATE
`name` = VALUES(`name`)", sql);
Assert.Equal(8, iou.ExecuteAffrows());
var lst = fsql.Select<tbiou022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "00" + a.id).Count());
//--no primary
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "01" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbiou022`(`name`) VALUES('01')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbiou022`(`name`) VALUES('011')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbiou022`(`name`) VALUES('02')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new[] { new tbiou022 { name = "01" }, new tbiou022 { name = "02" }, new tbiou022 { name = "03" }, new tbiou022 { name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbiou022`(`name`) VALUES('01'), ('02'), ('03'), ('04')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new[] { new tbiou022 { name = "001" }, new tbiou022 { name = "002" }, new tbiou022 { name = "003" }, new tbiou022 { name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbiou022`(`name`) VALUES('001'), ('002'), ('003'), ('004')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
//--no primary and yes
iou = fsql.InsertOrUpdate<tbiou022>().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(@"INSERT INTO `tbiou022`(`id`, `name`) VALUES(1, '100001'), (2, '100002'), (3, '100003'), (4, '100004')
ON DUPLICATE KEY UPDATE
`name` = VALUES(`name`)
;
INSERT INTO `tbiou022`(`name`) VALUES('00001'), ('00002'), ('00003'), ('00004')", sql);
Assert.Equal(12, iou.ExecuteAffrows());
lst = fsql.Select<tbiou022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "10000" + a.id).Count());
}
class tbiou022
{
[Column(IsIdentity = true)]
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_TwoPrimary()

View File

@ -154,6 +154,150 @@ WHEN NOT MATCHED THEN
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndIdentity()
{
fsql.Delete<tbiou022>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOU022"" t1
USING (SELECT 1 as ID, '01' as NAME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOU022"" t1
USING (SELECT 1 as ID, '011' as NAME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOU022"" t1
USING (SELECT 2 as ID, '02' as NAME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou022>().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(@"MERGE INTO ""TBIOU022"" t1
USING (SELECT 1 as ID, '01' as NAME FROM dual
UNION ALL
SELECT 2, '02' FROM dual
UNION ALL
SELECT 3, '03' FROM dual
UNION ALL
SELECT 4, '04' FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou022>().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(@"MERGE INTO ""TBIOU022"" t1
USING (SELECT 1 as ID, '001' as NAME FROM dual
UNION ALL
SELECT 2, '002' FROM dual
UNION ALL
SELECT 3, '003' FROM dual
UNION ALL
SELECT 4, '004' FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
var lst = fsql.Select<tbiou022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
//Assert.Equal(4, lst.Where(a => a.name == "00" + a.id).Count());
//--no primary
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "01" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOU022""(""NAME"") VALUES('01')", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOU022""(""NAME"") VALUES('011')", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOU022""(""NAME"") VALUES('02')", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new[] { new tbiou022 { name = "01" }, new tbiou022 { name = "02" }, new tbiou022 { name = "03" }, new tbiou022 { name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT ALL
INTO ""TBIOU022""(""NAME"") VALUES('01')
INTO ""TBIOU022""(""NAME"") VALUES('02')
INTO ""TBIOU022""(""NAME"") VALUES('03')
INTO ""TBIOU022""(""NAME"") VALUES('04')
SELECT 1 FROM DUAL", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new[] { new tbiou022 { name = "001" }, new tbiou022 { name = "002" }, new tbiou022 { name = "003" }, new tbiou022 { name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT ALL
INTO ""TBIOU022""(""NAME"") VALUES('001')
INTO ""TBIOU022""(""NAME"") VALUES('002')
INTO ""TBIOU022""(""NAME"") VALUES('003')
INTO ""TBIOU022""(""NAME"") VALUES('004')
SELECT 1 FROM DUAL", sql);
iou.ExecuteAffrows();
//--no primary and yes
iou = fsql.InsertOrUpdate<tbiou022>().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(@"MERGE INTO ""TBIOU022"" t1
USING (SELECT 1 as ID, '100001' as NAME FROM dual
UNION ALL
SELECT 2, '100002' FROM dual
UNION ALL
SELECT 3, '100003' FROM dual
UNION ALL
SELECT 4, '100004' FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)
;
INSERT ALL
INTO ""TBIOU022""(""NAME"") VALUES('00001')
INTO ""TBIOU022""(""NAME"") VALUES('00002')
INTO ""TBIOU022""(""NAME"") VALUES('00003')
INTO ""TBIOU022""(""NAME"") VALUES('00004')
SELECT 1 FROM DUAL", sql);
iou.ExecuteAffrows();
lst = fsql.Select<tbiou022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
//Assert.Equal(4, lst.Where(a => a.name == "10000" + a.id).Count());
}
class tbiou022
{
[Column(IsIdentity = true)]
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_TwoPrimary()

View File

@ -95,6 +95,93 @@ ON CONFLICT(""id"") DO UPDATE SET
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndIdentity()
{
fsql.Delete<tbiou022>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbiou022""(""id"", ""name"") VALUES(1, '01')
ON CONFLICT(""id"") DO UPDATE SET
""name"" = EXCLUDED.""name""", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbiou022""(""id"", ""name"") VALUES(1, '011')
ON CONFLICT(""id"") DO UPDATE SET
""name"" = EXCLUDED.""name""", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbiou022""(""id"", ""name"") VALUES(2, '02')
ON CONFLICT(""id"") DO UPDATE SET
""name"" = EXCLUDED.""name""", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().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(@"INSERT INTO ""tbiou022""(""id"", ""name"") VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')
ON CONFLICT(""id"") DO UPDATE SET
""name"" = EXCLUDED.""name""", sql);
Assert.Equal(4, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().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(@"INSERT INTO ""tbiou022""(""id"", ""name"") VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')
ON CONFLICT(""id"") DO UPDATE SET
""name"" = EXCLUDED.""name""", sql);
Assert.Equal(4, iou.ExecuteAffrows());
var lst = fsql.Select<tbiou022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "00" + a.id).Count());
//--no primary
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "01" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbiou022""(""name"") VALUES('01')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbiou022""(""name"") VALUES('011')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbiou022""(""name"") VALUES('02')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new[] { new tbiou022 { name = "01" }, new tbiou022 { name = "02" }, new tbiou022 { name = "03" }, new tbiou022 { name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbiou022""(""name"") VALUES('01'), ('02'), ('03'), ('04')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new[] { new tbiou022 { name = "001" }, new tbiou022 { name = "002" }, new tbiou022 { name = "003" }, new tbiou022 { name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbiou022""(""name"") VALUES('001'), ('002'), ('003'), ('004')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
//--no primary and yes
iou = fsql.InsertOrUpdate<tbiou022>().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(@"INSERT INTO ""tbiou022""(""id"", ""name"") VALUES(1, '100001'), (2, '100002'), (3, '100003'), (4, '100004')
ON CONFLICT(""id"") DO UPDATE SET
""name"" = EXCLUDED.""name""
;
INSERT INTO ""tbiou022""(""name"") VALUES('00001'), ('00002'), ('00003'), ('00004')", sql);
Assert.Equal(8, iou.ExecuteAffrows());
lst = fsql.Select<tbiou022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "10000" + a.id).Count());
}
class tbiou022
{
[Column(IsIdentity = true)]
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_TwoPrimary()

View File

@ -154,6 +154,147 @@ WHEN NOT MATCHED THEN
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndIdentity()
{
fsql.Delete<tbiou022>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"SET IDENTITY_INSERT [tbiou022] ON;
MERGE INTO [tbiou022] t1
USING (SELECT 1 as id, N'01' as name ) t2 ON (t1.[id] = t2.id)
WHEN MATCHED THEN
update set [name] = t2.name
WHEN NOT MATCHED THEN
insert ([id], [name])
values (t2.id, t2.name);;
SET IDENTITY_INSERT [tbiou022] OFF;", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"SET IDENTITY_INSERT [tbiou022] ON;
MERGE INTO [tbiou022] t1
USING (SELECT 1 as id, N'011' as name ) t2 ON (t1.[id] = t2.id)
WHEN MATCHED THEN
update set [name] = t2.name
WHEN NOT MATCHED THEN
insert ([id], [name])
values (t2.id, t2.name);;
SET IDENTITY_INSERT [tbiou022] OFF;", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"SET IDENTITY_INSERT [tbiou022] ON;
MERGE INTO [tbiou022] t1
USING (SELECT 2 as id, N'02' as name ) t2 ON (t1.[id] = t2.id)
WHEN MATCHED THEN
update set [name] = t2.name
WHEN NOT MATCHED THEN
insert ([id], [name])
values (t2.id, t2.name);;
SET IDENTITY_INSERT [tbiou022] OFF;", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().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(@"SET IDENTITY_INSERT [tbiou022] ON;
MERGE INTO [tbiou022] t1
USING (SELECT 1 as id, N'01' as name
UNION ALL
SELECT 2, N'02'
UNION ALL
SELECT 3, N'03'
UNION ALL
SELECT 4, N'04' ) t2 ON (t1.[id] = t2.id)
WHEN MATCHED THEN
update set [name] = t2.name
WHEN NOT MATCHED THEN
insert ([id], [name])
values (t2.id, t2.name);;
SET IDENTITY_INSERT [tbiou022] OFF;", sql);
Assert.Equal(4, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().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(@"SET IDENTITY_INSERT [tbiou022] ON;
MERGE INTO [tbiou022] t1
USING (SELECT 1 as id, N'001' as name
UNION ALL
SELECT 2, N'002'
UNION ALL
SELECT 3, N'003'
UNION ALL
SELECT 4, N'004' ) t2 ON (t1.[id] = t2.id)
WHEN MATCHED THEN
update set [name] = t2.name
WHEN NOT MATCHED THEN
insert ([id], [name])
values (t2.id, t2.name);;
SET IDENTITY_INSERT [tbiou022] OFF;", sql);
Assert.Equal(4, iou.ExecuteAffrows());
var lst = fsql.Select<tbiou022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "00" + a.id).Count());
//--no primary
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "01" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO [tbiou022]([name]) VALUES(N'01')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO [tbiou022]([name]) VALUES(N'011')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO [tbiou022]([name]) VALUES(N'02')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new[] { new tbiou022 { name = "01" }, new tbiou022 { name = "02" }, new tbiou022 { name = "03" }, new tbiou022 { name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO [tbiou022]([name]) VALUES(N'01'), (N'02'), (N'03'), (N'04')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new[] { new tbiou022 { name = "001" }, new tbiou022 { name = "002" }, new tbiou022 { name = "003" }, new tbiou022 { name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO [tbiou022]([name]) VALUES(N'001'), (N'002'), (N'003'), (N'004')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
//--no primary and yes
iou = fsql.InsertOrUpdate<tbiou022>().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(@"SET IDENTITY_INSERT [tbiou022] ON;
MERGE INTO [tbiou022] t1
USING (SELECT 1 as id, N'100001' as name
UNION ALL
SELECT 2, N'100002'
UNION ALL
SELECT 3, N'100003'
UNION ALL
SELECT 4, N'100004' ) t2 ON (t1.[id] = t2.id)
WHEN MATCHED THEN
update set [name] = t2.name
WHEN NOT MATCHED THEN
insert ([id], [name])
values (t2.id, t2.name);;
SET IDENTITY_INSERT [tbiou022] OFF;
;
INSERT INTO [tbiou022]([name]) VALUES(N'00001'), (N'00002'), (N'00003'), (N'00004')", sql);
Assert.Equal(8, iou.ExecuteAffrows());
lst = fsql.Select<tbiou022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "10000" + a.id).Count());
}
class tbiou022
{
[Column(IsIdentity = true)]
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_TwoPrimary()

View File

@ -154,6 +154,150 @@ WHEN NOT MATCHED THEN
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndIdentity()
{
fsql.Delete<tbiou022>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOU022"" t1
USING (SELECT 1 as ID, '01' as NAME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOU022"" t1
USING (SELECT 1 as ID, '011' as NAME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOU022"" t1
USING (SELECT 2 as ID, '02' as NAME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou022>().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(@"MERGE INTO ""TBIOU022"" t1
USING (SELECT 1 as ID, '01' as NAME FROM dual
UNION ALL
SELECT 2, '02' FROM dual
UNION ALL
SELECT 3, '03' FROM dual
UNION ALL
SELECT 4, '04' FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou022>().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(@"MERGE INTO ""TBIOU022"" t1
USING (SELECT 1 as ID, '001' as NAME FROM dual
UNION ALL
SELECT 2, '002' FROM dual
UNION ALL
SELECT 3, '003' FROM dual
UNION ALL
SELECT 4, '004' FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
iou.ExecuteAffrows();
var lst = fsql.Select<tbiou022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
//Assert.Equal(4, lst.Where(a => a.name == "00" + a.id).Count());
//--no primary
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "01" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOU022""(""NAME"") VALUES('01')", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOU022""(""NAME"") VALUES('011')", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOU022""(""NAME"") VALUES('02')", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new[] { new tbiou022 { name = "01" }, new tbiou022 { name = "02" }, new tbiou022 { name = "03" }, new tbiou022 { name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT ALL
INTO ""TBIOU022""(""NAME"") VALUES('01')
INTO ""TBIOU022""(""NAME"") VALUES('02')
INTO ""TBIOU022""(""NAME"") VALUES('03')
INTO ""TBIOU022""(""NAME"") VALUES('04')
SELECT 1 FROM DUAL", sql);
iou.ExecuteAffrows();
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new[] { new tbiou022 { name = "001" }, new tbiou022 { name = "002" }, new tbiou022 { name = "003" }, new tbiou022 { name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT ALL
INTO ""TBIOU022""(""NAME"") VALUES('001')
INTO ""TBIOU022""(""NAME"") VALUES('002')
INTO ""TBIOU022""(""NAME"") VALUES('003')
INTO ""TBIOU022""(""NAME"") VALUES('004')
SELECT 1 FROM DUAL", sql);
iou.ExecuteAffrows();
//--no primary and yes
iou = fsql.InsertOrUpdate<tbiou022>().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(@"MERGE INTO ""TBIOU022"" t1
USING (SELECT 1 as ID, '100001' as NAME FROM dual
UNION ALL
SELECT 2, '100002' FROM dual
UNION ALL
SELECT 3, '100003' FROM dual
UNION ALL
SELECT 4, '100004' FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)
;
INSERT ALL
INTO ""TBIOU022""(""NAME"") VALUES('00001')
INTO ""TBIOU022""(""NAME"") VALUES('00002')
INTO ""TBIOU022""(""NAME"") VALUES('00003')
INTO ""TBIOU022""(""NAME"") VALUES('00004')
SELECT 1 FROM DUAL", sql);
iou.ExecuteAffrows();
lst = fsql.Select<tbiou022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
//Assert.Equal(4, lst.Where(a => a.name == "10000" + a.id).Count());
}
class tbiou022
{
[Column(IsIdentity = true)]
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_TwoPrimary()

View File

@ -57,6 +57,93 @@ ON DUPLICATE KEY UPDATE
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndIdentity()
{
fsql.Delete<tbiou022>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbiou022`(`id`, `name`) VALUES(1, '01')
ON DUPLICATE KEY UPDATE
`name` = VALUES(`name`)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbiou022`(`id`, `name`) VALUES(1, '011')
ON DUPLICATE KEY UPDATE
`name` = VALUES(`name`)", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbiou022`(`id`, `name`) VALUES(2, '02')
ON DUPLICATE KEY UPDATE
`name` = VALUES(`name`)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().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(@"INSERT INTO `tbiou022`(`id`, `name`) VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')
ON DUPLICATE KEY UPDATE
`name` = VALUES(`name`)", sql);
Assert.Equal(5, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().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(@"INSERT INTO `tbiou022`(`id`, `name`) VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')
ON DUPLICATE KEY UPDATE
`name` = VALUES(`name`)", sql);
Assert.Equal(8, iou.ExecuteAffrows());
var lst = fsql.Select<tbiou022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "00" + a.id).Count());
//--no primary
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "01" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbiou022`(`name`) VALUES('01')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbiou022`(`name`) VALUES('011')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbiou022`(`name`) VALUES('02')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new[] { new tbiou022 { name = "01" }, new tbiou022 { name = "02" }, new tbiou022 { name = "03" }, new tbiou022 { name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbiou022`(`name`) VALUES('01'), ('02'), ('03'), ('04')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new[] { new tbiou022 { name = "001" }, new tbiou022 { name = "002" }, new tbiou022 { name = "003" }, new tbiou022 { name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO `tbiou022`(`name`) VALUES('001'), ('002'), ('003'), ('004')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
//--no primary and yes
iou = fsql.InsertOrUpdate<tbiou022>().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(@"INSERT INTO `tbiou022`(`id`, `name`) VALUES(1, '100001'), (2, '100002'), (3, '100003'), (4, '100004')
ON DUPLICATE KEY UPDATE
`name` = VALUES(`name`)
;
INSERT INTO `tbiou022`(`name`) VALUES('00001'), ('00002'), ('00003'), ('00004')", sql);
Assert.Equal(12, iou.ExecuteAffrows());
lst = fsql.Select<tbiou022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "10000" + a.id).Count());
}
class tbiou022
{
[Column(IsIdentity = true)]
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_TwoPrimary()

View File

@ -154,6 +154,150 @@ WHEN NOT MATCHED THEN
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndIdentity()
{
fsql.Delete<tbiou022>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOU022"" t1
USING (SELECT 1 as ID, '01' as NAME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOU022"" t1
USING (SELECT 1 as ID, '011' as NAME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO ""TBIOU022"" t1
USING (SELECT 2 as ID, '02' as NAME FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().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(@"MERGE INTO ""TBIOU022"" t1
USING (SELECT 1 as ID, '01' as NAME FROM dual
UNION ALL
SELECT 2, '02' FROM dual
UNION ALL
SELECT 3, '03' FROM dual
UNION ALL
SELECT 4, '04' FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
Assert.Equal(4, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().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(@"MERGE INTO ""TBIOU022"" t1
USING (SELECT 1 as ID, '001' as NAME FROM dual
UNION ALL
SELECT 2, '002' FROM dual
UNION ALL
SELECT 3, '003' FROM dual
UNION ALL
SELECT 4, '004' FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)", sql);
Assert.Equal(4, iou.ExecuteAffrows());
var lst = fsql.Select<tbiou022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
//Assert.Equal(4, lst.Where(a => a.name == "00" + a.id).Count());
//--no primary
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "01" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOU022""(""NAME"") VALUES('01')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOU022""(""NAME"") VALUES('011')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""TBIOU022""(""NAME"") VALUES('02')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new[] { new tbiou022 { name = "01" }, new tbiou022 { name = "02" }, new tbiou022 { name = "03" }, new tbiou022 { name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT ALL
INTO ""TBIOU022""(""NAME"") VALUES('01')
INTO ""TBIOU022""(""NAME"") VALUES('02')
INTO ""TBIOU022""(""NAME"") VALUES('03')
INTO ""TBIOU022""(""NAME"") VALUES('04')
SELECT 1 FROM DUAL", sql);
Assert.Equal(4, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new[] { new tbiou022 { name = "001" }, new tbiou022 { name = "002" }, new tbiou022 { name = "003" }, new tbiou022 { name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT ALL
INTO ""TBIOU022""(""NAME"") VALUES('001')
INTO ""TBIOU022""(""NAME"") VALUES('002')
INTO ""TBIOU022""(""NAME"") VALUES('003')
INTO ""TBIOU022""(""NAME"") VALUES('004')
SELECT 1 FROM DUAL", sql);
Assert.Equal(4, iou.ExecuteAffrows());
//--no primary and yes
iou = fsql.InsertOrUpdate<tbiou022>().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(@"MERGE INTO ""TBIOU022"" t1
USING (SELECT 1 as ID, '100001' as NAME FROM dual
UNION ALL
SELECT 2, '100002' FROM dual
UNION ALL
SELECT 3, '100003' FROM dual
UNION ALL
SELECT 4, '100004' FROM dual ) t2 ON (t1.""ID"" = t2.ID)
WHEN MATCHED THEN
update set ""NAME"" = t2.NAME
WHEN NOT MATCHED THEN
insert (""ID"", ""NAME"")
values (t2.ID, t2.NAME)
;
INSERT ALL
INTO ""TBIOU022""(""NAME"") VALUES('00001')
INTO ""TBIOU022""(""NAME"") VALUES('00002')
INTO ""TBIOU022""(""NAME"") VALUES('00003')
INTO ""TBIOU022""(""NAME"") VALUES('00004')
SELECT 1 FROM DUAL", sql);
Assert.Equal(8, iou.ExecuteAffrows());
lst = fsql.Select<tbiou022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
//Assert.Equal(4, lst.Where(a => a.name == "10000" + a.id).Count());
}
class tbiou022
{
[Column(IsIdentity = true)]
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_TwoPrimary()

View File

@ -95,6 +95,93 @@ ON CONFLICT(""id"") DO UPDATE SET
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndIdentity()
{
fsql.Delete<tbiou022>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbiou022""(""id"", ""name"") VALUES(1, '01')
ON CONFLICT(""id"") DO UPDATE SET
""name"" = EXCLUDED.""name""", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbiou022""(""id"", ""name"") VALUES(1, '011')
ON CONFLICT(""id"") DO UPDATE SET
""name"" = EXCLUDED.""name""", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbiou022""(""id"", ""name"") VALUES(2, '02')
ON CONFLICT(""id"") DO UPDATE SET
""name"" = EXCLUDED.""name""", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().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(@"INSERT INTO ""tbiou022""(""id"", ""name"") VALUES(1, '01'), (2, '02'), (3, '03'), (4, '04')
ON CONFLICT(""id"") DO UPDATE SET
""name"" = EXCLUDED.""name""", sql);
Assert.Equal(4, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().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(@"INSERT INTO ""tbiou022""(""id"", ""name"") VALUES(1, '001'), (2, '002'), (3, '003'), (4, '004')
ON CONFLICT(""id"") DO UPDATE SET
""name"" = EXCLUDED.""name""", sql);
Assert.Equal(4, iou.ExecuteAffrows());
var lst = fsql.Select<tbiou022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "00" + a.id).Count());
//--no primary
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "01" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbiou022""(""name"") VALUES('01')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbiou022""(""name"") VALUES('011')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbiou022""(""name"") VALUES('02')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new[] { new tbiou022 { name = "01" }, new tbiou022 { name = "02" }, new tbiou022 { name = "03" }, new tbiou022 { name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbiou022""(""name"") VALUES('01'), ('02'), ('03'), ('04')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new[] { new tbiou022 { name = "001" }, new tbiou022 { name = "002" }, new tbiou022 { name = "003" }, new tbiou022 { name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbiou022""(""name"") VALUES('001'), ('002'), ('003'), ('004')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
//--no primary and yes
iou = fsql.InsertOrUpdate<tbiou022>().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(@"INSERT INTO ""tbiou022""(""id"", ""name"") VALUES(1, '100001'), (2, '100002'), (3, '100003'), (4, '100004')
ON CONFLICT(""id"") DO UPDATE SET
""name"" = EXCLUDED.""name""
;
INSERT INTO ""tbiou022""(""name"") VALUES('00001'), ('00002'), ('00003'), ('00004')", sql);
Assert.Equal(8, iou.ExecuteAffrows());
lst = fsql.Select<tbiou022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "10000" + a.id).Count());
}
class tbiou022
{
[Column(IsIdentity = true)]
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_TwoPrimary()

View File

@ -156,6 +156,147 @@ WHEN NOT MATCHED THEN
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndIdentity()
{
fsql.Delete<tbiou022>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"SET IDENTITY_INSERT [tbiou022] ON;
MERGE INTO [tbiou022] t1
USING (SELECT 1 as id, N'01' as name ) t2 ON (t1.[id] = t2.id)
WHEN MATCHED THEN
update set [name] = t2.name
WHEN NOT MATCHED THEN
insert ([id], [name])
values (t2.id, t2.name);;
SET IDENTITY_INSERT [tbiou022] OFF;", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"SET IDENTITY_INSERT [tbiou022] ON;
MERGE INTO [tbiou022] t1
USING (SELECT 1 as id, N'011' as name ) t2 ON (t1.[id] = t2.id)
WHEN MATCHED THEN
update set [name] = t2.name
WHEN NOT MATCHED THEN
insert ([id], [name])
values (t2.id, t2.name);;
SET IDENTITY_INSERT [tbiou022] OFF;", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"SET IDENTITY_INSERT [tbiou022] ON;
MERGE INTO [tbiou022] t1
USING (SELECT 2 as id, N'02' as name ) t2 ON (t1.[id] = t2.id)
WHEN MATCHED THEN
update set [name] = t2.name
WHEN NOT MATCHED THEN
insert ([id], [name])
values (t2.id, t2.name);;
SET IDENTITY_INSERT [tbiou022] OFF;", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().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(@"SET IDENTITY_INSERT [tbiou022] ON;
MERGE INTO [tbiou022] t1
USING (SELECT 1 as id, N'01' as name
UNION ALL
SELECT 2, N'02'
UNION ALL
SELECT 3, N'03'
UNION ALL
SELECT 4, N'04' ) t2 ON (t1.[id] = t2.id)
WHEN MATCHED THEN
update set [name] = t2.name
WHEN NOT MATCHED THEN
insert ([id], [name])
values (t2.id, t2.name);;
SET IDENTITY_INSERT [tbiou022] OFF;", sql);
Assert.Equal(4, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().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(@"SET IDENTITY_INSERT [tbiou022] ON;
MERGE INTO [tbiou022] t1
USING (SELECT 1 as id, N'001' as name
UNION ALL
SELECT 2, N'002'
UNION ALL
SELECT 3, N'003'
UNION ALL
SELECT 4, N'004' ) t2 ON (t1.[id] = t2.id)
WHEN MATCHED THEN
update set [name] = t2.name
WHEN NOT MATCHED THEN
insert ([id], [name])
values (t2.id, t2.name);;
SET IDENTITY_INSERT [tbiou022] OFF;", sql);
Assert.Equal(4, iou.ExecuteAffrows());
var lst = fsql.Select<tbiou022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "00" + a.id).Count());
//--no primary
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "01" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO [tbiou022]([name]) VALUES(N'01')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO [tbiou022]([name]) VALUES(N'011')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO [tbiou022]([name]) VALUES(N'02')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new[] { new tbiou022 { name = "01" }, new tbiou022 { name = "02" }, new tbiou022 { name = "03" }, new tbiou022 { name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO [tbiou022]([name]) VALUES(N'01'), (N'02'), (N'03'), (N'04')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new[] { new tbiou022 { name = "001" }, new tbiou022 { name = "002" }, new tbiou022 { name = "003" }, new tbiou022 { name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO [tbiou022]([name]) VALUES(N'001'), (N'002'), (N'003'), (N'004')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
//--no primary and yes
iou = fsql.InsertOrUpdate<tbiou022>().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(@"SET IDENTITY_INSERT [tbiou022] ON;
MERGE INTO [tbiou022] t1
USING (SELECT 1 as id, N'100001' as name
UNION ALL
SELECT 2, N'100002'
UNION ALL
SELECT 3, N'100003'
UNION ALL
SELECT 4, N'100004' ) t2 ON (t1.[id] = t2.id)
WHEN MATCHED THEN
update set [name] = t2.name
WHEN NOT MATCHED THEN
insert ([id], [name])
values (t2.id, t2.name);;
SET IDENTITY_INSERT [tbiou022] OFF;
;
INSERT INTO [tbiou022]([name]) VALUES(N'00001'), (N'00002'), (N'00003'), (N'00004')", sql);
Assert.Equal(8, iou.ExecuteAffrows());
lst = fsql.Select<tbiou022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "10000" + a.id).Count());
}
class tbiou022
{
[Column(IsIdentity = true)]
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_TwoPrimary()

View File

@ -81,6 +81,82 @@ namespace FreeSql.Tests.Sqlite
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndIdentity()
{
fsql.Delete<tbiou022>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(1, '01')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(1, '011')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"REPLACE INTO ""tbiou022""(""id"", ""name"") VALUES(2, '02')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().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(4, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().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(4, iou.ExecuteAffrows());
var lst = fsql.Select<tbiou022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "00" + a.id).Count());
//--no primary
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "01" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbiou022""(""name"") VALUES('01')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbiou022""(""name"") VALUES('011')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new tbiou022 { name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbiou022""(""name"") VALUES('02')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new[] { new tbiou022 { name = "01" }, new tbiou022 { name = "02" }, new tbiou022 { name = "03" }, new tbiou022 { name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbiou022""(""name"") VALUES('01'), ('02'), ('03'), ('04')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou022>().SetSource(new[] { new tbiou022 { name = "001" }, new tbiou022 { name = "002" }, new tbiou022 { name = "003" }, new tbiou022 { name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO ""tbiou022""(""name"") VALUES('001'), ('002'), ('003'), ('004')", sql);
Assert.Equal(4, iou.ExecuteAffrows());
//--no primary and yes
iou = fsql.InsertOrUpdate<tbiou022>().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')
;
INSERT INTO ""tbiou022""(""name"") VALUES('00001'), ('00002'), ('00003'), ('00004')", sql);
Assert.Equal(8, iou.ExecuteAffrows());
lst = fsql.Select<tbiou022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "10000" + a.id).Count());
}
class tbiou022
{
[Column(IsIdentity = true)]
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_TwoPrimary()
{