suppourt ndty orm

This commit is contained in:
gbase_contributors
2021-12-15 14:48:26 +08:00
parent 563f695d09
commit fdcb76eaa2
53 changed files with 12244 additions and 187 deletions

View File

@ -0,0 +1,128 @@
using FreeSql.DataAnnotations;
using IBM.Data.Informix;
using System;
using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.GBase
{
public class GBaseDeleteTest
{
IDelete<Topic> delete => g.gbase.Delete<Topic>();
[Table(Name = "tb_topic_del")]
class Topic
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int Clicks { get; set; }
public string Title { get; set; }
public DateTime CreateTime { get; set; }
}
[Fact]
public void Dywhere()
{
Assert.Null(g.gbase.Delete<Topic>().ToSql());
var sql = g.gbase.Delete<Topic>(new[] { 1, 2 }).ToSql();
Assert.Equal("DELETE FROM tb_topic_del WHERE (Id IN (1,2))", sql);
sql = g.gbase.Delete<Topic>(new Topic { Id = 1, Title = "test" }).ToSql();
Assert.Equal("DELETE FROM tb_topic_del WHERE (Id = 1)", sql);
sql = g.gbase.Delete<Topic>(new[] { new Topic { Id = 1, Title = "test" }, new Topic { Id = 2, Title = "test" } }).ToSql();
Assert.Equal("DELETE FROM tb_topic_del WHERE (Id IN (1,2))", sql);
sql = g.gbase.Delete<Topic>(new { id = 1 }).ToSql();
Assert.Equal("DELETE FROM tb_topic_del WHERE (Id = 1)", sql);
sql = g.gbase.Delete<MultiPkTopic>(new[] { new { Id1 = 1, Id2 = 10 }, new { Id1 = 2, Id2 = 20 } }).ToSql();
Assert.Equal("DELETE FROM MultiPkTopic WHERE (Id1 = 1 AND Id2 = 10 OR Id1 = 2 AND Id2 = 20)", sql);
}
class MultiPkTopic
{
[Column(IsPrimary = true)]
public int Id1 { get; set; }
[Column(IsPrimary = true)]
public int Id2 { get; set; }
public int Clicks { get; set; }
public string Title { get; set; }
public DateTime CreateTime { get; set; }
}
[Fact]
public void Where()
{
var sql = delete.Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
Assert.Equal("DELETE FROM tb_topic_del WHERE (Id = 1)", sql);
sql = delete.Where("id = @id", new { id = 1 }).ToSql().Replace("\r\n", "");
Assert.Equal("DELETE FROM tb_topic_del WHERE (id = @id)", sql);
var item = new Topic { Id = 1, Title = "newtitle" };
sql = delete.Where(item).ToSql().Replace("\r\n", "");
Assert.Equal("DELETE FROM tb_topic_del WHERE (Id = 1)", sql);
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
sql = delete.Where(items).ToSql().Replace("\r\n", "");
Assert.Equal("DELETE FROM tb_topic_del WHERE (Id IN (1,2,3,4,5,6,7,8,9,10))", sql);
}
[Fact]
public void ExecuteAffrows()
{
var id = g.gbase.Insert<Topic>(new Topic { Title = "xxxx" }).ExecuteIdentity();
Assert.Equal(1, delete.Where(a => a.Id == id).ExecuteAffrows());
}
[Fact]
public void ExecuteDeleted()
{
Assert.Throws<NotImplementedException>(() => delete.Where(a => a.Id > 0).ExecuteDeleted());
}
[Fact]
public void AsTable()
{
//var connectionBuilder = new IfxConnectionStringBuilder
//{
// Host = "192.168.164.134",
// Service = "9088",
// Server = "gbase01",
// Database = "testdb",
// UID = "gbasedbt",
// Pwd = "GBase123",
// DbLocale = "zh_CN.utf8",
// ClientLocale = "zh_CN.utf8",
// PersistSecurityInfo = true
//};
//using (IfxConnection conn = new IfxConnection(connectionBuilder.ConnectionString))
//{
// conn.Open();
// var cmd = conn.CreateCommand();
// cmd.CommandText = "select 1 from dual";
// var val = cmd.ExecuteScalar();
// conn.Close();
//}
Assert.Null(g.gbase.Delete<Topic>().ToSql());
var sql = g.gbase.Delete<Topic>(new[] { 1, 2 }).AsTable(a => "TopicAsTable").ToSql();
Assert.Equal("DELETE FROM TopicAsTable WHERE (Id IN (1,2))", sql);
sql = g.gbase.Delete<Topic>(new Topic { Id = 1, Title = "test" }).AsTable(a => "TopicAsTable").ToSql();
Assert.Equal("DELETE FROM TopicAsTable WHERE (Id = 1)", sql);
sql = g.gbase.Delete<Topic>(new[] { new Topic { Id = 1, Title = "test" }, new Topic { Id = 2, Title = "test" } }).AsTable(a => "TopicAsTable").ToSql();
Assert.Equal("DELETE FROM TopicAsTable WHERE (Id IN (1,2))", sql);
sql = g.gbase.Delete<Topic>(new { id = 1 }).AsTable(a => "TopicAsTable").ToSql();
Assert.Equal("DELETE FROM TopicAsTable WHERE (Id = 1)", sql);
}
}
}

View File

@ -0,0 +1,437 @@
using FreeSql.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.GBase
{
public class GBaseInsertOrUpdateIfExistsDoNothingTest
{
IFreeSql fsql => g.gbase;
[Fact]
public void InsertOrUpdate_OnlyPrimary()
{
fsql.Delete<tbioudb01>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb01>().IfExistsDoNothing().SetSource(new tbioudb01 { id = 1 });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbioudb01 t1
USING (SELECT 1 as id FROM dual ) t2 ON (t1.id = t2.id)
WHEN NOT MATCHED THEN
insert (id)
values (t2.id)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb01>().IfExistsDoNothing().SetSource(new tbioudb01 { id = 1 });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbioudb01 t1
USING (SELECT 1 as id FROM dual ) t2 ON (t1.id = t2.id)
WHEN NOT MATCHED THEN
insert (id)
values (t2.id)", sql);
Assert.Equal(0, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb01>().IfExistsDoNothing().SetSource(new tbioudb01 { id = 2 });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbioudb01 t1
USING (SELECT 2 as id FROM dual ) t2 ON (t1.id = t2.id)
WHEN NOT MATCHED THEN
insert (id)
values (t2.id)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb01>().IfExistsDoNothing().SetSource(new[] { new tbioudb01 { id = 1 }, new tbioudb01 { id = 2 }, new tbioudb01 { id = 3 }, new tbioudb01 { id = 4 } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbioudb01 t1
USING (SELECT 1 as id FROM dual
UNION ALL
SELECT 2 FROM dual
UNION ALL
SELECT 3 FROM dual
UNION ALL
SELECT 4 FROM dual ) t2 ON (t1.id = t2.id)
WHEN NOT MATCHED THEN
insert (id)
values (t2.id)", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb01>().IfExistsDoNothing().SetSource(new[] { new tbioudb01 { id = 1 }, new tbioudb01 { id = 2 }, new tbioudb01 { id = 3 }, new tbioudb01 { id = 4 } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbioudb01 t1
USING (SELECT 1 as id FROM dual
UNION ALL
SELECT 2 FROM dual
UNION ALL
SELECT 3 FROM dual
UNION ALL
SELECT 4 FROM dual ) t2 ON (t1.id = t2.id)
WHEN NOT MATCHED THEN
insert (id)
values (t2.id)", sql);
Assert.Equal(0, iou.ExecuteAffrows());
}
class tbioudb01
{
public int id { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimary()
{
fsql.Delete<tbioudb02>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbioudb02 t1
USING (SELECT 1 as id, '01' as name FROM dual ) t2 ON (t1.id = t2.id)
WHEN NOT MATCHED THEN
insert (id, name)
values (t2.id, t2.name)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbioudb02 t1
USING (SELECT 1 as id, '011' as name FROM dual ) t2 ON (t1.id = t2.id)
WHEN NOT MATCHED THEN
insert (id, name)
values (t2.id, t2.name)", sql);
Assert.Equal(0, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb02>().IfExistsDoNothing().SetSource(new tbioudb02 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbioudb02 t1
USING (SELECT 2 as id, '02' as name FROM dual ) t2 ON (t1.id = t2.id)
WHEN NOT MATCHED THEN
insert (id, name)
values (t2.id, t2.name)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb02>().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(@"MERGE INTO tbioudb02 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 NOT MATCHED THEN
insert (id, name)
values (t2.id, t2.name)", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb02>().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(@"MERGE INTO tbioudb02 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 NOT MATCHED THEN
insert (id, name)
values (t2.id, t2.name)", sql);
Assert.Equal(0, iou.ExecuteAffrows());
var lst = fsql.Select<tbioudb02>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count());
}
class tbioudb02
{
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndIdentity()
{
fsql.Delete<tbioudb022>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbioudb022 t1
USING (SELECT 1 as id, '01' as name FROM dual ) t2 ON (t1.id = t2.id)
WHEN NOT MATCHED THEN
insert (id, name)
values (t2.id, t2.name)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbioudb022 t1
USING (SELECT 1 as id, '011' as name FROM dual ) t2 ON (t1.id = t2.id)
WHEN NOT MATCHED THEN
insert (id, name)
values (t2.id, t2.name)", sql);
Assert.Equal(0, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbioudb022 t1
USING (SELECT 2 as id, '02' as name FROM dual ) t2 ON (t1.id = t2.id)
WHEN NOT MATCHED THEN
insert (id, name)
values (t2.id, t2.name)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().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(@"MERGE INTO tbioudb022 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 NOT MATCHED THEN
insert (id, name)
values (t2.id, t2.name)", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().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(@"MERGE INTO tbioudb022 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 NOT MATCHED THEN
insert (id, name)
values (t2.id, t2.name)", sql);
Assert.Equal(0, iou.ExecuteAffrows());
var lst = fsql.Select<tbioudb022>().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<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { name = "01" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO tbioudb022(name) VALUES('01')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { name = "011" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO tbioudb022(name) VALUES('011')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new tbioudb022 { name = "02" });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO tbioudb022(name) VALUES('02')", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { name = "01" }, new tbioudb022 { name = "02" }, new tbioudb022 { name = "03" }, new tbioudb022 { name = "04" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO tbioudb022(name)
SELECT * FROM (
SELECT '01' FROM dual
UNION ALL
SELECT '02' FROM dual
UNION ALL
SELECT '03' FROM dual
UNION ALL
SELECT '04' FROM dual
) ftbtmp", sql);
Assert.Equal(4, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb022>().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { name = "001" }, new tbioudb022 { name = "002" }, new tbioudb022 { name = "003" }, new tbioudb022 { name = "004" } });
sql = iou.ToSql();
Assert.Equal(@"INSERT INTO tbioudb022(name)
SELECT * FROM (
SELECT '001' FROM dual
UNION ALL
SELECT '002' FROM dual
UNION ALL
SELECT '003' FROM dual
UNION ALL
SELECT '004' FROM dual
) ftbtmp", sql);
Assert.Equal(4, iou.ExecuteAffrows());
//--no primary and yes
iou = fsql.InsertOrUpdate<tbioudb022>().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(@"MERGE INTO tbioudb022 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 NOT MATCHED THEN
insert (id, name)
values (t2.id, t2.name)
;
INSERT INTO tbioudb022(name)
SELECT * FROM (
SELECT '00001' FROM dual
UNION ALL
SELECT '00002' FROM dual
UNION ALL
SELECT '00003' FROM dual
UNION ALL
SELECT '00004' FROM dual
) ftbtmp", sql);
Assert.Equal(4, iou.ExecuteAffrows());
lst = fsql.Select<tbioudb022>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
//Assert.Equal(4, lst.Where(a => a.name == "10000" + a.id).Count());
}
class tbioudb022
{
[Column(IsIdentity = true)]
public int id { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_TwoPrimary()
{
fsql.Delete<tbioudb03>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbioudb03 t1
USING (SELECT 1 as id1, '01' as id2, '01' as name FROM dual ) t2 ON (t1.id1 = t2.id1 AND t1.id2 = t2.id2)
WHEN NOT MATCHED THEN
insert (id1, id2, name)
values (t2.id1, t2.id2, t2.name)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "011" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbioudb03 t1
USING (SELECT 1 as id1, '01' as id2, '011' as name FROM dual ) t2 ON (t1.id1 = t2.id1 AND t1.id2 = t2.id2)
WHEN NOT MATCHED THEN
insert (id1, id2, name)
values (t2.id1, t2.id2, t2.name)", sql);
Assert.Equal(0, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb03>().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 2, id2 = "02", name = "02" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbioudb03 t1
USING (SELECT 2 as id1, '02' as id2, '02' as name FROM dual ) t2 ON (t1.id1 = t2.id1 AND t1.id2 = t2.id2)
WHEN NOT MATCHED THEN
insert (id1, id2, name)
values (t2.id1, t2.id2, t2.name)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb03>().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(@"MERGE INTO tbioudb03 t1
USING (SELECT 1 as id1, '01' as id2, '01' as name FROM dual
UNION ALL
SELECT 2, '02', '02' FROM dual
UNION ALL
SELECT 3, '03', '03' FROM dual
UNION ALL
SELECT 4, '04', '04' FROM dual ) t2 ON (t1.id1 = t2.id1 AND t1.id2 = t2.id2)
WHEN NOT MATCHED THEN
insert (id1, id2, name)
values (t2.id1, t2.id2, t2.name)", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb03>().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(@"MERGE INTO tbioudb03 t1
USING (SELECT 1 as id1, '01' as id2, '001' as name FROM dual
UNION ALL
SELECT 2, '02', '002' FROM dual
UNION ALL
SELECT 3, '03', '003' FROM dual
UNION ALL
SELECT 4, '04', '004' FROM dual ) t2 ON (t1.id1 = t2.id1 AND t1.id2 = t2.id2)
WHEN NOT MATCHED THEN
insert (id1, id2, name)
values (t2.id1, t2.id2, t2.name)", sql);
Assert.Equal(0, iou.ExecuteAffrows());
var lst = fsql.Select<tbioudb03>().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());
}
class tbioudb03
{
[Column(IsPrimary = true)]
public int id1 { get; set; }
[Column(IsPrimary = true)]
public string id2 { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndVersionAndCanUpdate()
{
fsql.Delete<tbioudb04>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbioudb04 t1
USING (SELECT 1 as id, '01' as name, 0 as version, current as CreateTime FROM dual ) t2 ON (t1.id = t2.id)
WHEN NOT MATCHED THEN
insert (id, name, version, CreateTime)
values (t2.id, t2.name, t2.version, t2.CreateTime)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbioudb04 t1
USING (SELECT 1 as id, '011' as name, 0 as version, current as CreateTime FROM dual ) t2 ON (t1.id = t2.id)
WHEN NOT MATCHED THEN
insert (id, name, version, CreateTime)
values (t2.id, t2.name, t2.version, t2.CreateTime)", sql);
Assert.Equal(0, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb04>().IfExistsDoNothing().SetSource(new tbioudb04 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbioudb04 t1
USING (SELECT 2 as id, '02' as name, 0 as version, current as CreateTime FROM dual ) t2 ON (t1.id = t2.id)
WHEN NOT MATCHED THEN
insert (id, name, version, CreateTime)
values (t2.id, t2.name, t2.version, t2.CreateTime)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb04>().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(@"MERGE INTO tbioudb04 t1
USING (SELECT 1 as id, '01' as name, 0 as version, current as CreateTime FROM dual
UNION ALL
SELECT 2, '02', 0, current FROM dual
UNION ALL
SELECT 3, '03', 0, current FROM dual
UNION ALL
SELECT 4, '04', 0, current FROM dual ) t2 ON (t1.id = t2.id)
WHEN NOT MATCHED THEN
insert (id, name, version, CreateTime)
values (t2.id, t2.name, t2.version, t2.CreateTime)", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbioudb04>().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(@"MERGE INTO tbioudb04 t1
USING (SELECT 1 as id, '001' as name, 0 as version, current as CreateTime FROM dual
UNION ALL
SELECT 2, '002', 0, current FROM dual
UNION ALL
SELECT 3, '003', 0, current FROM dual
UNION ALL
SELECT 4, '004', 0, current FROM dual ) t2 ON (t1.id = t2.id)
WHEN NOT MATCHED THEN
insert (id, name, version, CreateTime)
values (t2.id, t2.name, t2.version, t2.CreateTime)", sql);
Assert.Equal(0, iou.ExecuteAffrows());
var lst = fsql.Select<tbioudb04>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "0" + a.id).Count());
}
class tbioudb04
{
public int id { get; set; }
public string name { get; set; }
[Column(IsVersion = true)]
public int version { get; set; }
[Column(CanUpdate = false, ServerTime = DateTimeKind.Local)]
public DateTime CreateTime { get; set; }
}
}
}

View File

@ -0,0 +1,479 @@
using FreeSql.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.GBase
{
public class GBaseInsertOrUpdateTest
{
IFreeSql fsql => g.gbase;
[Fact]
public void InsertOrUpdate_OnlyPrimary()
{
fsql.Delete<tbiou01>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbiou01>().SetSource(new tbiou01 { id = 1 });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbiou01 t1
USING (SELECT 1 as id FROM dual ) t2 ON (t1.id = t2.id)
WHEN NOT MATCHED THEN
insert (id)
values (t2.id)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou01>().SetSource(new tbiou01 { id = 1 });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbiou01 t1
USING (SELECT 1 as id FROM dual ) t2 ON (t1.id = t2.id)
WHEN NOT MATCHED THEN
insert (id)
values (t2.id)", sql);
Assert.Equal(0, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou01>().SetSource(new tbiou01 { id = 2 });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbiou01 t1
USING (SELECT 2 as id FROM dual ) t2 ON (t1.id = t2.id)
WHEN NOT MATCHED THEN
insert (id)
values (t2.id)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou01>().SetSource(new[] { new tbiou01 { id = 1 }, new tbiou01 { id = 2 }, new tbiou01 { id = 3 }, new tbiou01 { id = 4 } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbiou01 t1
USING (SELECT 1 as id FROM dual
UNION ALL
SELECT 2 FROM dual
UNION ALL
SELECT 3 FROM dual
UNION ALL
SELECT 4 FROM dual ) t2 ON (t1.id = t2.id)
WHEN NOT MATCHED THEN
insert (id)
values (t2.id)", sql);
Assert.Equal(2, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou01>().SetSource(new[] { new tbiou01 { id = 1 }, new tbiou01 { id = 2 }, new tbiou01 { id = 3 }, new tbiou01 { id = 4 } });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbiou01 t1
USING (SELECT 1 as id FROM dual
UNION ALL
SELECT 2 FROM dual
UNION ALL
SELECT 3 FROM dual
UNION ALL
SELECT 4 FROM dual ) t2 ON (t1.id = t2.id)
WHEN NOT MATCHED THEN
insert (id)
values (t2.id)", sql);
Assert.Equal(0, iou.ExecuteAffrows());
}
class tbiou01
{
public int id { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimary()
{
fsql.Delete<tbiou02>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbiou02>().SetSource(new tbiou02 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbiou02 t1
USING (SELECT 1 as id, '01' as name FROM dual ) t2 ON (t1.id = t2.id)
WHEN MATCHED THEN
update set t1.name = t2.name
WHEN NOT MATCHED THEN
insert (id, name)
values (t2.id, t2.name)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou02>().SetSource(new tbiou02 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbiou02 t1
USING (SELECT 1 as id, '011' as name FROM dual ) t2 ON (t1.id = t2.id)
WHEN MATCHED THEN
update set t1.name = t2.name
WHEN NOT MATCHED THEN
insert (id, name)
values (t2.id, t2.name)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou02>().SetSource(new tbiou02 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbiou02 t1
USING (SELECT 2 as id, '02' as name FROM dual ) t2 ON (t1.id = t2.id)
WHEN MATCHED THEN
update set t1.name = t2.name
WHEN NOT MATCHED THEN
insert (id, name)
values (t2.id, t2.name)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou02>().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(@"MERGE INTO tbiou02 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 t1.name = t2.name
WHEN NOT MATCHED THEN
insert (id, name)
values (t2.id, t2.name)", sql);
Assert.Equal(4, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou02>().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(@"MERGE INTO tbiou02 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 t1.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<tbiou02>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "00" + a.id).Count());
}
class tbiou02
{
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 t1.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 t1.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 t1.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 t1.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 t1.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 INTO tbiou022(name)
SELECT * FROM (
SELECT '01' FROM dual
UNION ALL
SELECT '02' FROM dual
UNION ALL
SELECT '03' FROM dual
UNION ALL
SELECT '04' FROM dual
) ftbtmp", 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)
SELECT * FROM (
SELECT '001' FROM dual
UNION ALL
SELECT '002' FROM dual
UNION ALL
SELECT '003' FROM dual
UNION ALL
SELECT '004' FROM dual
) ftbtmp", 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 t1.name = t2.name
WHEN NOT MATCHED THEN
insert (id, name)
values (t2.id, t2.name)
;
INSERT INTO tbiou022(name)
SELECT * FROM (
SELECT '00001' FROM dual
UNION ALL
SELECT '00002' FROM dual
UNION ALL
SELECT '00003' FROM dual
UNION ALL
SELECT '00004' FROM dual
) ftbtmp", 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()
{
fsql.Delete<tbiou03>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbiou03>().SetSource(new tbiou03 { id1 = 1, id2 = "01", name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbiou03 t1
USING (SELECT 1 as id1, '01' as id2, '01' as name FROM dual ) t2 ON (t1.id1 = t2.id1 AND t1.id2 = t2.id2)
WHEN MATCHED THEN
update set t1.name = t2.name
WHEN NOT MATCHED THEN
insert (id1, id2, name)
values (t2.id1, t2.id2, t2.name)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou03>().SetSource(new tbiou03 { id1 = 1, id2 = "01", name = "011" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbiou03 t1
USING (SELECT 1 as id1, '01' as id2, '011' as name FROM dual ) t2 ON (t1.id1 = t2.id1 AND t1.id2 = t2.id2)
WHEN MATCHED THEN
update set t1.name = t2.name
WHEN NOT MATCHED THEN
insert (id1, id2, name)
values (t2.id1, t2.id2, t2.name)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou03>().SetSource(new tbiou03 { id1 = 2, id2 = "02", name = "02" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbiou03 t1
USING (SELECT 2 as id1, '02' as id2, '02' as name FROM dual ) t2 ON (t1.id1 = t2.id1 AND t1.id2 = t2.id2)
WHEN MATCHED THEN
update set t1.name = t2.name
WHEN NOT MATCHED THEN
insert (id1, id2, name)
values (t2.id1, t2.id2, t2.name)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou03>().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(@"MERGE INTO tbiou03 t1
USING (SELECT 1 as id1, '01' as id2, '01' as name FROM dual
UNION ALL
SELECT 2, '02', '02' FROM dual
UNION ALL
SELECT 3, '03', '03' FROM dual
UNION ALL
SELECT 4, '04', '04' FROM dual ) t2 ON (t1.id1 = t2.id1 AND t1.id2 = t2.id2)
WHEN MATCHED THEN
update set t1.name = t2.name
WHEN NOT MATCHED THEN
insert (id1, id2, name)
values (t2.id1, t2.id2, t2.name)", sql);
Assert.Equal(4, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou03>().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(@"MERGE INTO tbiou03 t1
USING (SELECT 1 as id1, '01' as id2, '001' as name FROM dual
UNION ALL
SELECT 2, '02', '002' FROM dual
UNION ALL
SELECT 3, '03', '003' FROM dual
UNION ALL
SELECT 4, '04', '004' FROM dual ) t2 ON (t1.id1 = t2.id1 AND t1.id2 = t2.id2)
WHEN MATCHED THEN
update set t1.name = t2.name
WHEN NOT MATCHED THEN
insert (id1, id2, name)
values (t2.id1, t2.id2, t2.name)", sql);
Assert.Equal(4, iou.ExecuteAffrows());
var lst = fsql.Select<tbiou03>().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());
}
class tbiou03
{
[Column(IsPrimary = true)]
public int id1 { get; set; }
[Column(IsPrimary = true)]
public string id2 { get; set; }
public string name { get; set; }
}
[Fact]
public void InsertOrUpdate_OnePrimaryAndVersionAndCanUpdate()
{
fsql.Delete<tbiou04>().Where("1=1").ExecuteAffrows();
var iou = fsql.InsertOrUpdate<tbiou04>().SetSource(new tbiou04 { id = 1, name = "01" });
var sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbiou04 t1
USING (SELECT 1 as id, '01' as name, 0 as version, current as CreateTime FROM dual ) t2 ON (t1.id = t2.id)
WHEN MATCHED THEN
update set t1.name = t2.name, t1.version = t1.version + 1
WHEN NOT MATCHED THEN
insert (id, name, version, CreateTime)
values (t2.id, t2.name, t2.version, t2.CreateTime)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou04>().SetSource(new tbiou04 { id = 1, name = "011" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbiou04 t1
USING (SELECT 1 as id, '011' as name, 0 as version, current as CreateTime FROM dual ) t2 ON (t1.id = t2.id)
WHEN MATCHED THEN
update set t1.name = t2.name, t1.version = t1.version + 1
WHEN NOT MATCHED THEN
insert (id, name, version, CreateTime)
values (t2.id, t2.name, t2.version, t2.CreateTime)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou04>().SetSource(new tbiou04 { id = 2, name = "02" });
sql = iou.ToSql();
Assert.Equal(@"MERGE INTO tbiou04 t1
USING (SELECT 2 as id, '02' as name, 0 as version, current as CreateTime FROM dual ) t2 ON (t1.id = t2.id)
WHEN MATCHED THEN
update set t1.name = t2.name, t1.version = t1.version + 1
WHEN NOT MATCHED THEN
insert (id, name, version, CreateTime)
values (t2.id, t2.name, t2.version, t2.CreateTime)", sql);
Assert.Equal(1, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou04>().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(@"MERGE INTO tbiou04 t1
USING (SELECT 1 as id, '01' as name, 0 as version, current as CreateTime FROM dual
UNION ALL
SELECT 2, '02', 0, current FROM dual
UNION ALL
SELECT 3, '03', 0, current FROM dual
UNION ALL
SELECT 4, '04', 0, current FROM dual ) t2 ON (t1.id = t2.id)
WHEN MATCHED THEN
update set t1.name = t2.name, t1.version = t1.version + 1
WHEN NOT MATCHED THEN
insert (id, name, version, CreateTime)
values (t2.id, t2.name, t2.version, t2.CreateTime)", sql);
Assert.Equal(4, iou.ExecuteAffrows());
iou = fsql.InsertOrUpdate<tbiou04>().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(@"MERGE INTO tbiou04 t1
USING (SELECT 1 as id, '001' as name, 0 as version, current as CreateTime FROM dual
UNION ALL
SELECT 2, '002', 0, current FROM dual
UNION ALL
SELECT 3, '003', 0, current FROM dual
UNION ALL
SELECT 4, '004', 0, current FROM dual ) t2 ON (t1.id = t2.id)
WHEN MATCHED THEN
update set t1.name = t2.name, t1.version = t1.version + 1
WHEN NOT MATCHED THEN
insert (id, name, version, CreateTime)
values (t2.id, t2.name, t2.version, t2.CreateTime)", sql);
Assert.Equal(4, iou.ExecuteAffrows());
var lst = fsql.Select<tbiou04>().Where(a => new[] { 1, 2, 3, 4 }.Contains(a.id)).ToList();
Assert.Equal(4, lst.Where(a => a.name == "00" + a.id).Count());
}
class tbiou04
{
public int id { get; set; }
public string name { get; set; }
[Column(IsVersion = true)]
public int version { get; set; }
[Column(CanUpdate = false, ServerTime = DateTimeKind.Local)]
public DateTime CreateTime { get; set; }
}
}
}

View File

@ -0,0 +1,439 @@
using FreeSql.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.GBase
{
public class GBaseInsertTest
{
IInsert<Topic> insert => g.gbase.Insert<Topic>();
[Table(Name = "TB_TOPIC_INSERT")]
class Topic
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int Clicks { get; set; }
public string Title { get; set; }
public DateTime CreateTime { get; set; }
}
[Fact]
public void AppendData()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
var sql = insert.AppendData(items.First()).ToSql();
Assert.Equal("INSERT INTO TB_TOPIC_INSERT(Clicks, Title, CreateTime) VALUES(0, 'newtitle0', '0001-01-01 00:00:00.000')", sql);
sql = insert.AppendData(items).ToSql();
Assert.Equal(@"INSERT INTO TB_TOPIC_INSERT(Clicks, Title, CreateTime)
SELECT * FROM (
SELECT 0, 'newtitle0', '0001-01-01 00:00:00.000' FROM dual
UNION ALL
SELECT 100, 'newtitle1', '0001-01-01 00:00:00.000' FROM dual
UNION ALL
SELECT 200, 'newtitle2', '0001-01-01 00:00:00.000' FROM dual
UNION ALL
SELECT 300, 'newtitle3', '0001-01-01 00:00:00.000' FROM dual
UNION ALL
SELECT 400, 'newtitle4', '0001-01-01 00:00:00.000' FROM dual
UNION ALL
SELECT 500, 'newtitle5', '0001-01-01 00:00:00.000' FROM dual
UNION ALL
SELECT 600, 'newtitle6', '0001-01-01 00:00:00.000' FROM dual
UNION ALL
SELECT 700, 'newtitle7', '0001-01-01 00:00:00.000' FROM dual
UNION ALL
SELECT 800, 'newtitle8', '0001-01-01 00:00:00.000' FROM dual
UNION ALL
SELECT 900, 'newtitle9', '0001-01-01 00:00:00.000' FROM dual
) ftbtmp", sql);
sql = insert.AppendData(items).InsertColumns(a => a.Title).ToSql();
Assert.Equal(@"INSERT INTO TB_TOPIC_INSERT(Title)
SELECT * FROM (
SELECT 'newtitle0' FROM dual
UNION ALL
SELECT 'newtitle1' FROM dual
UNION ALL
SELECT 'newtitle2' FROM dual
UNION ALL
SELECT 'newtitle3' FROM dual
UNION ALL
SELECT 'newtitle4' FROM dual
UNION ALL
SELECT 'newtitle5' FROM dual
UNION ALL
SELECT 'newtitle6' FROM dual
UNION ALL
SELECT 'newtitle7' FROM dual
UNION ALL
SELECT 'newtitle8' FROM dual
UNION ALL
SELECT 'newtitle9' FROM dual
) ftbtmp", sql);
sql = insert.AppendData(items).IgnoreColumns(a => a.CreateTime).ToSql();
Assert.Equal(@"INSERT INTO TB_TOPIC_INSERT(Clicks, Title)
SELECT * FROM (
SELECT 0, 'newtitle0' FROM dual
UNION ALL
SELECT 100, 'newtitle1' FROM dual
UNION ALL
SELECT 200, 'newtitle2' FROM dual
UNION ALL
SELECT 300, 'newtitle3' FROM dual
UNION ALL
SELECT 400, 'newtitle4' FROM dual
UNION ALL
SELECT 500, 'newtitle5' FROM dual
UNION ALL
SELECT 600, 'newtitle6' FROM dual
UNION ALL
SELECT 700, 'newtitle7' FROM dual
UNION ALL
SELECT 800, 'newtitle8' FROM dual
UNION ALL
SELECT 900, 'newtitle9' FROM dual
) ftbtmp", sql);
}
[Fact]
public void InsertColumns()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
var sql = insert.AppendData(items).InsertColumns(a => a.Title).ToSql();
Assert.Equal(@"INSERT INTO TB_TOPIC_INSERT(Title)
SELECT * FROM (
SELECT 'newtitle0' FROM dual
UNION ALL
SELECT 'newtitle1' FROM dual
UNION ALL
SELECT 'newtitle2' FROM dual
UNION ALL
SELECT 'newtitle3' FROM dual
UNION ALL
SELECT 'newtitle4' FROM dual
UNION ALL
SELECT 'newtitle5' FROM dual
UNION ALL
SELECT 'newtitle6' FROM dual
UNION ALL
SELECT 'newtitle7' FROM dual
UNION ALL
SELECT 'newtitle8' FROM dual
UNION ALL
SELECT 'newtitle9' FROM dual
) ftbtmp", sql);
sql = insert.AppendData(items).InsertColumns(a => new { a.Title, a.Clicks }).ToSql();
Assert.Equal(@"INSERT INTO TB_TOPIC_INSERT(Clicks, Title)
SELECT * FROM (
SELECT 0, 'newtitle0' FROM dual
UNION ALL
SELECT 100, 'newtitle1' FROM dual
UNION ALL
SELECT 200, 'newtitle2' FROM dual
UNION ALL
SELECT 300, 'newtitle3' FROM dual
UNION ALL
SELECT 400, 'newtitle4' FROM dual
UNION ALL
SELECT 500, 'newtitle5' FROM dual
UNION ALL
SELECT 600, 'newtitle6' FROM dual
UNION ALL
SELECT 700, 'newtitle7' FROM dual
UNION ALL
SELECT 800, 'newtitle8' FROM dual
UNION ALL
SELECT 900, 'newtitle9' FROM dual
) ftbtmp", sql);
}
[Fact]
public void IgnoreColumns()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
var sql = insert.AppendData(items).IgnoreColumns(a => a.CreateTime).ToSql();
Assert.Equal(@"INSERT INTO TB_TOPIC_INSERT(Clicks, Title)
SELECT * FROM (
SELECT 0, 'newtitle0' FROM dual
UNION ALL
SELECT 100, 'newtitle1' FROM dual
UNION ALL
SELECT 200, 'newtitle2' FROM dual
UNION ALL
SELECT 300, 'newtitle3' FROM dual
UNION ALL
SELECT 400, 'newtitle4' FROM dual
UNION ALL
SELECT 500, 'newtitle5' FROM dual
UNION ALL
SELECT 600, 'newtitle6' FROM dual
UNION ALL
SELECT 700, 'newtitle7' FROM dual
UNION ALL
SELECT 800, 'newtitle8' FROM dual
UNION ALL
SELECT 900, 'newtitle9' FROM dual
) ftbtmp", sql);
sql = insert.AppendData(items).IgnoreColumns(a => new { a.Title, a.CreateTime }).ToSql();
Assert.Equal(@"INSERT INTO TB_TOPIC_INSERT(Clicks)
SELECT * FROM (
SELECT 0 FROM dual
UNION ALL
SELECT 100 FROM dual
UNION ALL
SELECT 200 FROM dual
UNION ALL
SELECT 300 FROM dual
UNION ALL
SELECT 400 FROM dual
UNION ALL
SELECT 500 FROM dual
UNION ALL
SELECT 600 FROM dual
UNION ALL
SELECT 700 FROM dual
UNION ALL
SELECT 800 FROM dual
UNION ALL
SELECT 900 FROM dual
) ftbtmp", sql);
g.gbase.Delete<TopicIgnore>().Where("1=1").ExecuteAffrows();
var itemsIgnore = new List<TopicIgnore>();
for (var a = 0; a < 2072; a++) itemsIgnore.Add(new TopicIgnore { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
g.gbase.Insert<TopicIgnore>().AppendData(itemsIgnore).IgnoreColumns(a => new { a.Title }).ExecuteAffrows();
Assert.Equal(2072, itemsIgnore.Count);
Assert.Equal(2072, g.gbase.Select<TopicIgnore>().Where(a => a.Title == null).Count());
}
[Table(Name = "TB_TOPICIGNORECOLUMNS")]
class TopicIgnore
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int Clicks { get; set; }
public string Title { get; set; }
public DateTime CreateTime { get; set; }
}
[Fact]
public void ExecuteAffrows()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
Assert.Equal(1, insert.AppendData(items.First()).ExecuteAffrows());
Assert.Equal(10, insert.NoneParameter().AppendData(items).ExecuteAffrows());
Assert.Equal(10, g.gbase.Select<Topic>().Limit(10).InsertInto(null, a => new Topic
{
Title = a.Title
}));
}
[Fact]
public void ExecuteIdentity()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
Assert.NotEqual(0, insert.AppendData(items.First()).ExecuteIdentity());
}
[Fact]
public void ExecuteInserted()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
Assert.Throws<NotImplementedException>(() => insert.AppendData(items.First()).ExecuteInserted());
}
[Fact]
public void AsTable()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newTitle{a}", Clicks = a * 100 });
var sql = insert.AppendData(items.First()).AsTable(a => "Topic_InsertAsTable").ToSql();
Assert.Equal("INSERT INTO Topic_InsertAsTable(Clicks, Title, CreateTime) VALUES(0, 'newTitle0', '0001-01-01 00:00:00.000')", sql);
sql = insert.AppendData(items).AsTable(a => "Topic_InsertAsTable").ToSql();
Assert.Equal(@"INSERT INTO Topic_InsertAsTable(Clicks, Title, CreateTime)
SELECT * FROM (
SELECT 0, 'newTitle0', '0001-01-01 00:00:00.000' FROM dual
UNION ALL
SELECT 100, 'newTitle1', '0001-01-01 00:00:00.000' FROM dual
UNION ALL
SELECT 200, 'newTitle2', '0001-01-01 00:00:00.000' FROM dual
UNION ALL
SELECT 300, 'newTitle3', '0001-01-01 00:00:00.000' FROM dual
UNION ALL
SELECT 400, 'newTitle4', '0001-01-01 00:00:00.000' FROM dual
UNION ALL
SELECT 500, 'newTitle5', '0001-01-01 00:00:00.000' FROM dual
UNION ALL
SELECT 600, 'newTitle6', '0001-01-01 00:00:00.000' FROM dual
UNION ALL
SELECT 700, 'newTitle7', '0001-01-01 00:00:00.000' FROM dual
UNION ALL
SELECT 800, 'newTitle8', '0001-01-01 00:00:00.000' FROM dual
UNION ALL
SELECT 900, 'newTitle9', '0001-01-01 00:00:00.000' FROM dual
) ftbtmp", sql);
sql = insert.AppendData(items).InsertColumns(a => a.Title).AsTable(a => "Topic_InsertAsTable").ToSql();
Assert.Equal(@"INSERT INTO Topic_InsertAsTable(Title)
SELECT * FROM (
SELECT 'newTitle0' FROM dual
UNION ALL
SELECT 'newTitle1' FROM dual
UNION ALL
SELECT 'newTitle2' FROM dual
UNION ALL
SELECT 'newTitle3' FROM dual
UNION ALL
SELECT 'newTitle4' FROM dual
UNION ALL
SELECT 'newTitle5' FROM dual
UNION ALL
SELECT 'newTitle6' FROM dual
UNION ALL
SELECT 'newTitle7' FROM dual
UNION ALL
SELECT 'newTitle8' FROM dual
UNION ALL
SELECT 'newTitle9' FROM dual
) ftbtmp", sql);
sql = insert.AppendData(items).IgnoreColumns(a => a.CreateTime).AsTable(a => "Topic_InsertAsTable").ToSql();
Assert.Equal(@"INSERT INTO Topic_InsertAsTable(Clicks, Title)
SELECT * FROM (
SELECT 0, 'newTitle0' FROM dual
UNION ALL
SELECT 100, 'newTitle1' FROM dual
UNION ALL
SELECT 200, 'newTitle2' FROM dual
UNION ALL
SELECT 300, 'newTitle3' FROM dual
UNION ALL
SELECT 400, 'newTitle4' FROM dual
UNION ALL
SELECT 500, 'newTitle5' FROM dual
UNION ALL
SELECT 600, 'newTitle6' FROM dual
UNION ALL
SELECT 700, 'newTitle7' FROM dual
UNION ALL
SELECT 800, 'newTitle8' FROM dual
UNION ALL
SELECT 900, 'newTitle9' FROM dual
) ftbtmp", sql);
sql = insert.AppendData(items).InsertColumns(a => a.Title).AsTable(a => "Topic_InsertAsTable").ToSql();
Assert.Equal(@"INSERT INTO Topic_InsertAsTable(Title)
SELECT * FROM (
SELECT 'newTitle0' FROM dual
UNION ALL
SELECT 'newTitle1' FROM dual
UNION ALL
SELECT 'newTitle2' FROM dual
UNION ALL
SELECT 'newTitle3' FROM dual
UNION ALL
SELECT 'newTitle4' FROM dual
UNION ALL
SELECT 'newTitle5' FROM dual
UNION ALL
SELECT 'newTitle6' FROM dual
UNION ALL
SELECT 'newTitle7' FROM dual
UNION ALL
SELECT 'newTitle8' FROM dual
UNION ALL
SELECT 'newTitle9' FROM dual
) ftbtmp", sql);
sql = insert.AppendData(items).InsertColumns(a => new { a.Title, a.Clicks }).AsTable(a => "Topic_InsertAsTable").ToSql();
Assert.Equal(@"INSERT INTO Topic_InsertAsTable(Clicks, Title)
SELECT * FROM (
SELECT 0, 'newTitle0' FROM dual
UNION ALL
SELECT 100, 'newTitle1' FROM dual
UNION ALL
SELECT 200, 'newTitle2' FROM dual
UNION ALL
SELECT 300, 'newTitle3' FROM dual
UNION ALL
SELECT 400, 'newTitle4' FROM dual
UNION ALL
SELECT 500, 'newTitle5' FROM dual
UNION ALL
SELECT 600, 'newTitle6' FROM dual
UNION ALL
SELECT 700, 'newTitle7' FROM dual
UNION ALL
SELECT 800, 'newTitle8' FROM dual
UNION ALL
SELECT 900, 'newTitle9' FROM dual
) ftbtmp", sql);
sql = insert.AppendData(items).IgnoreColumns(a => a.CreateTime).AsTable(a => "Topic_InsertAsTable").ToSql();
Assert.Equal(@"INSERT INTO Topic_InsertAsTable(Clicks, Title)
SELECT * FROM (
SELECT 0, 'newTitle0' FROM dual
UNION ALL
SELECT 100, 'newTitle1' FROM dual
UNION ALL
SELECT 200, 'newTitle2' FROM dual
UNION ALL
SELECT 300, 'newTitle3' FROM dual
UNION ALL
SELECT 400, 'newTitle4' FROM dual
UNION ALL
SELECT 500, 'newTitle5' FROM dual
UNION ALL
SELECT 600, 'newTitle6' FROM dual
UNION ALL
SELECT 700, 'newTitle7' FROM dual
UNION ALL
SELECT 800, 'newTitle8' FROM dual
UNION ALL
SELECT 900, 'newTitle9' FROM dual
) ftbtmp", sql);
sql = insert.AppendData(items).IgnoreColumns(a => new { a.Title, a.CreateTime }).AsTable(a => "Topic_InsertAsTable").ToSql();
Assert.Equal(@"INSERT INTO Topic_InsertAsTable(Clicks)
SELECT * FROM (
SELECT 0 FROM dual
UNION ALL
SELECT 100 FROM dual
UNION ALL
SELECT 200 FROM dual
UNION ALL
SELECT 300 FROM dual
UNION ALL
SELECT 400 FROM dual
UNION ALL
SELECT 500 FROM dual
UNION ALL
SELECT 600 FROM dual
UNION ALL
SELECT 700 FROM dual
UNION ALL
SELECT 800 FROM dual
UNION ALL
SELECT 900 FROM dual
) ftbtmp", sql);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,234 @@
using FreeSql.DataAnnotations;
using System;
using System.Collections.Generic;
using System.Linq;
using Xunit;
namespace FreeSql.Tests.GBase
{
public class GBaseUpdateTest
{
IUpdate<Topic> update => g.gbase.Update<Topic>();
[Table(Name = "tb_topic_insert")]
class Topic
{
[Column(IsIdentity = true, IsPrimary = true)]
public int Id { get; set; }
public int? Clicks { get; set; }
public string Title { get; set; }
public DateTime CreateTime { get; set; }
}
[Table(Name = "tb_topic_setsource")]
class Topic22
{
[Column(IsPrimary = true)]
public int Id { get; set; }
public int? Clicks { get; set; }
public int TypeGuid { get; set; }
public string Title { get; set; }
public DateTime CreateTime { get; set; }
}
[Fact]
public void Dywhere()
{
Assert.Null(g.gbase.Update<Topic>().ToSql());
Assert.Equal("UPDATE tb_topic_insert SET Title='test' \r\nWHERE (Id IN (1,2))", g.gbase.Update<Topic>(new[] { 1, 2 }).SetRaw("Title='test'").ToSql());
Assert.Equal("UPDATE tb_topic_insert SET Title='test1' \r\nWHERE (Id = 1)", g.gbase.Update<Topic>(new Topic { Id = 1, Title = "test" }).SetRaw("Title='test1'").ToSql());
Assert.Equal("UPDATE tb_topic_insert SET Title='test1' \r\nWHERE (Id IN (1,2))", g.gbase.Update<Topic>(new[] { new Topic { Id = 1, Title = "test" }, new Topic { Id = 2, Title = "test" } }).SetRaw("Title='test1'").ToSql());
Assert.Equal("UPDATE tb_topic_insert SET Title='test1' \r\nWHERE (Id = 1)", g.gbase.Update<Topic>(new { id = 1 }).SetRaw("Title='test1'").ToSql());
}
[Fact]
public void SetSource()
{
var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Clicks = NULL, Title = 'newtitle', CreateTime = '0001-01-01 00:00:00.000' WHERE (Id = 1)", sql);
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
items[0].Clicks = null;
sql = update.SetSource(items).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Clicks = CASE Id WHEN 1 THEN NULL WHEN 2 THEN 100 WHEN 3 THEN 200 WHEN 4 THEN 300 WHEN 5 THEN 400 WHEN 6 THEN 500 WHEN 7 THEN 600 WHEN 8 THEN 700 WHEN 9 THEN 800 WHEN 10 THEN 900 END, Title = CASE Id WHEN 1 THEN 'newtitle0' WHEN 2 THEN 'newtitle1' WHEN 3 THEN 'newtitle2' WHEN 4 THEN 'newtitle3' WHEN 5 THEN 'newtitle4' WHEN 6 THEN 'newtitle5' WHEN 7 THEN 'newtitle6' WHEN 8 THEN 'newtitle7' WHEN 9 THEN 'newtitle8' WHEN 10 THEN 'newtitle9' END, CreateTime = CASE Id WHEN 1 THEN '0001-01-01 00:00:00.000' WHEN 2 THEN '0001-01-01 00:00:00.000' WHEN 3 THEN '0001-01-01 00:00:00.000' WHEN 4 THEN '0001-01-01 00:00:00.000' WHEN 5 THEN '0001-01-01 00:00:00.000' WHEN 6 THEN '0001-01-01 00:00:00.000' WHEN 7 THEN '0001-01-01 00:00:00.000' WHEN 8 THEN '0001-01-01 00:00:00.000' WHEN 9 THEN '0001-01-01 00:00:00.000' WHEN 10 THEN '0001-01-01 00:00:00.000' END WHERE (Id IN (1,2,3,4,5,6,7,8,9,10))", sql);
sql = update.SetSource(items).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Title = CASE Id WHEN 1 THEN 'newtitle0' WHEN 2 THEN 'newtitle1' WHEN 3 THEN 'newtitle2' WHEN 4 THEN 'newtitle3' WHEN 5 THEN 'newtitle4' WHEN 6 THEN 'newtitle5' WHEN 7 THEN 'newtitle6' WHEN 8 THEN 'newtitle7' WHEN 9 THEN 'newtitle8' WHEN 10 THEN 'newtitle9' END WHERE (Id IN (1,2,3,4,5,6,7,8,9,10))", sql);
sql = update.SetSource(items).Set(a => a.CreateTime, new DateTime(2020, 1, 1)).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET CreateTime = '2020-01-01 00:00:00.000' WHERE (Id IN (1,2,3,4,5,6,7,8,9,10))", sql);
sql = g.gbase.Update<ts_source_mpk>().SetSource(new[] {
new ts_source_mpk { id1 = 1, id2 = 7, xx = "a1" },
new ts_source_mpk { id1 = 1, id2 = 8, xx = "b122" }
}).NoneParameter().ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE ts_source_mpk SET xx = CASE (id1 || '+' || id2) WHEN (1 || '+' || 7) THEN 'a1' WHEN (1 || '+' || 8) THEN 'b122' END WHERE ((id1 = 1 AND id2 = 7) OR (id1 = 1 AND id2 = 8))", sql);
}
public class ts_source_mpk
{
[Column(IsPrimary = true)]
public int id1 { get; set; }
[Column(IsPrimary = true)]
public int id2 { get; set; }
public string xx { get; set; }
}
[Fact]
public void SetSourceNoIdentity()
{
var fsql = g.gbase;
fsql.Delete<Topic22>().Where("1=1").ExecuteAffrows();
var sql = fsql.Update<Topic22>().SetSource(new Topic22 { Id = 1, Title = "newtitle" }).IgnoreColumns(a => a.TypeGuid).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_setsource SET Clicks = NULL, Title = 'newtitle', CreateTime = '0001-01-01 00:00:00.000' WHERE (Id = 1)", sql);
var items = new List<Topic22>();
for (var a = 0; a < 10; a++) items.Add(new Topic22 { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
Assert.Equal(10, fsql.Insert(items).ExecuteAffrows());
items[0].Clicks = null;
sql = fsql.Update<Topic22>().SetSource(items).IgnoreColumns(a => a.TypeGuid).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_setsource SET Clicks = CASE Id WHEN 1 THEN NULL WHEN 2 THEN 100 WHEN 3 THEN 200 WHEN 4 THEN 300 WHEN 5 THEN 400 WHEN 6 THEN 500 WHEN 7 THEN 600 WHEN 8 THEN 700 WHEN 9 THEN 800 WHEN 10 THEN 900 END, Title = CASE Id WHEN 1 THEN 'newtitle0' WHEN 2 THEN 'newtitle1' WHEN 3 THEN 'newtitle2' WHEN 4 THEN 'newtitle3' WHEN 5 THEN 'newtitle4' WHEN 6 THEN 'newtitle5' WHEN 7 THEN 'newtitle6' WHEN 8 THEN 'newtitle7' WHEN 9 THEN 'newtitle8' WHEN 10 THEN 'newtitle9' END, CreateTime = CASE Id WHEN 1 THEN '0001-01-01 00:00:00.000' WHEN 2 THEN '0001-01-01 00:00:00.000' WHEN 3 THEN '0001-01-01 00:00:00.000' WHEN 4 THEN '0001-01-01 00:00:00.000' WHEN 5 THEN '0001-01-01 00:00:00.000' WHEN 6 THEN '0001-01-01 00:00:00.000' WHEN 7 THEN '0001-01-01 00:00:00.000' WHEN 8 THEN '0001-01-01 00:00:00.000' WHEN 9 THEN '0001-01-01 00:00:00.000' WHEN 10 THEN '0001-01-01 00:00:00.000' END WHERE (Id IN (1,2,3,4,5,6,7,8,9,10))", sql);
sql = fsql.Update<Topic22>().SetSource(items).IgnoreColumns(a => new { a.Clicks, a.CreateTime, a.TypeGuid }).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_setsource SET Title = CASE Id WHEN 1 THEN 'newtitle0' WHEN 2 THEN 'newtitle1' WHEN 3 THEN 'newtitle2' WHEN 4 THEN 'newtitle3' WHEN 5 THEN 'newtitle4' WHEN 6 THEN 'newtitle5' WHEN 7 THEN 'newtitle6' WHEN 8 THEN 'newtitle7' WHEN 9 THEN 'newtitle8' WHEN 10 THEN 'newtitle9' END WHERE (Id IN (1,2,3,4,5,6,7,8,9,10))", sql);
sql = fsql.Update<Topic22>().SetSource(items).IgnoreColumns(a => a.TypeGuid).Set(a => a.CreateTime, new DateTime(2020, 1, 1)).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_setsource SET CreateTime = '2020-01-01 00:00:00.000' WHERE (Id IN (1,2,3,4,5,6,7,8,9,10))", sql);
}
[Fact]
public void SetSourceIgnore()
{
Assert.Equal("UPDATE tssi01 SET tint = 10 WHERE (id = '00000000-0000-0000-0000-000000000000')",
g.gbase.Update<tssi01>().NoneParameter()
.SetSourceIgnore(new tssi01 { id = Guid.Empty, tint = 10 }, col => col == null).ToSql().Replace("\r\n", ""));
}
public class tssi01
{
[Column(CanUpdate = false)]
public Guid id { get; set; }
public int tint { get; set; }
public string Title { get; set; }
}
[Fact]
public void IgnoreColumns()
{
var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).IgnoreColumns(a => new { a.Clicks, a.CreateTime }).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Title = 'newtitle' WHERE (Id = 1)", sql);
sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).IgnoreColumns(a => new object[] { a.Clicks, a.CreateTime }).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Title = 'newtitle' WHERE (Id = 1)", sql);
sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).IgnoreColumns(a => new[] { "Clicks", "CreateTime" }).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Title = 'newtitle' WHERE (Id = 1)", sql);
var cols = new[] { "Clicks", "CreateTime" };
sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).IgnoreColumns(a => cols).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Title = 'newtitle' WHERE (Id = 1)", sql);
cols = new[] { "Clicks", "CreateTime" };
sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).IgnoreColumns(cols).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Title = 'newtitle' WHERE (Id = 1)", sql);
}
[Fact]
public void UpdateColumns()
{
var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).UpdateColumns(a => a.Title).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Title = 'newtitle' WHERE (Id = 1)", sql);
}
[Fact]
public void Set()
{
var sql = update.Where(a => a.Id == 1).Set(a => a.Title, "newtitle").ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Title = 'newtitle' WHERE (Id = 1)", sql);
sql = update.Where(a => a.Id == 1).Set(a => a.Title, "newtitle").Set(a => a.CreateTime, new DateTime(2020, 1, 1)).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Title = 'newtitle', CreateTime = '2020-01-01 00:00:00.000' WHERE (Id = 1)", sql);
sql = update.Set(a => a.Clicks * 10 / 1).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Clicks = trunc(nvl(Clicks, 0) * 10/1) WHERE (Id = 1)", sql);
sql = update.Set(a => a.Id - 10).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Id = (Id - 10) WHERE (Id = 1)", sql);
int incrv = 10;
sql = update.Set(a => a.Clicks * incrv / 1).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Clicks = trunc(nvl(Clicks, 0) * 10/1) WHERE (Id = 1)", sql);
sql = update.Set(a => a.Id - incrv).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Id = (Id - 10) WHERE (Id = 1)", sql);
sql = update.Set(a => a.Clicks == a.Clicks * 10 / 1).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Clicks = trunc(Clicks * 10/1) WHERE (Id = 1)", sql);
var dt2000 = DateTime.Parse("2000-01-01");
sql = update.Set(a => a.Clicks == (a.CreateTime > dt2000 ? 1 : 2)).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Clicks = case when CreateTime > '2000-01-01 00:00:00.000' then 1 else 2 end WHERE (Id = 1)", sql);
sql = update.Set(a => a.Id == 10).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Id = 10 WHERE (Id = 1)", sql);
sql = update.Set(a => a.Clicks == null).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Clicks = NULL WHERE (Id = 1)", sql);
sql = update.Set(a => a.Clicks == null).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Clicks = NULL WHERE (Id = 1)", sql);
}
[Fact]
public void SetRaw()
{
var sql = update.Where(a => a.Id == 1).SetRaw("clicks = clicks + @incrClick", new { incrClick = 1 }).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET clicks = clicks + @incrClick WHERE (Id = 1)", sql);
}
[Fact]
public void SetDto()
{
var sql = update.SetDto(new { clicks = 1, Title = "xxx" }).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Clicks = 1, Title = 'xxx' WHERE (Id = 1)", sql);
sql = update.NoneParameter().SetDto(new Dictionary<string, object> { ["clicks"] = 1, ["Title"] = "xxx" }).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Clicks = 1, Title = 'xxx' WHERE (Id = 1)", sql);
}
[Fact]
public void Where()
{
var sql = update.Where(a => a.Id == 1).SetRaw("Title='newtitle'").ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Title='newtitle' WHERE (Id = 1)", sql);
sql = update.Where("id = @id", new { id = 1 }).SetRaw("Title='newtitle'").ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Title='newtitle' WHERE (id = @id)", sql);
var item = new Topic { Id = 1, Title = "newtitle" };
sql = update.Where(item).SetRaw("Title='newtitle'").ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Title='newtitle' WHERE (Id = 1)", sql);
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
sql = update.Where(items).SetRaw("Title='newtitle'").ToSql().Replace("\r\n", "");
Assert.Equal("UPDATE tb_topic_insert SET Title='newtitle' WHERE (Id IN (1,2,3,4,5,6,7,8,9,10))", sql);
}
[Fact]
public void ExecuteAffrows()
{
var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
update.SetSource(items.First()).NoneParameter().ExecuteAffrows();
update.SetSource(items).NoneParameter().ExecuteAffrows();
}
[Fact]
public void ExecuteUpdated()
{
}
[Fact]
public void AsTable()
{
Assert.Null(g.gbase.Update<Topic>().ToSql());
Assert.Equal("UPDATE tb_topicAsTable SET Title='test' \r\nWHERE (Id IN (1,2))", g.gbase.Update<Topic>(new[] { 1, 2 }).SetRaw("Title='test'").AsTable(a => "tb_topicAsTable").ToSql());
Assert.Equal("UPDATE tb_topicAsTable SET Title='test1' \r\nWHERE (Id = 1)", g.gbase.Update<Topic>(new Topic { Id = 1, Title = "test" }).SetRaw("Title='test1'").AsTable(a => "tb_topicAsTable").ToSql());
Assert.Equal("UPDATE tb_topicAsTable SET Title='test1' \r\nWHERE (Id IN (1,2))", g.gbase.Update<Topic>(new[] { new Topic { Id = 1, Title = "test" }, new Topic { Id = 2, Title = "test" } }).SetRaw("Title='test1'").AsTable(a => "tb_topicAsTable").ToSql());
Assert.Equal("UPDATE tb_topicAsTable SET Title='test1' \r\nWHERE (Id = 1)", g.gbase.Update<Topic>(new { id = 1 }).SetRaw("Title='test1'").AsTable(a => "tb_topicAsTable").ToSql());
}
}
}