From 951e917015222e234d7449f6ebacbe1dcaf3ec45 Mon Sep 17 00:00:00 2001
From: 28810 <28810@YEXIANGQIN>
Date: Sat, 12 Sep 2020 05:46:53 +0800
Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20FreeSql.Provider.Fireb?=
=?UTF-8?q?ird=20=E6=95=B0=E6=8D=AE=E5=BA=93=E5=AE=9E=E7=8E=B0=20#443?=
=?UTF-8?q?=EF=BC=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
FreeSql.DbContext/FreeSql.DbContext.xml | 16 -
.../Firebird/Curd/FirebirdDeleteTest.cs | 105 +
...birdInsertOrUpdateIfExistsDoNothingTest.cs | 428 ++++
.../Curd/FirebirdInsertOrUpdateTest.cs | 470 +++++
.../Firebird/Curd/FirebirdInsertTest.cs | 394 ++++
.../Firebird/Curd/FirebirdSelectTest.cs | 1848 +++++++++++++++++
.../Firebird/Curd/FirebirdUpdateTest.cs | 189 ++
.../Firebird/ExtensionsAdo/FirebirdAdoTest.cs | 71 +
.../FreeSql.Tests/Firebird/FirebirdAopTest.cs | 40 +
.../Firebird/FirebirdCodeFirstTest.cs | 374 ++++
.../Firebird/FirebirdDbFirstTest.cs | 51 +
.../FirebirdExpression/ConvertTest.cs | 169 ++
.../FirebirdExpression/DateTimeTest.cs | 706 +++++++
.../Firebird/FirebirdExpression/MathTest.cs | 150 ++
.../Firebird/FirebirdExpression/OtherTest.cs | 173 ++
.../Firebird/FirebirdExpression/StringTest.cs | 726 +++++++
.../FirebirdExpression/TimeSpanTest.cs | 293 +++
.../Firebird/MapType/BoolNullableTest.cs | 1571 ++++++++++++++
.../Firebird/MapType/BoolTest.cs | 1105 ++++++++++
.../Firebird/MapType/DateTimeOffSetTest.cs | 54 +
.../Firebird/MapType/EnumTest.cs | 261 +++
.../Firebird/MapType/ToStringTest.cs | 570 +++++
.../FreeSql.Tests/FreeSql.Tests.csproj | 1 +
FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml | 5 +
FreeSql.Tests/FreeSql.Tests/g.cs | 15 +
FreeSql.sln | 15 +
FreeSql/DataType.cs | 7 +-
FreeSql/Extensions/AdoNetExtensions.cs | 1 +
FreeSql/Extensions/FreeSqlGlobalExtensions.cs | 4 +-
FreeSql/FreeSql.xml | 354 ++--
FreeSql/FreeSqlBuilder.cs | 5 +
.../CommonProvider/AdoProvider/AdoProvider.cs | 3 +
.../AdoProvider/AdoProviderAsync.cs | 3 +
.../CommonProvider/InsertOrUpdateProvider.cs | 9 +
.../Internal/CommonProvider/InsertProvider.cs | 8 +-
.../SelectProvider/Select0Provider.cs | 6 +
FreeSql/Internal/UtilsExpressionTree.cs | 8 +
.../Curd/FirebirdDelete.cs | 99 +
.../Curd/FirebirdInsert.cs | 225 ++
.../Curd/FirebirdInsertOrUpdate.cs | 72 +
.../Curd/FirebirdSelect.cs | 176 ++
.../Curd/FirebirdUpdate.cs | 145 ++
.../FirebirdAdo/FirebirdAdo.cs | 85 +
.../FirebirdAdo/FirebirdConnectionPool.cs | 237 +++
.../FirebirdCodeFirst.cs | 273 +++
.../FirebirdDbFirst.cs | 391 ++++
.../FirebirdExpression.cs | 472 +++++
.../FirebirdExtensions.cs | 15 +
.../FirebirdProvider.cs | 62 +
.../FirebirdUtils.cs | 98 +
.../FreeSql.Provider.Firebird.csproj | 36 +
Providers/FreeSql.Provider.Firebird/key.snk | Bin 0 -> 596 bytes
.../新建文本文档.txt | 21 +
.../FreeSql.Provider.MySql/MySqlCodeFirst.cs | 1 -
readme.md | 2 +-
55 files changed, 12407 insertions(+), 211 deletions(-)
create mode 100644 FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdDeleteTest.cs
create mode 100644 FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdInsertOrUpdateIfExistsDoNothingTest.cs
create mode 100644 FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdInsertOrUpdateTest.cs
create mode 100644 FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdInsertTest.cs
create mode 100644 FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdSelectTest.cs
create mode 100644 FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdUpdateTest.cs
create mode 100644 FreeSql.Tests/FreeSql.Tests/Firebird/ExtensionsAdo/FirebirdAdoTest.cs
create mode 100644 FreeSql.Tests/FreeSql.Tests/Firebird/FirebirdAopTest.cs
create mode 100644 FreeSql.Tests/FreeSql.Tests/Firebird/FirebirdCodeFirstTest.cs
create mode 100644 FreeSql.Tests/FreeSql.Tests/Firebird/FirebirdDbFirstTest.cs
create mode 100644 FreeSql.Tests/FreeSql.Tests/Firebird/FirebirdExpression/ConvertTest.cs
create mode 100644 FreeSql.Tests/FreeSql.Tests/Firebird/FirebirdExpression/DateTimeTest.cs
create mode 100644 FreeSql.Tests/FreeSql.Tests/Firebird/FirebirdExpression/MathTest.cs
create mode 100644 FreeSql.Tests/FreeSql.Tests/Firebird/FirebirdExpression/OtherTest.cs
create mode 100644 FreeSql.Tests/FreeSql.Tests/Firebird/FirebirdExpression/StringTest.cs
create mode 100644 FreeSql.Tests/FreeSql.Tests/Firebird/FirebirdExpression/TimeSpanTest.cs
create mode 100644 FreeSql.Tests/FreeSql.Tests/Firebird/MapType/BoolNullableTest.cs
create mode 100644 FreeSql.Tests/FreeSql.Tests/Firebird/MapType/BoolTest.cs
create mode 100644 FreeSql.Tests/FreeSql.Tests/Firebird/MapType/DateTimeOffSetTest.cs
create mode 100644 FreeSql.Tests/FreeSql.Tests/Firebird/MapType/EnumTest.cs
create mode 100644 FreeSql.Tests/FreeSql.Tests/Firebird/MapType/ToStringTest.cs
create mode 100644 Providers/FreeSql.Provider.Firebird/Curd/FirebirdDelete.cs
create mode 100644 Providers/FreeSql.Provider.Firebird/Curd/FirebirdInsert.cs
create mode 100644 Providers/FreeSql.Provider.Firebird/Curd/FirebirdInsertOrUpdate.cs
create mode 100644 Providers/FreeSql.Provider.Firebird/Curd/FirebirdSelect.cs
create mode 100644 Providers/FreeSql.Provider.Firebird/Curd/FirebirdUpdate.cs
create mode 100644 Providers/FreeSql.Provider.Firebird/FirebirdAdo/FirebirdAdo.cs
create mode 100644 Providers/FreeSql.Provider.Firebird/FirebirdAdo/FirebirdConnectionPool.cs
create mode 100644 Providers/FreeSql.Provider.Firebird/FirebirdCodeFirst.cs
create mode 100644 Providers/FreeSql.Provider.Firebird/FirebirdDbFirst.cs
create mode 100644 Providers/FreeSql.Provider.Firebird/FirebirdExpression.cs
create mode 100644 Providers/FreeSql.Provider.Firebird/FirebirdExtensions.cs
create mode 100644 Providers/FreeSql.Provider.Firebird/FirebirdProvider.cs
create mode 100644 Providers/FreeSql.Provider.Firebird/FirebirdUtils.cs
create mode 100644 Providers/FreeSql.Provider.Firebird/FreeSql.Provider.Firebird.csproj
create mode 100644 Providers/FreeSql.Provider.Firebird/key.snk
create mode 100644 Providers/FreeSql.Provider.Firebird/新建文本文档.txt
diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml
index 743835e4..5a0c8bd0 100644
--- a/FreeSql.DbContext/FreeSql.DbContext.xml
+++ b/FreeSql.DbContext/FreeSql.DbContext.xml
@@ -130,13 +130,6 @@
清空状态数据
-
-
- 根据 lambda 条件删除数据
-
-
-
-
添加
@@ -532,14 +525,5 @@
-
-
- 批量注入 Repository,可以参考代码自行调整
-
-
-
-
-
-
diff --git a/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdDeleteTest.cs b/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdDeleteTest.cs
new file mode 100644
index 00000000..58ac2ba4
--- /dev/null
+++ b/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdDeleteTest.cs
@@ -0,0 +1,105 @@
+using FreeSql.DataAnnotations;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Xunit;
+
+namespace FreeSql.Tests.Firebird
+{
+ public class FirebirdDeleteTest
+ {
+
+ IDelete delete => g.firebird.Delete();
+
+ [Table(Name = "tb_topic_del")]
+ class Topic
+ {
+ [Column(IsIdentity = true, IsPrimary = true)]
+ public int Id { get; set; }
+ public int Clicks { get; set; }
+ public TestTypeInfo Type { get; set; }
+ public string Title { get; set; }
+ public DateTime CreateTime { get; set; }
+ }
+
+ [Fact]
+ public void Dywhere()
+ {
+ Assert.Null(g.firebird.Delete().ToSql());
+ var sql = g.firebird.Delete(new[] { 1, 2 }).ToSql();
+ Assert.Equal("DELETE FROM \"TB_TOPIC_DEL\" WHERE (\"ID\" IN (1,2))", sql);
+
+ sql = g.firebird.Delete(new Topic { Id = 1, Title = "test" }).ToSql();
+ Assert.Equal("DELETE FROM \"TB_TOPIC_DEL\" WHERE (\"ID\" = 1)", sql);
+
+ sql = g.firebird.Delete(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.firebird.Delete(new { id = 1 }).ToSql();
+ Assert.Equal("DELETE FROM \"TB_TOPIC_DEL\" WHERE (\"ID\" = 1)", sql);
+
+ sql = g.firebird.Delete(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();
+ 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.firebird.Insert(new Topic { Title = "xxxx" }).ExecuteIdentity();
+ Assert.Equal(1, delete.Where(a => a.Id == id).ExecuteAffrows());
+ }
+ [Fact]
+ public void ExecuteDeleted()
+ {
+
+ delete.Where(a => a.Id > 0).ExecuteDeleted();
+ }
+
+ [Fact]
+ public void AsTable()
+ {
+ Assert.Null(g.firebird.Delete().ToSql());
+ var sql = g.firebird.Delete(new[] { 1, 2 }).AsTable(a => "TopicAsTable").ToSql();
+ Assert.Equal("DELETE FROM \"TOPICASTABLE\" WHERE (\"ID\" IN (1,2))", sql);
+
+ sql = g.firebird.Delete(new Topic { Id = 1, Title = "test" }).AsTable(a => "TopicAsTable").ToSql();
+ Assert.Equal("DELETE FROM \"TOPICASTABLE\" WHERE (\"ID\" = 1)", sql);
+
+ sql = g.firebird.Delete(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.firebird.Delete(new { id = 1 }).AsTable(a => "TopicAsTable").ToSql();
+ Assert.Equal("DELETE FROM \"TOPICASTABLE\" WHERE (\"ID\" = 1)", sql);
+ }
+ }
+}
diff --git a/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdInsertOrUpdateIfExistsDoNothingTest.cs b/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdInsertOrUpdateIfExistsDoNothingTest.cs
new file mode 100644
index 00000000..204c696d
--- /dev/null
+++ b/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdInsertOrUpdateIfExistsDoNothingTest.cs
@@ -0,0 +1,428 @@
+using FreeSql.DataAnnotations;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Xunit;
+
+namespace FreeSql.Tests.Firebird
+{
+ public class FirebirdInsertOrUpdateIfExistsDoNothingTest
+ {
+ IFreeSql fsql => g.firebird;
+
+ [Fact]
+ public void InsertOrUpdate_OnlyPrimary()
+ {
+ fsql.Delete().Where("1=1").ExecuteAffrows();
+ var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb01 { id = 1 });
+ var sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOUDB01"" t1
+USING (SELECT FIRST 1 1 as ID FROM rdb$database ) t2 ON (t1.""ID"" = t2.ID)
+WHEN NOT MATCHED THEN
+ insert (""ID"")
+ values (t2.ID)", sql);
+ Assert.Equal(1, iou.ExecuteAffrows());
+
+ iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb01 { id = 1 });
+ sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOUDB01"" t1
+USING (SELECT FIRST 1 1 as ID FROM rdb$database ) t2 ON (t1.""ID"" = t2.ID)
+WHEN NOT MATCHED THEN
+ insert (""ID"")
+ values (t2.ID)", sql);
+ Assert.Equal(0, iou.ExecuteAffrows());
+
+ iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb01 { id = 2 });
+ sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOUDB01"" t1
+USING (SELECT FIRST 1 2 as ID FROM rdb$database ) t2 ON (t1.""ID"" = t2.ID)
+WHEN NOT MATCHED THEN
+ insert (""ID"")
+ values (t2.ID)", sql);
+ Assert.Equal(1, iou.ExecuteAffrows());
+
+ iou = fsql.InsertOrUpdate().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 FIRST 1 1 as ID FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 2 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 3 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 4 FROM rdb$database ) t2 ON (t1.""ID"" = t2.ID)
+WHEN NOT MATCHED THEN
+ insert (""ID"")
+ values (t2.ID)", sql);
+ Assert.Equal(2, iou.ExecuteAffrows());
+
+ iou = fsql.InsertOrUpdate().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 FIRST 1 1 as ID FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 2 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 3 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 4 FROM rdb$database ) 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().Where("1=1").ExecuteAffrows();
+ var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "01" });
+ var sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOUDB02"" t1
+USING (SELECT FIRST 1 1 as ID, '01' as NAME FROM rdb$database ) 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().IfExistsDoNothing().SetSource(new tbioudb02 { id = 1, name = "011" });
+ sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOUDB02"" t1
+USING (SELECT FIRST 1 1 as ID, '011' as NAME FROM rdb$database ) 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().IfExistsDoNothing().SetSource(new tbioudb02 { id = 2, name = "02" });
+ sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOUDB02"" t1
+USING (SELECT FIRST 1 2 as ID, '02' as NAME FROM rdb$database ) 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().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 FIRST 1 1 as ID, '01' as NAME FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 2, '02' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 3, '03' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 4, '04' FROM rdb$database ) 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().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 FIRST 1 1 as ID, '001' as NAME FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 2, '002' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 3, '003' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 4, '004' FROM rdb$database ) 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().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().Where("1=1").ExecuteAffrows();
+ var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "01" });
+ var sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOUDB022"" t1
+USING (SELECT FIRST 1 1 as ID, '01' as NAME FROM rdb$database ) 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().IfExistsDoNothing().SetSource(new tbioudb022 { id = 1, name = "011" });
+ sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOUDB022"" t1
+USING (SELECT FIRST 1 1 as ID, '011' as NAME FROM rdb$database ) 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().IfExistsDoNothing().SetSource(new tbioudb022 { id = 2, name = "02" });
+ sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOUDB022"" t1
+USING (SELECT FIRST 1 2 as ID, '02' as NAME FROM rdb$database ) 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().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 FIRST 1 1 as ID, '01' as NAME FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 2, '02' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 3, '03' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 4, '04' FROM rdb$database ) 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().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 FIRST 1 1 as ID, '001' as NAME FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 2, '002' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 3, '003' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 4, '004' FROM rdb$database ) 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().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().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().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().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().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 FIRST 1 '01' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 '02' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 '03' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 '04' FROM rdb$database", sql);
+ Assert.Equal(4, iou.ExecuteAffrows());
+
+ iou = fsql.InsertOrUpdate().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 FIRST 1 '001' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 '002' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 '003' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 '004' FROM rdb$database", sql);
+ Assert.Equal(4, iou.ExecuteAffrows());
+
+ //--no primary and yes
+ iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new[] { new tbioudb022 { id = 1, name = "100001" }, new tbioudb022 { name = "00001" }, new tbioudb022 { id = 2, name = "100002" }, new tbioudb022 { name = "00002" }, new tbioudb022 { id = 3, name = "100003" }, new tbioudb022 { name = "00003" }, new tbioudb022 { id = 4, name = "100004" }, new tbioudb022 { name = "00004" } });
+ sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOUDB022"" t1
+USING (SELECT FIRST 1 1 as ID, '100001' as NAME FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 2, '100002' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 3, '100003' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 4, '100004' FROM rdb$database ) t2 ON (t1.""ID"" = t2.ID)
+WHEN NOT MATCHED THEN
+ insert (""ID"", ""NAME"")
+ values (t2.ID, t2.NAME)
+
+;
+
+INSERT INTO ""TBIOUDB022""(""NAME"") SELECT FIRST 1 '00001' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 '00002' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 '00003' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 '00004' FROM rdb$database", sql);
+ Assert.Equal(4, iou.ExecuteAffrows());
+ lst = fsql.Select().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().Where("1=1").ExecuteAffrows();
+ var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "01" });
+ var sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOUDB03"" t1
+USING (SELECT FIRST 1 1 as ID1, '01' as ID2, '01' as NAME FROM rdb$database ) 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().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 1, id2 = "01", name = "011" });
+ sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOUDB03"" t1
+USING (SELECT FIRST 1 1 as ID1, '01' as ID2, '011' as NAME FROM rdb$database ) 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().IfExistsDoNothing().SetSource(new tbioudb03 { id1 = 2, id2 = "02", name = "02" });
+ sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOUDB03"" t1
+USING (SELECT FIRST 1 2 as ID1, '02' as ID2, '02' as NAME FROM rdb$database ) 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().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 FIRST 1 1 as ID1, '01' as ID2, '01' as NAME FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 2, '02', '02' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 3, '03', '03' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 4, '04', '04' FROM rdb$database ) 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().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 FIRST 1 1 as ID1, '01' as ID2, '001' as NAME FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 2, '02', '002' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 3, '03', '003' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 4, '04', '004' FROM rdb$database ) 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().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().Where("1=1").ExecuteAffrows();
+ var iou = fsql.InsertOrUpdate().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "01" });
+ var sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOUDB04"" t1
+USING (SELECT FIRST 1 1 as ID, '01' as NAME, 0 as VERSION, current_timestamp as CREATETIME FROM rdb$database ) 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().IfExistsDoNothing().SetSource(new tbioudb04 { id = 1, name = "011" });
+ sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOUDB04"" t1
+USING (SELECT FIRST 1 1 as ID, '011' as NAME, 0 as VERSION, current_timestamp as CREATETIME FROM rdb$database ) 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().IfExistsDoNothing().SetSource(new tbioudb04 { id = 2, name = "02" });
+ sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOUDB04"" t1
+USING (SELECT FIRST 1 2 as ID, '02' as NAME, 0 as VERSION, current_timestamp as CREATETIME FROM rdb$database ) 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().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 FIRST 1 1 as ID, '01' as NAME, 0 as VERSION, current_timestamp as CREATETIME FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 2, '02', 0, current_timestamp FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 3, '03', 0, current_timestamp FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 4, '04', 0, current_timestamp FROM rdb$database ) 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().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 FIRST 1 1 as ID, '001' as NAME, 0 as VERSION, current_timestamp as CREATETIME FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 2, '002', 0, current_timestamp FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 3, '003', 0, current_timestamp FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 4, '004', 0, current_timestamp FROM rdb$database ) 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().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; }
+ }
+ }
+}
diff --git a/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdInsertOrUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdInsertOrUpdateTest.cs
new file mode 100644
index 00000000..2164984d
--- /dev/null
+++ b/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdInsertOrUpdateTest.cs
@@ -0,0 +1,470 @@
+using FreeSql.DataAnnotations;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Xunit;
+
+namespace FreeSql.Tests.Firebird
+{
+ public class FirebirdInsertOrUpdateTest
+ {
+ IFreeSql fsql => g.firebird;
+
+ [Fact]
+ public void InsertOrUpdate_OnlyPrimary()
+ {
+ fsql.Delete().Where("1=1").ExecuteAffrows();
+ var iou = fsql.InsertOrUpdate().SetSource(new tbiou01 { id = 1 });
+ var sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOU01"" t1
+USING (SELECT FIRST 1 1 as ID FROM rdb$database ) t2 ON (t1.""ID"" = t2.ID)
+WHEN NOT MATCHED THEN
+ insert (""ID"")
+ values (t2.ID)", sql);
+ Assert.Equal(1, iou.ExecuteAffrows());
+
+ iou = fsql.InsertOrUpdate().SetSource(new tbiou01 { id = 1 });
+ sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOU01"" t1
+USING (SELECT FIRST 1 1 as ID FROM rdb$database ) t2 ON (t1.""ID"" = t2.ID)
+WHEN NOT MATCHED THEN
+ insert (""ID"")
+ values (t2.ID)", sql);
+ Assert.Equal(0, iou.ExecuteAffrows());
+
+ iou = fsql.InsertOrUpdate().SetSource(new tbiou01 { id = 2 });
+ sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOU01"" t1
+USING (SELECT FIRST 1 2 as ID FROM rdb$database ) t2 ON (t1.""ID"" = t2.ID)
+WHEN NOT MATCHED THEN
+ insert (""ID"")
+ values (t2.ID)", sql);
+ Assert.Equal(1, iou.ExecuteAffrows());
+
+ iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou01 { id = 1 }, new tbiou01 { id = 2 }, new tbiou01 { id = 3 }, new tbiou01 { id = 4 } });
+ sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOU01"" t1
+USING (SELECT FIRST 1 1 as ID FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 2 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 3 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 4 FROM rdb$database ) t2 ON (t1.""ID"" = t2.ID)
+WHEN NOT MATCHED THEN
+ insert (""ID"")
+ values (t2.ID)", sql);
+ Assert.Equal(2, iou.ExecuteAffrows());
+
+ iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou01 { id = 1 }, new tbiou01 { id = 2 }, new tbiou01 { id = 3 }, new tbiou01 { id = 4 } });
+ sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOU01"" t1
+USING (SELECT FIRST 1 1 as ID FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 2 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 3 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 4 FROM rdb$database ) 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().Where("1=1").ExecuteAffrows();
+ var iou = fsql.InsertOrUpdate().SetSource(new tbiou02 { id = 1, name = "01" });
+ var sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOU02"" t1
+USING (SELECT FIRST 1 1 as ID, '01' as NAME FROM rdb$database ) 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().SetSource(new tbiou02 { id = 1, name = "011" });
+ sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOU02"" t1
+USING (SELECT FIRST 1 1 as ID, '011' as NAME FROM rdb$database ) 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().SetSource(new tbiou02 { id = 2, name = "02" });
+ sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOU02"" t1
+USING (SELECT FIRST 1 2 as ID, '02' as NAME FROM rdb$database ) 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().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 FIRST 1 1 as ID, '01' as NAME FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 2, '02' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 3, '03' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 4, '04' FROM rdb$database ) 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().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 FIRST 1 1 as ID, '001' as NAME FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 2, '002' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 3, '003' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 4, '004' FROM rdb$database ) 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().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().Where("1=1").ExecuteAffrows();
+ var iou = fsql.InsertOrUpdate().SetSource(new tbiou022 { id = 1, name = "01" });
+ var sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOU022"" t1
+USING (SELECT FIRST 1 1 as ID, '01' as NAME FROM rdb$database ) 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().SetSource(new tbiou022 { id = 1, name = "011" });
+ sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOU022"" t1
+USING (SELECT FIRST 1 1 as ID, '011' as NAME FROM rdb$database ) 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().SetSource(new tbiou022 { id = 2, name = "02" });
+ sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOU022"" t1
+USING (SELECT FIRST 1 2 as ID, '02' as NAME FROM rdb$database ) 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().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 FIRST 1 1 as ID, '01' as NAME FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 2, '02' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 3, '03' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 4, '04' FROM rdb$database ) 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().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 FIRST 1 1 as ID, '001' as NAME FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 2, '002' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 3, '003' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 4, '004' FROM rdb$database ) 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().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().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().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().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().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 FIRST 1 '01' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 '02' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 '03' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 '04' FROM rdb$database", sql);
+ Assert.Equal(4, iou.ExecuteAffrows());
+
+ iou = fsql.InsertOrUpdate().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 FIRST 1 '001' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 '002' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 '003' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 '004' FROM rdb$database", sql);
+ Assert.Equal(4, iou.ExecuteAffrows());
+
+ //--no primary and yes
+ iou = fsql.InsertOrUpdate().SetSource(new[] { new tbiou022 { id = 1, name = "100001" }, new tbiou022 { name = "00001" }, new tbiou022 { id = 2, name = "100002" }, new tbiou022 { name = "00002" }, new tbiou022 { id = 3, name = "100003" }, new tbiou022 { name = "00003" }, new tbiou022 { id = 4, name = "100004" }, new tbiou022 { name = "00004" } });
+ sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOU022"" t1
+USING (SELECT FIRST 1 1 as ID, '100001' as NAME FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 2, '100002' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 3, '100003' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 4, '100004' FROM rdb$database ) 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 INTO ""TBIOU022""(""NAME"") SELECT FIRST 1 '00001' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 '00002' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 '00003' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 '00004' FROM rdb$database", sql);
+ Assert.Equal(8, iou.ExecuteAffrows());
+ lst = fsql.Select().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().Where("1=1").ExecuteAffrows();
+ var iou = fsql.InsertOrUpdate().SetSource(new tbiou03 { id1 = 1, id2 = "01", name = "01" });
+ var sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOU03"" t1
+USING (SELECT FIRST 1 1 as ID1, '01' as ID2, '01' as NAME FROM rdb$database ) t2 ON (t1.""ID1"" = t2.ID1 AND t1.""ID2"" = t2.ID2)
+WHEN MATCHED THEN
+ update set ""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().SetSource(new tbiou03 { id1 = 1, id2 = "01", name = "011" });
+ sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOU03"" t1
+USING (SELECT FIRST 1 1 as ID1, '01' as ID2, '011' as NAME FROM rdb$database ) t2 ON (t1.""ID1"" = t2.ID1 AND t1.""ID2"" = t2.ID2)
+WHEN MATCHED THEN
+ update set ""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().SetSource(new tbiou03 { id1 = 2, id2 = "02", name = "02" });
+ sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOU03"" t1
+USING (SELECT FIRST 1 2 as ID1, '02' as ID2, '02' as NAME FROM rdb$database ) t2 ON (t1.""ID1"" = t2.ID1 AND t1.""ID2"" = t2.ID2)
+WHEN MATCHED THEN
+ update set ""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().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 FIRST 1 1 as ID1, '01' as ID2, '01' as NAME FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 2, '02', '02' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 3, '03', '03' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 4, '04', '04' FROM rdb$database ) t2 ON (t1.""ID1"" = t2.ID1 AND t1.""ID2"" = t2.ID2)
+WHEN MATCHED THEN
+ update set ""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().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 FIRST 1 1 as ID1, '01' as ID2, '001' as NAME FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 2, '02', '002' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 3, '03', '003' FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 4, '04', '004' FROM rdb$database ) t2 ON (t1.""ID1"" = t2.ID1 AND t1.""ID2"" = t2.ID2)
+WHEN MATCHED THEN
+ update set ""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().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().Where("1=1").ExecuteAffrows();
+ var iou = fsql.InsertOrUpdate().SetSource(new tbiou04 { id = 1, name = "01" });
+ var sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOU04"" t1
+USING (SELECT FIRST 1 1 as ID, '01' as NAME, 0 as VERSION, current_timestamp as CREATETIME FROM rdb$database ) t2 ON (t1.""ID"" = t2.ID)
+WHEN MATCHED THEN
+ update set ""NAME"" = t2.NAME, ""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().SetSource(new tbiou04 { id = 1, name = "011" });
+ sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOU04"" t1
+USING (SELECT FIRST 1 1 as ID, '011' as NAME, 0 as VERSION, current_timestamp as CREATETIME FROM rdb$database ) t2 ON (t1.""ID"" = t2.ID)
+WHEN MATCHED THEN
+ update set ""NAME"" = t2.NAME, ""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().SetSource(new tbiou04 { id = 2, name = "02" });
+ sql = iou.ToSql();
+ Assert.Equal(@"MERGE INTO ""TBIOU04"" t1
+USING (SELECT FIRST 1 2 as ID, '02' as NAME, 0 as VERSION, current_timestamp as CREATETIME FROM rdb$database ) t2 ON (t1.""ID"" = t2.ID)
+WHEN MATCHED THEN
+ update set ""NAME"" = t2.NAME, ""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().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 FIRST 1 1 as ID, '01' as NAME, 0 as VERSION, current_timestamp as CREATETIME FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 2, '02', 0, current_timestamp FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 3, '03', 0, current_timestamp FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 4, '04', 0, current_timestamp FROM rdb$database ) t2 ON (t1.""ID"" = t2.ID)
+WHEN MATCHED THEN
+ update set ""NAME"" = t2.NAME, ""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().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 FIRST 1 1 as ID, '001' as NAME, 0 as VERSION, current_timestamp as CREATETIME FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 2, '002', 0, current_timestamp FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 3, '003', 0, current_timestamp FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 4, '004', 0, current_timestamp FROM rdb$database ) t2 ON (t1.""ID"" = t2.ID)
+WHEN MATCHED THEN
+ update set ""NAME"" = t2.NAME, ""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().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; }
+ }
+ }
+}
diff --git a/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdInsertTest.cs b/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdInsertTest.cs
new file mode 100644
index 00000000..0f14a9b8
--- /dev/null
+++ b/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdInsertTest.cs
@@ -0,0 +1,394 @@
+using FreeSql.DataAnnotations;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Xunit;
+
+namespace FreeSql.Tests.Firebird
+{
+ public class FirebirdInsertTest
+ {
+
+ IInsert insert => g.firebird.Insert();
+
+ [Table(Name = "TB_TOPIC_INSERT")]
+ class Topic
+ {
+ [Column(IsIdentity = true, IsPrimary = true)]
+ public int Id { get; set; }
+ public int Clicks { get; set; }
+ public TestTypeInfo Type { get; set; }
+ public string Title { get; set; }
+ public DateTime CreateTime { get; set; }
+ }
+
+ [Fact]
+ public void AppendData()
+ {
+ var items = new List();
+ 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(@Clicks_0, @Title_0, @CreateTime_0)", sql);
+
+ sql = insert.AppendData(items).ToSql();
+ Assert.Equal(@"INSERT INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"", ""CREATETIME"") SELECT FIRST 1 @Clicks_0, @Title_0, @CreateTime_0 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_1, @Title_1, @CreateTime_1 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_2, @Title_2, @CreateTime_2 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_3, @Title_3, @CreateTime_3 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_4, @Title_4, @CreateTime_4 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_5, @Title_5, @CreateTime_5 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_6, @Title_6, @CreateTime_6 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_7, @Title_7, @CreateTime_7 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_8, @Title_8, @CreateTime_8 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_9, @Title_9, @CreateTime_9 FROM rdb$database", sql);
+
+ sql = insert.AppendData(items).InsertColumns(a => a.Title).ToSql();
+ Assert.Equal(@"INSERT INTO ""TB_TOPIC_INSERT""(""TITLE"") SELECT FIRST 1 @Title_0 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_1 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_2 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_3 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_4 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_5 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_6 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_7 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_8 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_9 FROM rdb$database", sql);
+
+ sql = insert.AppendData(items).IgnoreColumns(a => a.CreateTime).ToSql();
+ Assert.Equal(@"INSERT INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") SELECT FIRST 1 @Clicks_0, @Title_0 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_1, @Title_1 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_2, @Title_2 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_3, @Title_3 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_4, @Title_4 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_5, @Title_5 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_6, @Title_6 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_7, @Title_7 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_8, @Title_8 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_9, @Title_9 FROM rdb$database", sql);
+ }
+
+ [Fact]
+ public void InsertColumns()
+ {
+ var items = new List();
+ 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 FIRST 1 @Title_0 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_1 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_2 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_3 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_4 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_5 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_6 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_7 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_8 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_9 FROM rdb$database", sql);
+
+ sql = insert.AppendData(items).InsertColumns(a => new { a.Title, a.Clicks }).ToSql();
+ Assert.Equal(@"INSERT INTO ""TB_TOPIC_INSERT""(""CLICKS"", ""TITLE"") SELECT FIRST 1 @Clicks_0, @Title_0 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_1, @Title_1 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_2, @Title_2 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_3, @Title_3 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_4, @Title_4 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_5, @Title_5 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_6, @Title_6 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_7, @Title_7 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_8, @Title_8 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_9, @Title_9 FROM rdb$database", sql);
+ }
+ [Fact]
+ public void IgnoreColumns()
+ {
+ var items = new List();
+ 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 FIRST 1 @Clicks_0, @Title_0 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_1, @Title_1 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_2, @Title_2 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_3, @Title_3 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_4, @Title_4 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_5, @Title_5 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_6, @Title_6 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_7, @Title_7 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_8, @Title_8 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_9, @Title_9 FROM rdb$database", sql);
+
+ sql = insert.AppendData(items).IgnoreColumns(a => new { a.Title, a.CreateTime }).ToSql();
+ Assert.Equal(@"INSERT INTO ""TB_TOPIC_INSERT""(""CLICKS"") SELECT FIRST 1 @Clicks_0 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_1 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_2 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_3 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_4 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_5 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_6 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_7 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_8 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_9 FROM rdb$database", sql);
+
+ g.firebird.Delete().Where("1=1").ExecuteAffrows();
+ var itemsIgnore = new List();
+ for (var a = 0; a < 2072; a++) itemsIgnore.Add(new TopicIgnore { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
+ g.firebird.Insert().AppendData(itemsIgnore).IgnoreColumns(a => new { a.Title }).ExecuteAffrows();
+ Assert.Equal(2072, itemsIgnore.Count);
+ Assert.Equal(2072, g.firebird.Select().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();
+ 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());
+ }
+ [Fact]
+ public void ExecuteIdentity()
+ {
+ var items = new List();
+ 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();
+ for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
+
+ var ret1 = insert.AppendData(items.First()).ExecuteInserted();
+ var ret2 = insert.NoneParameter().AppendData(items).ExecuteInserted();
+ }
+
+ [Fact]
+ public void AsTable()
+ {
+ var items = new List();
+ 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(@Clicks_0, @Title_0, @CreateTime_0)", sql);
+
+ sql = insert.AppendData(items).AsTable(a => "Topic_InsertAsTable").ToSql();
+ Assert.Equal(@"INSERT INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""TITLE"", ""CREATETIME"") SELECT FIRST 1 @Clicks_0, @Title_0, @CreateTime_0 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_1, @Title_1, @CreateTime_1 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_2, @Title_2, @CreateTime_2 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_3, @Title_3, @CreateTime_3 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_4, @Title_4, @CreateTime_4 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_5, @Title_5, @CreateTime_5 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_6, @Title_6, @CreateTime_6 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_7, @Title_7, @CreateTime_7 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_8, @Title_8, @CreateTime_8 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_9, @Title_9, @CreateTime_9 FROM rdb$database", sql);
+
+ sql = insert.AppendData(items).InsertColumns(a => a.Title).AsTable(a => "Topic_InsertAsTable").ToSql();
+ Assert.Equal(@"INSERT INTO ""TOPIC_INSERTASTABLE""(""TITLE"") SELECT FIRST 1 @Title_0 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_1 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_2 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_3 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_4 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_5 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_6 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_7 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_8 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_9 FROM rdb$database", sql);
+
+ sql = insert.AppendData(items).IgnoreColumns(a => a.CreateTime).AsTable(a => "Topic_InsertAsTable").ToSql();
+ Assert.Equal(@"INSERT INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""TITLE"") SELECT FIRST 1 @Clicks_0, @Title_0 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_1, @Title_1 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_2, @Title_2 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_3, @Title_3 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_4, @Title_4 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_5, @Title_5 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_6, @Title_6 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_7, @Title_7 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_8, @Title_8 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_9, @Title_9 FROM rdb$database", sql);
+
+ sql = insert.AppendData(items).InsertColumns(a => a.Title).AsTable(a => "Topic_InsertAsTable").ToSql();
+ Assert.Equal(@"INSERT INTO ""TOPIC_INSERTASTABLE""(""TITLE"") SELECT FIRST 1 @Title_0 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_1 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_2 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_3 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_4 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_5 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_6 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_7 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_8 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Title_9 FROM rdb$database", 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 FIRST 1 @Clicks_0, @Title_0 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_1, @Title_1 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_2, @Title_2 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_3, @Title_3 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_4, @Title_4 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_5, @Title_5 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_6, @Title_6 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_7, @Title_7 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_8, @Title_8 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_9, @Title_9 FROM rdb$database", sql);
+
+ sql = insert.AppendData(items).IgnoreColumns(a => a.CreateTime).AsTable(a => "Topic_InsertAsTable").ToSql();
+ Assert.Equal(@"INSERT INTO ""TOPIC_INSERTASTABLE""(""CLICKS"", ""TITLE"") SELECT FIRST 1 @Clicks_0, @Title_0 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_1, @Title_1 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_2, @Title_2 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_3, @Title_3 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_4, @Title_4 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_5, @Title_5 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_6, @Title_6 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_7, @Title_7 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_8, @Title_8 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_9, @Title_9 FROM rdb$database", 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 FIRST 1 @Clicks_0 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_1 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_2 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_3 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_4 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_5 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_6 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_7 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_8 FROM rdb$database
+UNION ALL
+ SELECT FIRST 1 @Clicks_9 FROM rdb$database", sql);
+ }
+ }
+}
diff --git a/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdSelectTest.cs
new file mode 100644
index 00000000..33c14af4
--- /dev/null
+++ b/FreeSql.Tests/FreeSql.Tests/Firebird/Curd/FirebirdSelectTest.cs
@@ -0,0 +1,1848 @@
+using FreeSql.DataAnnotations;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Xunit;
+
+namespace FreeSql.Tests.Firebird
+{
+ public class FirebirdSelectTest
+ {
+
+ ISelect select => g.firebird.Select();
+
+ [Table(Name = "tb_topic22")]
+ class Topic
+ {
+ [Column(IsIdentity = true, IsPrimary = true)]
+ public int Id { get; set; }
+ public int Clicks { get; set; }
+ public int TypeGuid { get; set; }
+ public TestTypeInfo Type { get; set; }
+ public string Title { get; set; }
+ public DateTime CreateTime { get; set; }
+ }
+ class TestTypeInfo
+ {
+ [Column(IsIdentity = true)]
+ public int Guid { get; set; }
+ public int ParentId { get; set; }
+ public TestTypeParentInfo Parent { get; set; }
+ public string Name { get; set; }
+ }
+ class TestTypeParentInfo
+ {
+ public int Id { get; set; }
+ public string Name { get; set; }
+
+ public List Types { get; set; }
+ }
+
+ class TopicInserts
+ {
+ public Guid Id { get; set; }
+ public int Clicks { get; set; }
+ public int TypeGuid { get; set; }
+ public TestTypeInfo Type { get; set; }
+ public string Title { get; set; }
+ public DateTime CreateTime { get; set; }
+ }
+ public partial class Song
+ {
+ [Column(IsIdentity = true)]
+ public int Id { get; set; }
+ public DateTime? Create_time { get; set; }
+ public bool? Is_deleted { get; set; }
+ public string Title { get; set; }
+ public string Url { get; set; }
+
+ public virtual ICollection Tags { get; set; }
+ }
+ public partial class Song_tag
+ {
+ public int Song_id { get; set; }
+ public virtual Song Song { get; set; }
+
+ public int Tag_id { get; set; }
+ public virtual Tag Tag { get; set; }
+ }
+ public partial class Tag
+ {
+ [Column(IsIdentity = true)]
+ public int Id { get; set; }
+ public int? Parent_id { get; set; }
+ public virtual Tag Parent { get; set; }
+
+ public decimal? Ddd { get; set; }
+ public string Name { get; set; }
+
+ public virtual ICollection Songs { get; set; }
+ public virtual ICollection Tags { get; set; }
+ }
+
+ [Fact]
+ public void AsSelect()
+ {
+ //OneToOne、ManyToOne
+ var t0 = g.firebird.Select().Where(a => a.Parent.Parent.Name == "粤语").ToSql();
+ //SELECT a.`Id`, a.`Parent_id`, a__Parent.`Id` as3, a__Parent.`Parent_id` as4, a__Parent.`Ddd`, a__Parent.`Name`, a.`Ddd` as7, a.`Name` as8
+ //FROM `Tag` a
+ //LEFT JOIN `Tag` a__Parent ON a__Parent.`Id` = a.`Parent_id`
+ //LEFT JOIN `Tag` a__Parent__Parent ON a__Parent__Parent.`Id` = a__Parent.`Parent_id`
+ //WHERE (a__Parent__Parent.`Name` = '粤语')
+
+ //OneToMany
+ var t1 = g.firebird.Select().Where(a => a.Tags.AsSelect().Any(t => t.Parent.Id == 10)).ToSql();
+ //SELECT a.`Id`, a.`Parent_id`, a.`Ddd`, a.`Name`
+ //FROM `Tag` a
+ //WHERE (exists(SELECT 1
+ // FROM `Tag` t
+ // LEFT JOIN `Tag` t__Parent ON t__Parent.`Id` = t.`Parent_id`
+ // WHERE (t__Parent.`Id` = 10) AND (t.`Parent_id` = a.`Id`)
+ // limit 0,1))
+
+ //ManyToMany
+ var t2 = g.firebird.Select().Where(s => s.Tags.AsSelect().Any(t => t.Name == "国语")).ToSql();
+ //SELECT a.`Id`, a.`Create_time`, a.`Is_deleted`, a.`Title`, a.`Url`
+ //FROM `Song` a
+ //WHERE(exists(SELECT 1
+ // FROM `Song_tag` Mt_Ms
+ // WHERE(Mt_Ms.`Song_id` = a.`Id`) AND(exists(SELECT 1
+ // FROM `Tag` t
+ // WHERE(t.`Name` = '国语') AND(t.`Id` = Mt_Ms.`Tag_id`)
+ // limit 0, 1))
+ // limit 0, 1))
+ }
+
+ [Fact]
+ public void Lazy()
+ {
+ var tags = g.firebird.Select().Where(a => a.Parent.Name == "xxx")
+ .LeftJoin(a => a.Parent_id == a.Parent.Id)
+ .ToSql();
+
+ var songs = g.firebird.Select().Limit(10).ToList();
+ }
+
+ [Fact]
+ public void ToDataTable()
+ {
+ var items = new List();
+ for (var a = 0; a < 11; a++) items.Add(new TopicInserts { Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
+
+ //Assert.Equal(1, g.firebird.Insert().AppendData(items.First()).ExecuteAffrows());
+ Assert.Equal(11, g.firebird.Insert().AppendData(items).ExecuteAffrows());
+
+ //items = Enumerable.Range(0, 9989).Select(a => new TopicInserts { Title = "newtitle" + a, CreateTime = DateTime.Now }).ToList();
+ //Assert.Equal(9989, g.firebird.Insert(items).ExecuteAffrows());
+
+ var dt1 = select.Limit(10).ToDataTable();
+ var dt2 = select.Limit(10).ToDataTable("id, 111222");
+ var dt3 = select.Limit(10).ToDataTable(a => new { a.Id, a.Type.Name, now = DateTime.Now });
+ }
+ class TestDto
+ {
+ public int id { get; set; }
+ public string name { get; set; } //这是join表的属性
+ public int ParentId { get; set; } //这是join表的属性
+ }
+ class TestDto2
+ {
+ public int id { get; set; }
+ public string name { get; set; } //这是join表的属性
+ public int ParentId { get; set; } //这是join表的属性
+
+ public TestDto2() { }
+ public TestDto2(int id, string name)
+ {
+ this.id = id;
+ this.name = name;
+ }
+ }
+ [Fact]
+ public void ToList()
+ {
+
+ var testDto1 = select.Limit(10).ToList(a => new TestDto { id = a.Id, name = a.Title });
+ var testDto2 = select.Limit(10).ToList(a => new TestDto());
+ var testDto3 = select.Limit(10).ToList(a => new TestDto { });
+ var testDto4 = select.Limit(10).ToList(a => new TestDto() { });
+
+ var testDto11 = select.LeftJoin(a => a.Type.Guid == a.TypeGuid).Limit(10).ToList(a => new TestDto { id = a.Id, name = a.Title });
+ var testDto22 = select.LeftJoin(a => a.Type.Guid == a.TypeGuid).Limit(10).ToList(a => new TestDto());
+ var testDto33 = select.LeftJoin(a => a.Type.Guid == a.TypeGuid).Limit(10).ToList(a => new TestDto { });
+ var testDto44 = select.LeftJoin(a => a.Type.Guid == a.TypeGuid).Limit(10).ToList(a => new TestDto() { });
+
+ var testDto211 = select.Limit(10).ToList(a => new TestDto2(a.Id, a.Title));
+ var testDto212 = select.Limit(10).ToList(a => new TestDto2());
+ var testDto213 = select.Limit(10).ToList(a => new TestDto2 { });
+ var testDto214 = select.Limit(10).ToList(a => new TestDto2() { });
+ var testDto215 = select.Limit(10).ToList();
+
+ var testDto2211 = select.LeftJoin(a => a.Type.Guid == a.TypeGuid).Limit(10).ToList(a => new TestDto2(a.Id, a.Title));
+ var testDto2222 = select.LeftJoin(a => a.Type.Guid == a.TypeGuid).Limit(10).ToList(a => new TestDto2());
+ var testDto2233 = select.LeftJoin(a => a.Type.Guid == a.TypeGuid).Limit(10).ToList(a => new TestDto2 { });
+ var testDto2244 = select.LeftJoin(a => a.Type.Guid == a.TypeGuid).Limit(10).ToList(a => new TestDto2() { });
+ var testDto2255 = select.LeftJoin(a => a.Type.Guid == a.TypeGuid).Limit(10).ToList();
+
+ g.firebird.Insert().AppendData(new TestGuidIdToList()).ExecuteAffrows();
+ var testGuidId5 = g.firebird.Select().ToList();
+ var testGuidId6 = g.firebird.Select().ToList(a => a.id);
+
+ var t11 = select.Where(a => a.Type.Name.Length > 0).ToList(true);
+ var t21 = select.Where(a => a.Type.Parent.Name.Length > 0).ToList(true);
+
+ g.firebird.Delete().Where("1=1").ExecuteAffrows();
+ var repo = g.firebird.GetRepository();
+ repo.DbContextOptions.EnableAddOrUpdateNavigateList = true;
+ repo.Insert(new District
+ {
+ Code = "001",
+ Name = "001_name",
+ Childs = new List(new[] {
+ new District{
+ Code = "001_01",
+ Name = "001_01_name"
+ },
+ new District{
+ Code = "001_02",
+ Name = "001_02_name"
+ }
+ })
+ });
+ var ddd = g.firebird.Select().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
+ Assert.Single(ddd);
+ Assert.Equal(2, ddd[0].Childs.Count);
+ }
+ public class District
+ {
+ [Column(IsPrimary = true, StringLength = 6)]
+ public string Code { get; set; }
+
+ [Column(StringLength = 20, IsNullable = false)]
+ public string Name { get; set; }
+
+ [Column(StringLength = 6)]
+ public string ParentCode { get; set; }
+
+ [Navigate(nameof(ParentCode))]
+ public District Parent { get; set; }
+
+ [Navigate(nameof(ParentCode))]
+ public List Childs { get; set; }
+ }
+ [Fact]
+ public void ToDictionary()
+ {
+ g.firebird.Insert(new Topic { Title = "xxx" }).ExecuteAffrows();
+ var testDto1 = select.Limit(10).ToDictionary(a => a.Id);
+ var testDto2 = select.Limit(10).ToDictionary(a => a.Id, a => new { a.Id, a.Title });
+
+ var repo = g.firebird.GetRepository();
+ var dic = repo.Select.Limit(10).ToDictionary(a => a.Id);
+ var first = dic.First().Value;
+ first.Clicks++;
+ repo.Update(first);
+ }
+ class TestGuidIdToList
+ {
+ public Guid id { get; set; }
+ public string title { get; set; } = Guid.NewGuid().ToString();
+ }
+ [Fact]
+ public void ToOne()
+ {
+ var testnotfind = select.Where("1=2").First(a => a.CreateTime);
+ Assert.Equal(default(DateTime), testnotfind);
+ }
+ [Fact]
+ public void ToSql()
+ {
+ }
+ [Fact]
+ public void Any()
+ {
+ var count = select.Where(a => 1 == 1).Count();
+ Assert.False(select.Where(a => 1 == 2).Any());
+ Assert.Equal(count > 0, select.Where(a => 1 == 1).Any());
+
+ var sql2222 = select.Where(a =>
+ select.Where(b => b.Id == a.Id &&
+ select.Where(c => c.Id == b.Id).Where(d => d.Id == a.Id).Where(e => e.Id == b.Id)
+ //.Offset(a.Id)
+ .Any()
+ ).Any(c => c.Id == a.Id + 10)
+ );
+ var sql2222Tolist = sql2222.ToList();
+
+ var collectionSelect = select.Where(a =>
+ a.Type.Guid == a.TypeGuid &&
+ a.Type.Parent.Id == a.Type.ParentId &&
+ a.Type.Parent.Types.AsSelect().Where(b => b.Name == a.Title).Any(b => b.ParentId == a.Type.Parent.Id)
+ );
+ collectionSelect.ToList();
+ }
+ [Fact]
+ public void Count()
+ {
+ var count = select.Where(a => 1 == 1).Count();
+ select.Where(a => 1 == 1).Count(out var count2);
+ Assert.Equal(count, count2);
+ Assert.Equal(0, select.Where(a => 1 == 2).Count());
+
+ var subquery = select.ToSql(a => new
+ {
+ all = a,
+ count = select.Where(b => b.Id > 0 && b.Id == a.Id).Count()
+ });
+ var subqueryList = select.ToList(a => new
+ {
+ all = a,
+ count = select.Where(b => b.Id > 0 && b.Id == a.Id).Count()
+ });
+ }
+ [Fact]
+ public void Master()
+ {
+ Assert.StartsWith(" SELECT", select.Master().Where(a => 1 == 1).ToSql());
+ }
+ [Fact]
+ public void From()
+ {
+ var query2 = select.From((s, b) => s
+ .LeftJoin(a => a.TypeGuid == b.Guid)
+ );
+ var sql2 = query2.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", b.\"GUID\", b.\"PARENTID\", b.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a LEFT JOIN \"TESTTYPEINFO\" b ON a.\"TYPEGUID\" = b.\"GUID\"", sql2);
+ query2.ToList();
+
+ var query3 = select.From((s, b, c) => s
+ .LeftJoin(a => a.TypeGuid == b.Guid)
+ .LeftJoin(a => b.ParentId == c.Id)
+ );
+ var sql3 = query3.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", b.\"GUID\", b.\"PARENTID\", b.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a LEFT JOIN \"TESTTYPEINFO\" b ON a.\"TYPEGUID\" = b.\"GUID\" LEFT JOIN \"TESTTYPEPARENTINFO\" c ON b.\"PARENTID\" = c.\"ID\"", sql3);
+ query3.ToList();
+ }
+ [Fact]
+ public void LeftJoin()
+ {
+ //����е�������a.Type��a.Type.Parent ���ǵ�������
+ var query = select.LeftJoin(a => a.Type.Guid == a.TypeGuid);
+ var sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a LEFT JOIN \"TESTTYPEINFO\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\"", sql);
+ query.ToList();
+
+ query = select.LeftJoin(a => a.Type.Guid == a.TypeGuid && a.Type.Name == "xxx");
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a LEFT JOIN \"TESTTYPEINFO\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" AND a__Type.\"NAME\" = 'xxx'", sql);
+ query.ToList();
+
+ query = select.LeftJoin(a => a.Type.Guid == a.TypeGuid && a.Type.Name == "xxx").Where(a => a.Type.Parent.Id == 10);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a LEFT JOIN \"TESTTYPEINFO\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" AND a__Type.\"NAME\" = 'xxx' LEFT JOIN \"TESTTYPEPARENTINFO\" a__Type__Parent ON a__Type__Parent.\"ID\" = a__Type.\"PARENTID\" WHERE (a__Type__Parent.\"ID\" = 10)", sql);
+ query.ToList();
+
+ //���û�е�������
+ query = select.LeftJoin((a, b) => b.Guid == a.TypeGuid);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", b.\"GUID\", b.\"PARENTID\", b.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a LEFT JOIN \"TESTTYPEINFO\" b ON b.\"GUID\" = a.\"TYPEGUID\"", sql);
+ query.ToList();
+
+ query = select.LeftJoin((a, b) => b.Guid == a.TypeGuid && b.Name == "xxx");
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", b.\"GUID\", b.\"PARENTID\", b.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a LEFT JOIN \"TESTTYPEINFO\" b ON b.\"GUID\" = a.\"TYPEGUID\" AND b.\"NAME\" = 'xxx'", sql);
+ query.ToList();
+
+ query = select.LeftJoin((a, a__Type) => a__Type.Guid == a.TypeGuid && a__Type.Name == "xxx").Where(a => a.Type.Parent.Id == 10);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a LEFT JOIN \"TESTTYPEINFO\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" AND a__Type.\"NAME\" = 'xxx' LEFT JOIN \"TESTTYPEPARENTINFO\" a__Type__Parent ON a__Type__Parent.\"ID\" = a__Type.\"PARENTID\" WHERE (a__Type__Parent.\"ID\" = 10)", sql);
+ query.ToList();
+
+ //�������
+ query = select
+ .LeftJoin(a => a.Type.Guid == a.TypeGuid)
+ .LeftJoin(a => a.Type.Parent.Id == a.Type.ParentId);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a LEFT JOIN \"TESTTYPEINFO\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" LEFT JOIN \"TESTTYPEPARENTINFO\" a__Type__Parent ON a__Type__Parent.\"ID\" = a__Type.\"PARENTID\"", sql);
+ query.ToList();
+
+ query = select
+ .LeftJoin((a, a__Type) => a__Type.Guid == a.TypeGuid)
+ .LeftJoin((a, c) => c.Id == a.Type.ParentId);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a LEFT JOIN \"TESTTYPEINFO\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" LEFT JOIN \"TESTTYPEPARENTINFO\" c ON c.\"ID\" = a__Type.\"PARENTID\"", sql);
+ query.ToList();
+
+ //���û�е�������b��c������ϵ
+ var query2 = select.From((s, b, c) => s
+ .LeftJoin(a => a.TypeGuid == b.Guid)
+ .LeftJoin(a => b.ParentId == c.Id));
+ sql = query2.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", b.\"GUID\", b.\"PARENTID\", b.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a LEFT JOIN \"TESTTYPEINFO\" b ON a.\"TYPEGUID\" = b.\"GUID\" LEFT JOIN \"TESTTYPEPARENTINFO\" c ON b.\"PARENTID\" = c.\"ID\"", sql);
+ query2.ToList();
+
+ //������϶����㲻��
+ query = select.LeftJoin("\"TESTTYPEINFO\" b on b.\"GUID\" = a.\"TYPEGUID\"");
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a LEFT JOIN \"TESTTYPEINFO\" b on b.\"GUID\" = a.\"TYPEGUID\"", sql);
+ query.ToList();
+
+ query = select.LeftJoin("\"TESTTYPEINFO\" b on b.\"GUID\" = a.\"TYPEGUID\" and b.\"NAME\" = @bname", new { bname = "xxx" });
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a LEFT JOIN \"TESTTYPEINFO\" b on b.\"GUID\" = a.\"TYPEGUID\" and b.\"NAME\" = @bname", sql);
+ query.ToList();
+ }
+ [Fact]
+ public void InnerJoin()
+ {
+ //����е�������a.Type��a.Type.Parent ���ǵ�������
+ var query = select.InnerJoin(a => a.Type.Guid == a.TypeGuid);
+ var sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a INNER JOIN \"TESTTYPEINFO\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\"", sql);
+ query.ToList();
+
+ query = select.InnerJoin(a => a.Type.Guid == a.TypeGuid && a.Type.Name == "xxx");
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a INNER JOIN \"TESTTYPEINFO\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" AND a__Type.\"NAME\" = 'xxx'", sql);
+ query.ToList();
+
+ query = select.InnerJoin(a => a.Type.Guid == a.TypeGuid && a.Type.Name == "xxx").Where(a => a.Type.Parent.Id == 10);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a INNER JOIN \"TESTTYPEINFO\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" AND a__Type.\"NAME\" = 'xxx' LEFT JOIN \"TESTTYPEPARENTINFO\" a__Type__Parent ON a__Type__Parent.\"ID\" = a__Type.\"PARENTID\" WHERE (a__Type__Parent.\"ID\" = 10)", sql);
+ query.ToList();
+
+ //���û�е�������
+ query = select.InnerJoin((a, b) => b.Guid == a.TypeGuid);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", b.\"GUID\", b.\"PARENTID\", b.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a INNER JOIN \"TESTTYPEINFO\" b ON b.\"GUID\" = a.\"TYPEGUID\"", sql);
+ query.ToList();
+
+ query = select.InnerJoin((a, b) => b.Guid == a.TypeGuid && b.Name == "xxx");
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", b.\"GUID\", b.\"PARENTID\", b.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a INNER JOIN \"TESTTYPEINFO\" b ON b.\"GUID\" = a.\"TYPEGUID\" AND b.\"NAME\" = 'xxx'", sql);
+ query.ToList();
+
+ query = select.InnerJoin((a, a__Type) => a__Type.Guid == a.TypeGuid && a__Type.Name == "xxx").Where(a => a.Type.Parent.Id == 10);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a INNER JOIN \"TESTTYPEINFO\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" AND a__Type.\"NAME\" = 'xxx' LEFT JOIN \"TESTTYPEPARENTINFO\" a__Type__Parent ON a__Type__Parent.\"ID\" = a__Type.\"PARENTID\" WHERE (a__Type__Parent.\"ID\" = 10)", sql);
+ query.ToList();
+
+ //�������
+ query = select
+ .InnerJoin(a => a.Type.Guid == a.TypeGuid)
+ .InnerJoin(a => a.Type.Parent.Id == a.Type.ParentId);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a INNER JOIN \"TESTTYPEINFO\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" INNER JOIN \"TESTTYPEPARENTINFO\" a__Type__Parent ON a__Type__Parent.\"ID\" = a__Type.\"PARENTID\"", sql);
+ query.ToList();
+
+ query = select
+ .InnerJoin((a, a__Type) => a__Type.Guid == a.TypeGuid)
+ .InnerJoin((a, c) => c.Id == a.Type.ParentId);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a INNER JOIN \"TESTTYPEINFO\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" INNER JOIN \"TESTTYPEPARENTINFO\" c ON c.\"ID\" = a__Type.\"PARENTID\"", sql);
+ query.ToList();
+
+ //���û�е�������b��c������ϵ
+ var query2 = select.From((s, b, c) => s
+ .InnerJoin(a => a.TypeGuid == b.Guid)
+ .InnerJoin(a => b.ParentId == c.Id));
+ sql = query2.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", b.\"GUID\", b.\"PARENTID\", b.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a INNER JOIN \"TESTTYPEINFO\" b ON a.\"TYPEGUID\" = b.\"GUID\" INNER JOIN \"TESTTYPEPARENTINFO\" c ON b.\"PARENTID\" = c.\"ID\"", sql);
+ query2.ToList();
+
+ //������϶����㲻��
+ query = select.InnerJoin("\"TESTTYPEINFO\" b on b.\"GUID\" = a.\"TYPEGUID\"");
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a INNER JOIN \"TESTTYPEINFO\" b on b.\"GUID\" = a.\"TYPEGUID\"", sql);
+ query.ToList();
+
+ query = select.InnerJoin("\"TESTTYPEINFO\" b on b.\"GUID\" = a.\"TYPEGUID\" and b.\"NAME\" = @bname", new { bname = "xxx" });
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a INNER JOIN \"TESTTYPEINFO\" b on b.\"GUID\" = a.\"TYPEGUID\" and b.\"NAME\" = @bname", sql);
+ query.ToList();
+
+ }
+ [Fact]
+ public void RightJoin()
+ {
+ //����е�������a.Type��a.Type.Parent ���ǵ�������
+ var query = select.RightJoin(a => a.Type.Guid == a.TypeGuid);
+ var sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a RIGHT JOIN \"TESTTYPEINFO\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\"", sql);
+ query.ToList();
+
+ query = select.RightJoin(a => a.Type.Guid == a.TypeGuid && a.Type.Name == "xxx");
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a RIGHT JOIN \"TESTTYPEINFO\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" AND a__Type.\"NAME\" = 'xxx'", sql);
+ query.ToList();
+
+ query = select.RightJoin(a => a.Type.Guid == a.TypeGuid && a.Type.Name == "xxx").Where(a => a.Type.Parent.Id == 10);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a RIGHT JOIN \"TESTTYPEINFO\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" AND a__Type.\"NAME\" = 'xxx' LEFT JOIN \"TESTTYPEPARENTINFO\" a__Type__Parent ON a__Type__Parent.\"ID\" = a__Type.\"PARENTID\" WHERE (a__Type__Parent.\"ID\" = 10)", sql);
+ query.ToList();
+
+ //���û�е�������
+ query = select.RightJoin((a, b) => b.Guid == a.TypeGuid);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", b.\"GUID\", b.\"PARENTID\", b.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a RIGHT JOIN \"TESTTYPEINFO\" b ON b.\"GUID\" = a.\"TYPEGUID\"", sql);
+ query.ToList();
+
+ query = select.RightJoin((a, b) => b.Guid == a.TypeGuid && b.Name == "xxx");
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", b.\"GUID\", b.\"PARENTID\", b.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a RIGHT JOIN \"TESTTYPEINFO\" b ON b.\"GUID\" = a.\"TYPEGUID\" AND b.\"NAME\" = 'xxx'", sql);
+ query.ToList();
+
+ query = select.RightJoin((a, a__Type) => a__Type.Guid == a.TypeGuid && a__Type.Name == "xxx").Where(a => a.Type.Parent.Id == 10);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a RIGHT JOIN \"TESTTYPEINFO\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" AND a__Type.\"NAME\" = 'xxx' LEFT JOIN \"TESTTYPEPARENTINFO\" a__Type__Parent ON a__Type__Parent.\"ID\" = a__Type.\"PARENTID\" WHERE (a__Type__Parent.\"ID\" = 10)", sql);
+ query.ToList();
+
+ //�������
+ query = select
+ .RightJoin(a => a.Type.Guid == a.TypeGuid)
+ .RightJoin(a => a.Type.Parent.Id == a.Type.ParentId);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a RIGHT JOIN \"TESTTYPEINFO\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" RIGHT JOIN \"TESTTYPEPARENTINFO\" a__Type__Parent ON a__Type__Parent.\"ID\" = a__Type.\"PARENTID\"", sql);
+ query.ToList();
+
+ query = select
+ .RightJoin((a, a__Type) => a__Type.Guid == a.TypeGuid)
+ .RightJoin((a, c) => c.Id == a.Type.ParentId);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a RIGHT JOIN \"TESTTYPEINFO\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" RIGHT JOIN \"TESTTYPEPARENTINFO\" c ON c.\"ID\" = a__Type.\"PARENTID\"", sql);
+ query.ToList();
+
+ //���û�е�������b��c������ϵ
+ var query2 = select.From((s, b, c) => s
+ .RightJoin(a => a.TypeGuid == b.Guid)
+ .RightJoin(a => b.ParentId == c.Id));
+ sql = query2.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", b.\"GUID\", b.\"PARENTID\", b.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a RIGHT JOIN \"TESTTYPEINFO\" b ON a.\"TYPEGUID\" = b.\"GUID\" RIGHT JOIN \"TESTTYPEPARENTINFO\" c ON b.\"PARENTID\" = c.\"ID\"", sql);
+ query2.ToList();
+
+ //������϶����㲻��
+ query = select.RightJoin("\"TESTTYPEINFO\" b on b.\"GUID\" = a.\"TYPEGUID\"");
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a RIGHT JOIN \"TESTTYPEINFO\" b on b.\"GUID\" = a.\"TYPEGUID\"", sql);
+ query.ToList();
+
+ query = select.RightJoin("\"TESTTYPEINFO\" b on b.\"GUID\" = a.\"TYPEGUID\" and b.\"NAME\" = @bname", new { bname = "xxx" });
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a RIGHT JOIN \"TESTTYPEINFO\" b on b.\"GUID\" = a.\"TYPEGUID\" and b.\"NAME\" = @bname", sql);
+ query.ToList();
+
+ }
+ [Fact]
+ public void Where()
+ {
+ var sqltmp1 = select.Where(a => a.Id == 0 && (a.Title == "x" || a.Title == "y") && a.Clicks == 1).ToSql();
+ var sqltmp2 = select.Where(a => a.Id.Equals(true) && (a.Title.Equals("x") || a.Title.Equals("y")) && a.Clicks.Equals(1)).ToSql();
+ var sqltmp3 = select.Where(a => a.Id == 0).Where(a => ((a.Title == "x" && a.Title == "z") || a.Title == "y")).ToSql();
+
+ var sqltmp4 = select.Where(a => (a.Id - 10) / 2 > 0).ToSql();
+
+ //����е�������a.Type��a.Type.Parent ���ǵ�������
+ var query = select.Where(a => a.Id == 10);
+ var sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a WHERE (a.\"ID\" = 10)", sql);
+ query.ToList();
+
+ query = select.Where(a => a.Id == 10 && a.Id > 10 || a.Clicks > 100);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a WHERE ((a.\"ID\" = 10 AND a.\"ID\" > 10 OR a.\"CLICKS\" > 100))", sql);
+ query.ToList();
+
+ query = select.Where(a => a.Id == 10).Where(a => a.Clicks > 100);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a WHERE (a.\"ID\" = 10) AND (a.\"CLICKS\" > 100)", sql);
+ query.ToList();
+
+ query = select.Where(a => a.Type.Name == "typeTitle");
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a LEFT JOIN \"TESTTYPEINFO\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" WHERE (a__Type.\"NAME\" = 'typeTitle')", sql);
+ query.ToList();
+
+ query = select.Where(a => a.Type.Name == "typeTitle" && a.Type.Guid == a.TypeGuid);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a LEFT JOIN \"TESTTYPEINFO\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" WHERE (a__Type.\"NAME\" = 'typeTitle' AND a__Type.\"GUID\" = a.\"TYPEGUID\")", sql);
+ query.ToList();
+
+ query = select.Where(a => a.Type.Parent.Name == "tparent");
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a LEFT JOIN \"TESTTYPEINFO\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" LEFT JOIN \"TESTTYPEPARENTINFO\" a__Type__Parent ON a__Type__Parent.\"ID\" = a__Type.\"PARENTID\" WHERE (a__Type__Parent.\"NAME\" = 'tparent')", sql);
+ query.ToList();
+
+ //���û�е������ԣ��������
+ query = select.Where((a, b) => b.Guid == a.TypeGuid && b.Name == "typeTitle");
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a, \"TESTTYPEINFO\" b WHERE (b.\"GUID\" = a.\"TYPEGUID\" AND b.\"NAME\" = 'typeTitle')", sql);
+ query.ToList();
+
+ query = select.Where((a, b) => b.Name == "typeTitle" && b.Guid == a.TypeGuid);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a, \"TESTTYPEINFO\" b WHERE (b.\"NAME\" = 'typeTitle' AND b.\"GUID\" = a.\"TYPEGUID\")", sql);
+ query.ToList();
+
+ query = select.Where((a, b, c) => c.Name == "tparent");
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a, \"TESTTYPEPARENTINFO\" c WHERE (c.\"NAME\" = 'tparent')", sql);
+ query.ToList();
+
+ //����һ�� From ��Ķ������
+ var query2 = select.From((s, b, c) => s
+ .Where(a => a.Id == 10 && c.Name == "xxx")
+ .Where(a => b.ParentId == 20));
+ sql = query2.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a, \"TESTTYPEINFO\" b, \"TESTTYPEPARENTINFO\" c WHERE (a.\"ID\" = 10 AND c.\"NAME\" = 'xxx') AND (b.\"PARENTID\" = 20)", sql);
+ query2.ToList();
+
+ //������϶����㲻��
+ query = select.Where("a.\"CLICKS\" > 100 and a.\"ID\" = @id", new { id = 10 });
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a WHERE (a.\"CLICKS\" > 100 and a.\"ID\" = @id)", sql);
+ query.ToList();
+ }
+ [Fact]
+ public void WhereIf()
+ {
+ //����е�������a.Type��a.Type.Parent ���ǵ�������
+ var query = select.WhereIf(true, a => a.Id == 10);
+ var sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a WHERE (a.\"ID\" = 10)", sql);
+ query.ToList();
+
+ query = select.WhereIf(true, a => a.Id == 10 && a.Id > 10 || a.Clicks > 100);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a WHERE ((a.\"ID\" = 10 AND a.\"ID\" > 10 OR a.\"CLICKS\" > 100))", sql);
+ query.ToList();
+
+ query = select.WhereIf(true, a => a.Id == 10).WhereIf(true, a => a.Clicks > 100);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a WHERE (a.\"ID\" = 10) AND (a.\"CLICKS\" > 100)", sql);
+ query.ToList();
+
+ query = select.WhereIf(true, a => a.Type.Name == "typeTitle");
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a LEFT JOIN \"TESTTYPEINFO\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" WHERE (a__Type.\"NAME\" = 'typeTitle')", sql);
+ query.ToList();
+
+ query = select.WhereIf(true, a => a.Type.Name == "typeTitle" && a.Type.Guid == a.TypeGuid);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a LEFT JOIN \"TESTTYPEINFO\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" WHERE (a__Type.\"NAME\" = 'typeTitle' AND a__Type.\"GUID\" = a.\"TYPEGUID\")", sql);
+ query.ToList();
+
+ query = select.WhereIf(true, a => a.Type.Parent.Name == "tparent");
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a LEFT JOIN \"TESTTYPEINFO\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" LEFT JOIN \"TESTTYPEPARENTINFO\" a__Type__Parent ON a__Type__Parent.\"ID\" = a__Type.\"PARENTID\" WHERE (a__Type__Parent.\"NAME\" = 'tparent')", sql);
+ query.ToList();
+
+ //����һ�� From ��Ķ������
+ var query2 = select.From((s, b, c) => s
+ .WhereIf(true, a => a.Id == 10 && c.Name == "xxx")
+ .WhereIf(true, a => b.ParentId == 20));
+ sql = query2.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a, \"TESTTYPEINFO\" b, \"TESTTYPEPARENTINFO\" c WHERE (a.\"ID\" = 10 AND c.\"NAME\" = 'xxx') AND (b.\"PARENTID\" = 20)", sql);
+ query2.ToList();
+
+ //������϶����㲻��
+ query = select.WhereIf(true, "a.\"CLICKS\" > 100 and a.\"ID\" = @id", new { id = 10 });
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a WHERE (a.\"CLICKS\" > 100 and a.\"ID\" = @id)", sql);
+ query.ToList();
+
+ // ==========================================WhereIf(false)
+
+ //����е�������a.Type��a.Type.Parent ���ǵ�������
+ query = select.WhereIf(false, a => a.Id == 10);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a", sql);
+ query.ToList();
+
+ query = select.WhereIf(false, a => a.Id == 10 && a.Id > 10 || a.Clicks > 100);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a", sql);
+ query.ToList();
+
+ query = select.WhereIf(false, a => a.Id == 10).WhereIf(false, a => a.Clicks > 100);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a", sql);
+ query.ToList();
+
+ query = select.WhereIf(false, a => a.Type.Name == "typeTitle");
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a", sql);
+ query.ToList();
+
+ query = select.WhereIf(false, a => a.Type.Name == "typeTitle" && a.Type.Guid == a.TypeGuid);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a", sql);
+ query.ToList();
+
+ query = select.WhereIf(false, a => a.Type.Parent.Name == "tparent");
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a", sql);
+ query.ToList();
+
+ //����һ�� From ��Ķ������
+ query2 = select.From((s, b, c) => s
+ .WhereIf(false, a => a.Id == 10 && c.Name == "xxx")
+ .WhereIf(false, a => b.ParentId == 20));
+ sql = query2.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a, \"TESTTYPEINFO\" b, \"TESTTYPEPARENTINFO\" c", sql);
+ query2.ToList();
+
+ //������϶����㲻��
+ query = select.WhereIf(false, "a.\"CLICKS\" > 100 and a.\"ID\" = @id", new { id = 10 });
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a", sql);
+ query.ToList();
+ }
+ [Fact]
+ public void WhereExists()
+ {
+ var sql2222 = select.Where(a => select.Where(b => b.Id == a.Id).Any()).ToList();
+
+ sql2222 = select.Where(a =>
+ select.Where(b => b.Id == a.Id && select.Where(c => c.Id == b.Id).Where(d => d.Id == a.Id).Where(e => e.Id == b.Id)
+
+ //.Offset(a.Id)
+
+ .Any()
+ ).Any()
+ ).ToList();
+ }
+ [Fact]
+ public void GroupBy()
+ {
+ var groupby = select.From((s, b, c) => s
+ .Where(a => a.Id == 1)
+ )
+ .GroupBy((a, b, c) => new { tt2 = a.Title.Substring(0, 2), mod4 = a.Id % 4 })
+ .Having(a => a.Count() > 0 && a.Avg(a.Key.mod4) > 0 && a.Max(a.Key.mod4) > 0)
+ .Having(a => a.Count() < 300 || a.Avg(a.Key.mod4) < 100)
+ .OrderBy(a => a.Key.tt2)
+ .OrderByDescending(a => a.Count())
+ .Offset(10)
+ .Limit(2)
+ .Count(out var trycount)
+ .ToList(a => new
+ {
+ a.Key.tt2,
+ cou1 = a.Count(),
+ cou2 = a.Count(a.Value.Item3.Id),
+ arg1 = a.Avg(a.Key.mod4),
+ ccc2 = a.Key.tt2 ?? "now()",
+ //ccc = Convert.ToDateTime("now()"), partby = Convert.ToDecimal("sum(num) over(PARTITION BY server_id,os,rid,chn order by id desc)")
+ ccc3 = a.Max(a.Value.Item3.Id)
+ });
+
+ var testpid1 = g.firebird.Insert().AppendData(new TestTypeInfo { Name = "Name" + DateTime.Now.ToString("yyyyMMddHHmmss") }).ExecuteIdentity();
+ g.firebird.Insert().AppendData(new TestInfo { Title = "Title" + DateTime.Now.ToString("yyyyMMddHHmmss"), CreateTime = DateTime.Now, TypeGuid = (int)testpid1 }).ExecuteAffrows();
+
+ var fkfjfj = select.GroupBy(a => a.Title)
+ .ToList(a => a.Sum(a.Value.TypeGuid));
+
+ var aggsql1 = select
+ .GroupBy(a => a.Title)
+ .ToSql(b => new
+ {
+ b.Key,
+ cou = b.Count(),
+ sum2 = b.Sum(b.Value.TypeGuid)
+ });
+ var aggtolist1 = select
+ .GroupBy(a => a.Title)
+ .ToList(b => new
+ {
+ b.Key,
+ cou = b.Count(),
+ sum2 = b.Sum(b.Value.TypeGuid)
+ });
+ var aggtolist11 = select
+ .GroupBy(a => a.Title)
+ .ToDictionary(b => new
+ {
+ b.Key,
+ cou = b.Count(),
+ sum2 = b.Sum(b.Value.TypeGuid)
+ });
+
+ var aggsql2 = select
+ .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) })
+ .ToSql(b => new
+ {
+ b.Key.Title,
+ b.Key.yyyy,
+
+ cou = b.Count(),
+ sum2 = b.Sum(b.Value.TypeGuid)
+ });
+ var aggtolist2 = select
+ .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) })
+ .ToList(b => new
+ {
+ b.Key.Title,
+ b.Key.yyyy,
+
+ cou = b.Count(),
+ sum2 = b.Sum(b.Value.TypeGuid)
+ });
+ var aggtolist22 = select
+ .GroupBy(a => new { a.Title, yyyy = string.Concat(a.CreateTime.Year, '-', a.CreateTime.Month) })
+ .ToDictionary(b => new
+ {
+ b.Key.Title,
+ b.Key.yyyy,
+
+ cou = b.Count(),
+ sum2 = b.Sum(b.Value.TypeGuid)
+ });
+
+ var aggsql3 = select
+ .GroupBy(a => a.Title)
+ .ToSql(b => new
+ {
+ b.Key,
+ cou = b.Count(),
+ sum2 = b.Sum(b.Value.TypeGuid),
+ sum3 = b.Sum(b.Value.Type.Parent.Id)
+ });
+ }
+ [Fact]
+ public void ToAggregate()
+ {
+ var sql = select.ToAggregate(a => new { sum = a.Sum(a.Key.Id + 11.11), count = a.Count(), max = a.Max(a.Key.Id), min = a.Min(a.Key.Id) });
+ }
+ [Fact]
+ public void OrderBy()
+ {
+ var sql = select.Offset(10).OrderBy(a => new Random().NextDouble()).ToList();
+ }
+ [Fact]
+ public void Skip_Offset()
+ {
+ var sql = select.Offset(10).ToList();
+ }
+ [Fact]
+ public void Take_Limit()
+ {
+ var sql = select.Limit(10).ToList();
+ }
+ [Fact]
+ public void Page()
+ {
+ var sql1 = select.Page(1, 10).ToList();
+ var sql2 = select.Page(2, 10).ToList();
+ var sql3 = select.Page(3, 10).ToList();
+
+ var sql11 = select.OrderBy(a => new Random().NextDouble()).Page(1, 10).ToList();
+ var sql22 = select.OrderBy(a => new Random().NextDouble()).Page(2, 10).ToList();
+ var sql33 = select.OrderBy(a => new Random().NextDouble()).Page(3, 10).ToList();
+ }
+ [Fact]
+ public void Distinct()
+ {
+ var t1 = select.Distinct().ToList(a => a.Title);
+ var t2 = select.Distinct().Limit(10).ToList(a => a.Title);
+ }
+
+ [Fact]
+ public void Sum()
+ {
+ var subquery = select.ToSql(a => new
+ {
+ all = a,
+ count = (long)select.As("b").Sum(b => b.Id)
+ });
+ Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT FIRST 1 sum(b.""ID"")
+ FROM ""TB_TOPIC22"" b) as6
+FROM ""TB_TOPIC22"" a", subquery);
+ var subqueryList = select.ToList(a => new
+ {
+ all = a,
+ count = (long)select.As("b").Sum(b => b.Id)
+ });
+ }
+ [Fact]
+ public void Min()
+ {
+ var subquery = select.ToSql(a => new
+ {
+ all = a,
+ count = select.As("b").Min(b => b.Id)
+ });
+ Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT FIRST 1 min(b.""ID"")
+ FROM ""TB_TOPIC22"" b) as6
+FROM ""TB_TOPIC22"" a", subquery);
+ var subqueryList = select.ToList(a => new
+ {
+ all = a,
+ count = select.As("b").Min(b => b.Id)
+ });
+ }
+ [Fact]
+ public void Max()
+ {
+ var subquery = select.ToSql(a => new
+ {
+ all = a,
+ count = select.As("b").Max(b => b.Id)
+ });
+ Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT FIRST 1 max(b.""ID"")
+ FROM ""TB_TOPIC22"" b) as6
+FROM ""TB_TOPIC22"" a", subquery);
+ var subqueryList = select.ToList(a => new
+ {
+ all = a,
+ count = select.As("b").Max(b => b.Id)
+ });
+ }
+ [Fact]
+ public void Avg()
+ {
+ var subquery = select.ToSql(a => new
+ {
+ all = a,
+ count = select.As("b").Avg(b => b.Id)
+ });
+ Assert.Equal(@"SELECT a.""ID"" as1, a.""CLICKS"" as2, a.""TYPEGUID"" as3, a.""TITLE"" as4, a.""CREATETIME"" as5, (SELECT FIRST 1 avg(b.""ID"")
+ FROM ""TB_TOPIC22"" b) as6
+FROM ""TB_TOPIC22"" a", subquery);
+ var subqueryList = select.ToList(a => new
+ {
+ all = a,
+ count = select.As("b").Avg(b => b.Id)
+ });
+ }
+ [Fact]
+ public void WhereIn()
+ {
+ var subquery = select.Where(a => select.As("b").ToList(b => b.Title).Contains(a.Id.ToString())).ToSql();
+ Assert.Equal(@"SELECT a.""ID"", a.""CLICKS"", a.""TYPEGUID"", a.""TITLE"", a.""CREATETIME""
+FROM ""TB_TOPIC22"" a
+WHERE (((cast(a.""ID"" as char)) in (SELECT b.""TITLE""
+ FROM ""TB_TOPIC22"" b)))", subquery);
+ var subqueryList = select.Where(a => select.As("b").ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
+ }
+ [Fact]
+ public void As()
+ {
+ }
+
+ [Fact]
+ public void AsTable()
+ {
+
+ var listt = select.AsTable((a, b) => "(select * from tb_topic22 where clicks > 10)").Page(1, 10).ToList();
+
+ Func tableRule = (type, oldname) =>
+ {
+ if (oldname.Length > 16) oldname = oldname.Remove(16);
+ if (type == typeof(Topic)) return oldname + "_T1";
+ else if (type == typeof(TestTypeInfo)) return oldname + "_T2";
+ return oldname + "_AT";
+ };
+
+ //����е�������a.Type��a.Type.Parent ���ǵ�������
+ var query = select.LeftJoin(a => a.Type.Guid == a.TypeGuid).AsTable(tableRule);
+ var sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22_T1\" a LEFT JOIN \"TESTTYPEINFO_T2\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\"", sql);
+
+ query = select.LeftJoin(a => a.Type.Guid == a.TypeGuid && a.Type.Name == "xxx").AsTable(tableRule);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22_T1\" a LEFT JOIN \"TESTTYPEINFO_T2\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" AND a__Type.\"NAME\" = 'xxx'", sql);
+
+ query = select.LeftJoin(a => a.Type.Guid == a.TypeGuid && a.Type.Name == "xxx").Where(a => a.Type.Parent.Id == 10).AsTable(tableRule);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22_T1\" a LEFT JOIN \"TESTTYPEINFO_T2\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" AND a__Type.\"NAME\" = 'xxx' LEFT JOIN \"TESTTYPEPARENTIN_AT\" a__Type__Parent ON a__Type__Parent.\"ID\" = a__Type.\"PARENTID\" WHERE (a__Type__Parent.\"ID\" = 10)", sql);
+
+ //���û�е�������
+ query = select.LeftJoin((a, b) => b.Guid == a.TypeGuid).AsTable(tableRule);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", b.\"GUID\", b.\"PARENTID\", b.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22_T1\" a LEFT JOIN \"TESTTYPEINFO_T2\" b ON b.\"GUID\" = a.\"TYPEGUID\"", sql);
+
+ query = select.LeftJoin((a, b) => b.Guid == a.TypeGuid && b.Name == "xxx").AsTable(tableRule);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", b.\"GUID\", b.\"PARENTID\", b.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22_T1\" a LEFT JOIN \"TESTTYPEINFO_T2\" b ON b.\"GUID\" = a.\"TYPEGUID\" AND b.\"NAME\" = 'xxx'", sql);
+
+ query = select.LeftJoin((a, a__Type) => a__Type.Guid == a.TypeGuid && a__Type.Name == "xxx").Where(a => a.Type.Parent.Id == 10).AsTable(tableRule);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22_T1\" a LEFT JOIN \"TESTTYPEINFO_T2\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" AND a__Type.\"NAME\" = 'xxx' LEFT JOIN \"TESTTYPEPARENTIN_AT\" a__Type__Parent ON a__Type__Parent.\"ID\" = a__Type.\"PARENTID\" WHERE (a__Type__Parent.\"ID\" = 10)", sql);
+
+ //�������
+ query = select
+ .LeftJoin(a => a.Type.Guid == a.TypeGuid)
+ .LeftJoin(a => a.Type.Parent.Id == a.Type.ParentId).AsTable(tableRule);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22_T1\" a LEFT JOIN \"TESTTYPEINFO_T2\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" LEFT JOIN \"TESTTYPEPARENTIN_AT\" a__Type__Parent ON a__Type__Parent.\"ID\" = a__Type.\"PARENTID\"", sql);
+
+ query = select
+ .LeftJoin((a, a__Type) => a__Type.Guid == a.TypeGuid)
+ .LeftJoin((a, c) => c.Id == a.Type.ParentId).AsTable(tableRule);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a__Type.\"GUID\", a__Type.\"PARENTID\", a__Type.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22_T1\" a LEFT JOIN \"TESTTYPEINFO_T2\" a__Type ON a__Type.\"GUID\" = a.\"TYPEGUID\" LEFT JOIN \"TESTTYPEPARENTIN_AT\" c ON c.\"ID\" = a__Type.\"PARENTID\"", sql);
+
+ //���û�е�������b��c������ϵ
+ var query2 = select.From((s, b, c) => s
+ .LeftJoin(a => a.TypeGuid == b.Guid)
+ .LeftJoin(a => b.ParentId == c.Id)).AsTable(tableRule);
+ sql = query2.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", b.\"GUID\", b.\"PARENTID\", b.\"NAME\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22_T1\" a LEFT JOIN \"TESTTYPEINFO_T2\" b ON a.\"TYPEGUID\" = b.\"GUID\" LEFT JOIN \"TESTTYPEPARENTIN_AT\" c ON b.\"PARENTID\" = c.\"ID\"", sql);
+
+ //������϶����㲻��
+ query = select.LeftJoin("\"TESTTYPEINFO\" b on b.\"GUID\" = a.\"TYPEGUID\"").AsTable(tableRule);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22_T1\" a LEFT JOIN \"TESTTYPEINFO\" b on b.\"GUID\" = a.\"TYPEGUID\"", sql);
+
+ query = select.LeftJoin("\"TESTTYPEINFO\" b on b.\"GUID\" = a.\"TYPEGUID\" and b.\"NAME\" = @bname", new { bname = "xxx" }).AsTable(tableRule);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22_T1\" a LEFT JOIN \"TESTTYPEINFO\" b on b.\"GUID\" = a.\"TYPEGUID\" and b.\"NAME\" = @bname", sql);
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a) ftb UNION ALLSELECT * from (SELECT a.\"ID\", a.\"CLICKS\", a.\"TYPEGUID\", a.\"TITLE\", a.\"CREATETIME\" FROM \"TB_TOPIC22\" a) ftb", sql);
+ query.ToList();
+
+ query = select.AsTable((_, old) => old).AsTable((_, old) => old);
+ sql = query.ToSql("count(1) as1").Replace("\r\n", "");
+ Assert.Equal("SELECT * from (SELECT count(1) as1 FROM \"TB_TOPIC22\" a) ftb UNION ALLSELECT * from (SELECT count(1) as1 FROM \"TB_TOPIC22\" a) ftb", sql);
+ query.Count();
+
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Max(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Min(a => a.Id);
+ select.AsTable((_, old) => old).AsTable((_, old) => old).Sum(a => a.Id);
+ //select.AsTable((_, old) => old).AsTable((_, old) => old).Avg(a => a.Id);
+
+ var sqlsss = select
+ .AsTable((type, old) => type == typeof(Topic) ? $"{old}_1" : null)
+ .AsTable((type, old) => type == typeof(Topic) ? $"{old}_2" : null)
+ .ToSql(a => new
+ {
+ a.Id,
+ a.Clicks
+ }, FieldAliasOptions.AsProperty);
+
+ var slsld3 = select
+ .AsTable((type, old) => type == typeof(Topic) ? $"({sqlsss})" : null)
+ .Page(1, 20)
+ .ToList(a => new
+ {
+ a.Id,
+ a.Clicks
+ });
+ }
+
+ public class TiOtmModel1
+ {
+ [Column(IsIdentity = true)]
+ public int id { get; set; }
+ public virtual TiOtmModel2 model2 { get; set; }
+
+ public string m1name { get; set; }
+ }
+ public class TiOtmModel2
+ {
+ [Column(IsPrimary = true)]
+ public int model2id { get; set; }
+ public virtual TiOtmModel1 model1 { get; set; }
+
+ public string m2setting { get; set; }
+
+ public List childs { get; set; }
+ }
+ public class TiOtmModel3
+ {
+ [Column(IsIdentity = true)]
+ public int id { get; set; }
+
+ public int model2111Idaaa { get; set; }
+ public string title { get; set; }
+
+ public List childs2 { get; set; }
+ }
+ public class TiOtmModel4
+ {
+ [Column(IsIdentity = true)]
+ public int id { get; set; }
+
+ public int model3333Id333 { get; set; }
+ public string title444 { get; set; }
+ }
+
+ [Fact]
+ public void Include_OneToMany()
+ {
+ var model1 = new TiOtmModel1 { m1name = DateTime.Now.Second.ToString() };
+ model1.id = (int)g.firebird.Insert(model1).ExecuteIdentity();
+ var model2 = new TiOtmModel2 { model2id = model1.id, m2setting = DateTime.Now.Second.ToString() };
+ g.firebird.Insert(model2).ExecuteAffrows();
+
+ var model3_1 = new TiOtmModel3 { model2111Idaaa = model1.id, title = "testmodel3__111" };
+ model3_1.id = (int)g.firebird.Insert(model3_1).ExecuteIdentity();
+ var model3_2 = new TiOtmModel3 { model2111Idaaa = model1.id, title = "testmodel3__222" };
+ model3_2.id = (int)g.firebird.Insert(model3_2).ExecuteIdentity();
+ var model3_3 = new TiOtmModel3 { model2111Idaaa = model1.id, title = "testmodel3__333" };
+ model3_3.id = (int)g.firebird.Insert(model3_2).ExecuteIdentity();
+
+ var model4s = new[] {
+ new TiOtmModel4{ model3333Id333 = model3_1.id, title444 = "testmodel3_4__111" },
+ new TiOtmModel4{ model3333Id333 = model3_1.id, title444 = "testmodel3_4__222" },
+ new TiOtmModel4{ model3333Id333 = model3_2.id, title444 = "testmodel3_4__111" },
+ new TiOtmModel4{ model3333Id333 = model3_2.id, title444 = "testmodel3_4__222" },
+ new TiOtmModel4{ model3333Id333 = model3_2.id, title444 = "testmodel3_4__333" }
+ };
+ Assert.Equal(5, g.firebird.Insert(model4s).ExecuteAffrows());
+
+ var t0 = g.firebird.Select()
+ .IncludeMany(a => a.childs.Where(m3 => m3.model2111Idaaa == a.model2id))
+ .Where(a => a.model2id <= model1.id)
+ .ToList();
+
+ var t1 = g.firebird.Select()
+ .IncludeMany(a => a.model2.childs.Where(m3 => m3.model2111Idaaa == a.model2.model2id))
+ .Where(a => a.id <= model1.id)
+ .ToList();
+
+ var t2 = g.firebird.Select()
+ .IncludeMany(a => a.model2.childs.Where(m3 => m3.model2111Idaaa == a.model2.model2id),
+ then => then.IncludeMany(m3 => m3.childs2.Where(m4 => m4.model3333Id333 == m3.id)))
+ .Where(a => a.id <= model1.id)
+ .ToList();
+
+ var t00 = g.firebird.Select()
+ .IncludeMany(a => a.childs.Take(1).Where(m3 => m3.model2111Idaaa == a.model2id))
+ .Where(a => a.model2id <= model1.id)
+ .ToList();
+
+ var t11 = g.firebird.Select()
+ .IncludeMany(a => a.model2.childs.Take(1).Where(m3 => m3.model2111Idaaa == a.model2.model2id))
+ .Where(a => a.id <= model1.id)
+ .ToList();
+
+ var t22 = g.firebird.Select()
+ .IncludeMany(a => a.model2.childs.Take(1).Where(m3 => m3.model2111Idaaa == a.model2.model2id),
+ then => then.IncludeMany(m3 => m3.childs2.Take(2).Where(m4 => m4.model3333Id333 == m3.id)))
+ .Where(a => a.id <= model1.id)
+ .ToList();
+
+ //---- Select ----
+
+ var at0 = g.firebird.Select()
+ .IncludeMany(a => a.childs.Where(m3 => m3.model2111Idaaa == a.model2id).Select(m3 => new TiOtmModel3 { id = m3.id }))
+ .Where(a => a.model2id <= model1.id)
+ .ToList();
+
+ var at1 = g.firebird.Select()
+ .IncludeMany(a => a.model2.childs.Where(m3 => m3.model2111Idaaa == a.model2.model2id).Select(m3 => new TiOtmModel3 { id = m3.id }))
+ .Where(a => a.id <= model1.id)
+ .ToList();
+
+ var at2 = g.firebird.Select()
+ .IncludeMany(a => a.model2.childs.Where(m3 => m3.model2111Idaaa == a.model2.model2id).Select(m3 => new TiOtmModel3 { id = m3.id }),
+ then => then.IncludeMany(m3 => m3.childs2.Where(m4 => m4.model3333Id333 == m3.id).Select(m4 => new TiOtmModel4 { id = m4.id })))
+ .Where(a => a.id <= model1.id)
+ .ToList();
+
+ var at00 = g.firebird.Select()
+ .IncludeMany(a => a.childs.Take(1).Where(m3 => m3.model2111Idaaa == a.model2id).Select(m3 => new TiOtmModel3 { id = m3.id }))
+ .Where(a => a.model2id <= model1.id)
+ .ToList();
+
+ var at11 = g.firebird.Select()
+ .IncludeMany(a => a.model2.childs.Take(1).Where(m3 => m3.model2111Idaaa == a.model2.model2id).Select(m3 => new TiOtmModel3 { id = m3.id }))
+ .Where(a => a.id <= model1.id)
+ .ToList();
+
+ var at22 = g.firebird.Select()
+ .IncludeMany(a => a.model2.childs.Take(1).Where(m3 => m3.model2111Idaaa == a.model2.model2id).Select(m3 => new TiOtmModel3 { id = m3.id }),
+ then => then.IncludeMany(m3 => m3.childs2.Take(2).Where(m4 => m4.model3333Id333 == m3.id).Select(m4 => new TiOtmModel4 { id = m4.id })))
+ .Where(a => a.id <= model1.id)
+ .ToList();
+ }
+
+ public class TiOtmModel11
+ {
+ [Column(IsIdentity = true)]
+ public int id { get; set; }
+ public int model2id { get; set; }
+ public string m3setting { get; set; }
+ public TiOtmModel22 model2 { get; set; }
+ public string m1name { get; set; }
+ }
+
+ public class TiOtmModel22
+ {
+ [Column(IsIdentity = true)]
+ public int id { get; set; }
+ public string m2setting { get; set; }
+ public string aaa { get; set; }
+ public string bbb { get; set; }
+ public List childs { get; set; }
+ }
+ public class TiOtmModel33
+ {
+ [Column(IsIdentity = true)]
+ public int id { get; set; }
+ public int model2Id { get; set; }
+ public string title { get; set; }
+ public string setting { get; set; }
+ }
+ [Fact]
+ public void Include_OneToMany2()
+ {
+ string setting = "x";
+ var model2 = new TiOtmModel22 { m2setting = DateTime.Now.Second.ToString(), aaa = "aaa" + DateTime.Now.Second, bbb = "bbb" + DateTime.Now.Second };
+ model2.id = (int)g.firebird.Insert(model2).ExecuteIdentity();
+
+ var model3s = new[]
+ {
+ new TiOtmModel33 {model2Id = model2.id, title = "testmodel3__111", setting = setting},
+ new TiOtmModel33 {model2Id = model2.id, title = "testmodel3__222", setting = setting},
+ new TiOtmModel33 {model2Id = model2.id, title = "testmodel3__333", setting = setting}
+ };
+ Assert.Equal(3, g.firebird.Insert(model3s).ExecuteAffrows());
+
+ var model1 = new TiOtmModel11 { m1name = DateTime.Now.Second.ToString(), model2id = model2.id, m3setting = setting };
+ model1.id = (int)g.firebird.Insert(model1).ExecuteIdentity();
+
+ var t1 = g.firebird.Select()
+ .LeftJoin(a => a.model2id == a.model2.id)
+ .IncludeMany(a => a.model2.childs.Where(m3 => m3.model2Id == a.model2.id && m3.setting == a.m3setting))
+ .Where(a => a.id <= model1.id)
+ .ToList(true);
+
+ var t11 = g.firebird.Select()
+ .LeftJoin(a => a.model2id == a.model2.id)
+ .IncludeMany(a => a.model2.childs.Take(1).Where(m3 => m3.model2Id == a.model2.id && m3.setting == a.m3setting))
+ .Where(a => a.id <= model1.id)
+ .ToList(true);
+
+ //---- Select ----
+
+ var at1 = g.firebird.Select()
+ .LeftJoin(a => a.model2id == a.model2.id)
+ .IncludeMany(a => a.model2.childs.Where(m3 => m3.model2Id == a.model2.id && m3.setting == a.m3setting).Select(m3 => new TiOtmModel33 { title = m3.title }))
+ .Where(a => a.id <= model1.id)
+ .ToList(true);
+
+ var at11 = g.firebird.Select()
+ .LeftJoin(a => a.model2id == a.model2.id)
+ .IncludeMany(a => a.model2.childs.Take(1).Where(m3 => m3.model2Id == a.model2.id && m3.setting == a.m3setting).Select(m3 => new TiOtmModel33 { title = m3.title }))
+ .Where(a => a.id <= model1.id)
+ .ToList(true);
+ }
+
+ [Fact]
+ public void Include_OneToChilds()
+ {
+ var tag1 = new Tag
+ {
+ Ddd = DateTime.Now.Second,
+ Name = "test_oneToChilds_01_中国"
+ };
+ tag1.Id = (int)g.firebird.Insert(tag1).ExecuteIdentity();
+ var tag1_1 = new Tag
+ {
+ Parent_id = tag1.Id,
+ Ddd = DateTime.Now.Second,
+ Name = "test_oneToChilds_01_北京"
+ };
+ tag1_1.Id = (int)g.firebird.Insert(tag1_1).ExecuteIdentity();
+ var tag1_2 = new Tag
+ {
+ Parent_id = tag1.Id,
+ Ddd = DateTime.Now.Second,
+ Name = "test_oneToChilds_01_上海"
+ };
+ tag1_2.Id = (int)g.firebird.Insert(tag1_2).ExecuteIdentity();
+
+ var tag2 = new Tag
+ {
+ Ddd = DateTime.Now.Second,
+ Name = "test_oneToChilds_02_美国"
+ };
+ tag2.Id = (int)g.firebird.Insert(tag2).ExecuteIdentity();
+ var tag2_1 = new Tag
+ {
+ Parent_id = tag2.Id,
+ Ddd = DateTime.Now.Second,
+ Name = "test_oneToChilds_02_纽约"
+ };
+ tag2_1.Id = (int)g.firebird.Insert(tag2_1).ExecuteIdentity();
+ var tag2_2 = new Tag
+ {
+ Parent_id = tag2.Id,
+ Ddd = DateTime.Now.Second,
+ Name = "test_oneToChilds_02_华盛顿"
+ };
+ tag2_2.Id = (int)g.firebird.Insert(tag2_2).ExecuteIdentity();
+
+ var tags0 = g.firebird.Select()
+ .Include(a => a.Parent)
+ .Where(a => a.Id == tag1.Id || a.Id == tag2.Id)
+ .ToList();
+
+ var tags1 = g.firebird.Select()
+ .IncludeMany(a => a.Tags)
+ .Include(a => a.Parent)
+ .IncludeMany(a => a.Songs)
+ .Where(a => a.Id == tag1.Id || a.Id == tag2.Id)
+ .ToList();
+
+ var tags2 = g.firebird.Select()
+ .IncludeMany(a => a.Tags,
+ then => then.Include(a => a.Parent).IncludeMany(a => a.Songs))
+ .Include(a => a.Parent)
+ .IncludeMany(a => a.Songs)
+ .Where(a => a.Id == tag1.Id || a.Id == tag2.Id)
+ .ToList();
+
+ var tags3 = g.firebird.Select()
+ .IncludeMany(a => a.Tags,
+ then => then.Include(a => a.Parent).IncludeMany(a => a.Songs).IncludeMany(a => a.Tags))
+ .Include(a => a.Parent)
+ .IncludeMany(a => a.Songs)
+ .Where(a => a.Id == tag1.Id || a.Id == tag2.Id)
+ .ToList();
+
+ var tags11 = g.firebird.Select()
+ .IncludeMany(a => a.Tags.Take(1))
+ .Include(a => a.Parent)
+ .IncludeMany(a => a.Songs.Take(1))
+ .Where(a => a.Id == tag1.Id || a.Id == tag2.Id)
+ .ToList();
+
+ var tags22 = g.firebird.Select()
+ .IncludeMany(a => a.Tags.Take(1),
+ then => then.Include(a => a.Parent).IncludeMany(a => a.Songs.Take(1)))
+ .Include(a => a.Parent)
+ .IncludeMany(a => a.Songs.Take(1))
+ .Where(a => a.Id == tag1.Id || a.Id == tag2.Id)
+ .ToList();
+
+ var tags33 = g.firebird.Select()
+ .IncludeMany(a => a.Tags.Take(1),
+ then => then.Include(a => a.Parent).IncludeMany(a => a.Songs.Take(1)).IncludeMany(a => a.Tags.Take(1)))
+ .Include(a => a.Parent)
+ .IncludeMany(a => a.Songs.Take(1))
+ .Where(a => a.Id == tag1.Id || a.Id == tag2.Id)
+ .ToList();
+
+ // --- Select ---
+
+ var atags0 = g.firebird.Select()
+ .Include(a => a.Parent)
+ .Where(a => a.Id == tag1.Id || a.Id == tag2.Id)
+ .ToList();
+
+ var atags1 = g.firebird.Select()
+ .IncludeMany(a => a.Tags.Select(b => new Tag { Id = b.Id, Name = b.Name }))
+ .Include(a => a.Parent)
+ .IncludeMany(a => a.Songs.Select(b => new Song { Id = b.Id, Title = b.Title }))
+ .Where(a => a.Id == tag1.Id || a.Id == tag2.Id)
+ .ToList();
+
+ var atags2 = g.firebird.Select()
+ .IncludeMany(a => a.Tags.Select(b => new Tag { Id = b.Id, Name = b.Name }),
+ then => then.Include(a => a.Parent).IncludeMany(a => a.Songs))
+ .Include(a => a.Parent)
+ .IncludeMany(a => a.Songs.Select(b => new Song { Id = b.Id, Title = b.Title }))
+ .Where(a => a.Id == tag1.Id || a.Id == tag2.Id)
+ .ToList();
+
+ var atags3 = g.firebird.Select()
+ .IncludeMany(a => a.Tags.Select(b => new Tag { Id = b.Id, Name = b.Name }),
+ then => then.Include(a => a.Parent).IncludeMany(a => a.Songs.Select(b => new Song { Id = b.Id, Title = b.Title })).IncludeMany(a => a.Tags.Select(b => new Tag { Id = b.Id, Name = b.Name })))
+ .Include(a => a.Parent)
+ .IncludeMany(a => a.Songs.Select(b => new Song { Id = b.Id, Title = b.Title }))
+ .Where(a => a.Id == tag1.Id || a.Id == tag2.Id)
+ .ToList();
+
+ var atags11 = g.firebird.Select()
+ .IncludeMany(a => a.Tags.Take(1).Select(b => new Tag { Id = b.Id, Name = b.Name }))
+ .Include(a => a.Parent)
+ .IncludeMany(a => a.Songs.Take(1).Select(b => new Song { Id = b.Id, Title = b.Title }))
+ .Where(a => a.Id == tag1.Id || a.Id == tag2.Id)
+ .ToList();
+
+ var atags22 = g.firebird.Select()
+ .IncludeMany(a => a.Tags.Take(1).Select(b => new Tag { Id = b.Id, Name = b.Name }),
+ then => then.Include(a => a.Parent).IncludeMany(a => a.Songs.Take(1).Select(b => new Song { Id = b.Id, Title = b.Title })))
+ .Include(a => a.Parent)
+ .IncludeMany(a => a.Songs.Take(1).Select(b => new Song { Id = b.Id, Title = b.Title }))
+ .Where(a => a.Id == tag1.Id || a.Id == tag2.Id)
+ .ToList();
+
+ var atags33 = g.firebird.Select()
+ .IncludeMany(a => a.Tags.Take(1).Select(b => new Tag { Id = b.Id, Name = b.Name }),
+ then => then.Include(a => a.Parent).IncludeMany(a => a.Songs.Take(1).Select(b => new Song { Id = b.Id, Title = b.Title })).IncludeMany(a => a.Tags.Take(1).Select(b => new Tag { Id = b.Id, Name = b.Name })))
+ .Include(a => a.Parent)
+ .IncludeMany(a => a.Songs.Take(1).Select(b => new Song { Id = b.Id, Title = b.Title }))
+ .Where(a => a.Id == tag1.Id || a.Id == tag2.Id)
+ .ToList();
+ }
+
+ [Fact]
+ public void Include_ManyToMany()
+ {
+
+ var tag1 = new Tag
+ {
+ Ddd = DateTime.Now.Second,
+ Name = "test_manytoMany_01_中国"
+ };
+ tag1.Id = (int)g.firebird.Insert(tag1).ExecuteIdentity();
+ var tag2 = new Tag
+ {
+ Ddd = DateTime.Now.Second,
+ Name = "test_manytoMany_02_美国"
+ };
+ tag2.Id = (int)g.firebird.Insert(tag2).ExecuteIdentity();
+ var tag3 = new Tag
+ {
+ Ddd = DateTime.Now.Second,
+ Name = "test_manytoMany_03_日本"
+ };
+ tag3.Id = (int)g.firebird.Insert(tag3).ExecuteIdentity();
+
+ var song1 = new Song
+ {
+ Create_time = DateTime.Now,
+ Title = "test_manytoMany_01_我是中国人.mp3",
+ Url = "http://ww.baidu.com/"
+ };
+ song1.Id = (int)g.firebird.Insert(song1).ExecuteIdentity();
+ var song2 = new Song
+ {
+ Create_time = DateTime.Now,
+ Title = "test_manytoMany_02_爱你一万年.mp3",
+ Url = "http://ww.163.com/"
+ };
+ song2.Id = (int)g.firebird.Insert(song2).ExecuteIdentity();
+ var song3 = new Song
+ {
+ Create_time = DateTime.Now,
+ Title = "test_manytoMany_03_千年等一回.mp3",
+ Url = "http://ww.sina.com/"
+ };
+ song3.Id = (int)g.firebird.Insert(song3).ExecuteIdentity();
+
+ g.firebird.Insert(new Song_tag { Song_id = song1.Id, Tag_id = tag1.Id }).ExecuteAffrows();
+ g.firebird.Insert(new Song_tag { Song_id = song2.Id, Tag_id = tag1.Id }).ExecuteAffrows();
+ g.firebird.Insert(new Song_tag { Song_id = song3.Id, Tag_id = tag1.Id }).ExecuteAffrows();
+ g.firebird.Insert(new Song_tag { Song_id = song1.Id, Tag_id = tag2.Id }).ExecuteAffrows();
+ g.firebird.Insert(new Song_tag { Song_id = song3.Id, Tag_id = tag2.Id }).ExecuteAffrows();
+ g.firebird.Insert(new Song_tag { Song_id = song3.Id, Tag_id = tag3.Id }).ExecuteAffrows();
+
+ var songs1 = g.firebird.Select()
+ .IncludeMany(a => a.Tags)
+ .Where(a => a.Id == song1.Id || a.Id == song2.Id || a.Id == song3.Id)
+ .ToList();
+ Assert.Equal(3, songs1.Count);
+ Assert.Equal(2, songs1[0].Tags.Count);
+ Assert.Equal(1, songs1[1].Tags.Count);
+ Assert.Equal(3, songs1[2].Tags.Count);
+
+ var songs2 = g.firebird.Select()
+ .IncludeMany(a => a.Tags,
+ then => then.IncludeMany(t => t.Songs))
+ .Where(a => a.Id == song1.Id || a.Id == song2.Id || a.Id == song3.Id)
+ .ToList();
+ Assert.Equal(3, songs2.Count);
+ Assert.Equal(2, songs2[0].Tags.Count);
+ Assert.Equal(1, songs2[1].Tags.Count);
+ Assert.Equal(3, songs2[2].Tags.Count);
+
+ var tags3 = g.firebird.Select()
+ .Include(a => a.Tag.Parent)
+ .IncludeMany(a => a.Tag.Songs)
+ .Where(a => a.Tag.Id == tag1.Id || a.Tag.Id == tag2.Id)
+ .ToList(true);
+
+
+ var songs11 = g.firebird.Select()
+ .IncludeMany(a => a.Tags.Take(1))
+ .Where(a => a.Id == song1.Id || a.Id == song2.Id || a.Id == song3.Id)
+ .ToList();
+ Assert.Equal(3, songs11.Count);
+ Assert.Equal(1, songs11[0].Tags.Count);
+ Assert.Equal(1, songs11[1].Tags.Count);
+ Assert.Equal(1, songs11[2].Tags.Count);
+
+ var songs22 = g.firebird.Select()
+ .IncludeMany(a => a.Tags.Take(1),
+ then => then.IncludeMany(t => t.Songs.Take(1)))
+ .Where(a => a.Id == song1.Id || a.Id == song2.Id || a.Id == song3.Id)
+ .ToList();
+ Assert.Equal(3, songs22.Count);
+ Assert.Equal(1, songs22[0].Tags.Count);
+ Assert.Equal(1, songs22[1].Tags.Count);
+ Assert.Equal(1, songs22[2].Tags.Count);
+
+ var tags33 = g.firebird.Select()
+ .Include(a => a.Tag.Parent)
+ .IncludeMany(a => a.Tag.Songs.Take(1))
+ .Where(a => a.Tag.Id == tag1.Id || a.Tag.Id == tag2.Id)
+ .ToList(true);
+
+ // --- Select ---
+
+ new List(new[] { song1, song2, song3 }).IncludeMany(g.firebird, a => a.Tags.Select(b => new Tag { Id = b.Id, Name = b.Name }));
+
+ var asongs1 = g.firebird.Select()
+ .IncludeMany(a => a.Tags.Select(b => new Tag { Id = b.Id, Name = b.Name }))
+ .Where(a => a.Id == song1.Id || a.Id == song2.Id || a.Id == song3.Id)
+ .ToList();
+ Assert.Equal(3, songs1.Count);
+ Assert.Equal(2, songs1[0].Tags.Count);
+ Assert.Equal(1, songs1[1].Tags.Count);
+ Assert.Equal(3, songs1[2].Tags.Count);
+
+ var asongs2 = g.firebird.Select()
+ .IncludeMany(a => a.Tags.Select(b => new Tag { Id = b.Id, Name = b.Name }),
+ then => then.IncludeMany(t => t.Songs.Select(b => new Song { Id = b.Id, Title = b.Title })))
+ .Where(a => a.Id == song1.Id || a.Id == song2.Id || a.Id == song3.Id)
+ .ToList();
+ Assert.Equal(3, songs2.Count);
+ Assert.Equal(2, songs2[0].Tags.Count);
+ Assert.Equal(1, songs2[1].Tags.Count);
+ Assert.Equal(3, songs2[2].Tags.Count);
+
+ var atags3 = g.firebird.Select()
+ .Include(a => a.Tag.Parent)
+ .IncludeMany(a => a.Tag.Songs.Select(b => new Song { Id = b.Id, Title = b.Title }))
+ .Where(a => a.Tag.Id == tag1.Id || a.Tag.Id == tag2.Id)
+ .ToList(true);
+
+
+ var asongs11 = g.firebird.Select()
+ .IncludeMany(a => a.Tags.Take(1).Select(b => new Tag { Id = b.Id, Name = b.Name }))
+ .Where(a => a.Id == song1.Id || a.Id == song2.Id || a.Id == song3.Id)
+ .ToList();
+ Assert.Equal(3, songs11.Count);
+ Assert.Equal(1, songs11[0].Tags.Count);
+ Assert.Equal(1, songs11[1].Tags.Count);
+ Assert.Equal(1, songs11[2].Tags.Count);
+
+ var asongs22 = g.firebird.Select()
+ .IncludeMany(a => a.Tags.Take(1).Select(b => new Tag { Id = b.Id, Name = b.Name }),
+ then => then.IncludeMany(t => t.Songs.Take(1).Select(b => new Song { Id = b.Id, Title = b.Title })))
+ .Where(a => a.Id == song1.Id || a.Id == song2.Id || a.Id == song3.Id)
+ .ToList();
+ Assert.Equal(3, songs22.Count);
+ Assert.Equal(1, songs22[0].Tags.Count);
+ Assert.Equal(1, songs22[1].Tags.Count);
+ Assert.Equal(1, songs22[2].Tags.Count);
+
+ var atags33 = g.firebird.Select()
+ .Include(a => a.Tag.Parent)
+ .IncludeMany(a => a.Tag.Songs.Take(1).Select(b => new Song { Id = b.Id, Title = b.Title }))
+ .Where(a => a.Tag.Id == tag1.Id || a.Tag.Id == tag2.Id)
+ .ToList(true);
+ }
+
+ public class ToDel1Pk
+ {
+ [Column(IsIdentity = true)]
+ public int id { get; set; }
+ public string name { get; set; }
+ }
+ public class ToDel2Pk
+ {
+ [Column(IsPrimary = true)]
+ public Guid pk1 { get; set; }
+ [Column(IsPrimary = true)]
+ public string pk2 { get; set; }
+ public string name { get; set; }
+ }
+ public class ToDel3Pk
+ {
+ [Column(IsPrimary = true)]
+ public Guid pk1 { get; set; }
+ [Column(IsPrimary = true)]
+ public int pk2 { get; set; }
+ [Column(IsPrimary = true)]
+ public string pk3 { get; set; }
+ public string name { get; set; }
+ }
+ [Fact]
+ public void ToDelete()
+ {
+ g.firebird.Select().ToDelete().ExecuteAffrows();
+ Assert.Equal(0, g.firebird.Select().Count());
+ g.firebird.Insert(new[] {
+ new ToDel1Pk{ name = "name1"},
+ new ToDel1Pk{ name = "name2"},
+ new ToDel1Pk{ name = "nick1"},
+ new ToDel1Pk{ name = "nick2"},
+ new ToDel1Pk{ name = "nick3"}
+ }).ExecuteAffrows();
+ Assert.Equal(2, g.firebird.Select().Where(a => a.name.StartsWith("name")).ToDelete().ExecuteAffrows());
+ Assert.Equal(3, g.firebird.Select().Count());
+ Assert.Equal(3, g.firebird.Select().Where(a => a.name.StartsWith("nick")).Count());
+
+ g.firebird.Select().ToDelete().ExecuteAffrows();
+ Assert.Equal(0, g.firebird.Select().Count());
+ g.firebird.Insert(new[] {
+ new ToDel2Pk{ pk1 = FreeUtil.NewMongodbId(), pk2 = "pk2", name = "name1"},
+ new ToDel2Pk{ pk1 = FreeUtil.NewMongodbId(), pk2 = "pk2", name = "name2"},
+ new ToDel2Pk{ pk1 = FreeUtil.NewMongodbId(), pk2 = "pk2", name = "nick1"},
+ new ToDel2Pk{ pk1 = FreeUtil.NewMongodbId(), pk2 = "pk2", name = "nick2"},
+ new ToDel2Pk{ pk1 = FreeUtil.NewMongodbId(), pk2 = "pk2", name = "nick3"}
+ }).ExecuteAffrows();
+ Assert.Equal(2, g.firebird.Select().Where(a => a.name.StartsWith("name")).ToDelete().ExecuteAffrows());
+ Assert.Equal(3, g.firebird.Select().Count());
+ Assert.Equal(3, g.firebird.Select().Where(a => a.name.StartsWith("nick")).Count());
+
+ g.firebird.Select().ToDelete().ExecuteAffrows();
+ Assert.Equal(0, g.firebird.Select().Count());
+ g.firebird.Insert(new[] {
+ new ToDel3Pk{ pk1 = FreeUtil.NewMongodbId(), pk2 = 1, pk3 = "pk3", name = "name1"},
+ new ToDel3Pk{ pk1 = FreeUtil.NewMongodbId(), pk2 = 1, pk3 = "pk3", name = "name2"},
+ new ToDel3Pk{ pk1 = FreeUtil.NewMongodbId(), pk2 = 1, pk3 = "pk3", name = "nick1"},
+ new ToDel3Pk{ pk1 = FreeUtil.NewMongodbId(), pk2 = 1, pk3 = "pk3", name = "nick2"},
+ new ToDel3Pk{ pk1 = FreeUtil.NewMongodbId(), pk2 = 1, pk3 = "pk3", name = "nick3"}
+ }).ExecuteAffrows();
+ Assert.Equal(2, g.firebird.Select().Where(a => a.name.StartsWith("name")).ToDelete().ExecuteAffrows());
+ Assert.Equal(3, g.firebird.Select().Count());
+ Assert.Equal(3, g.firebird.Select().Where(a => a.name.StartsWith("nick")).Count());
+ }
+
+ public class ToUpd1Pk
+ {
+ [Column(IsIdentity = true)]
+ public int id { get; set; }
+ public string name { get; set; }
+ }
+ public class ToUpd2Pk
+ {
+ [Column(IsPrimary = true)]
+ public Guid pk1 { get; set; }
+ [Column(IsPrimary = true)]
+ public string pk2 { get; set; }
+ public string name { get; set; }
+ }
+ public class ToUpd3Pk
+ {
+ [Column(IsPrimary = true)]
+ public Guid pk1 { get; set; }
+ [Column(IsPrimary = true)]
+ public int pk2 { get; set; }
+ [Column(IsPrimary = true)]
+ public string pk3 { get; set; }
+ public string name { get; set; }
+ }
+ [Fact]
+ public void ToUpdate()
+ {
+ g.firebird.Select().ToDelete().ExecuteAffrows();
+ Assert.Equal(0, g.firebird.Select().Count());
+ g.firebird.Insert(new[] {
+ new ToUpd1Pk{ name = "name1"},
+ new ToUpd1Pk{ name = "name2"},
+ new ToUpd1Pk{ name = "nick1"},
+ new ToUpd1Pk{ name = "nick2"},
+ new ToUpd1Pk{ name = "nick3"}
+ }).ExecuteAffrows();
+ Assert.Equal(2, g.firebird.Select().Where(a => a.name.StartsWith("name")).ToUpdate().Set(a => a.name, "nick?").ExecuteAffrows());
+ Assert.Equal(5, g.firebird.Select().Count());
+ Assert.Equal(5, g.firebird.Select().Where(a => a.name.StartsWith("nick")).Count());
+
+ g.firebird.Select().ToDelete().ExecuteAffrows();
+ Assert.Equal(0, g.firebird.Select().Count());
+ g.firebird.Insert(new[] {
+ new ToUpd2Pk{ pk1 = FreeUtil.NewMongodbId(), pk2 = "pk2", name = "name1"},
+ new ToUpd2Pk{ pk1 = FreeUtil.NewMongodbId(), pk2 = "pk2", name = "name2"},
+ new ToUpd2Pk{ pk1 = FreeUtil.NewMongodbId(), pk2 = "pk2", name = "nick1"},
+ new ToUpd2Pk{ pk1 = FreeUtil.NewMongodbId(), pk2 = "pk2", name = "nick2"},
+ new ToUpd2Pk{ pk1 = FreeUtil.NewMongodbId(), pk2 = "pk2", name = "nick3"}
+ }).ExecuteAffrows();
+ Assert.Equal(2, g.firebird.Select().Where(a => a.name.StartsWith("name")).ToUpdate().Set(a => a.name, "nick?").ExecuteAffrows());
+ Assert.Equal(5, g.firebird.Select().Count());
+ Assert.Equal(5, g.firebird.Select().Where(a => a.name.StartsWith("nick")).Count());
+
+ g.firebird.Select().ToDelete().ExecuteAffrows();
+ Assert.Equal(0, g.firebird.Select().Count());
+ g.firebird.Insert(new[] {
+ new ToUpd3Pk{ pk1 = FreeUtil.NewMongodbId(), pk2 = 1, pk3 = "pk3", name = "name1"},
+ new ToUpd3Pk{ pk1 = FreeUtil.NewMongodbId(), pk2 = 1, pk3 = "pk3", name = "name2"},
+ new ToUpd3Pk{ pk1 = FreeUtil.NewMongodbId(), pk2 = 1, pk3 = "pk3", name = "nick1"},
+ new ToUpd3Pk{ pk1 = FreeUtil.NewMongodbId(), pk2 = 1, pk3 = "pk3", name = "nick2"},
+ new ToUpd3Pk{ pk1 = FreeUtil.NewMongodbId(), pk2 = 1, pk3 = "pk3", name = "nick3"}
+ }).ExecuteAffrows();
+ Assert.Equal(2, g.firebird.Select().Where(a => a.name.StartsWith("name")).ToUpdate().Set(a => a.name, "nick?").ExecuteAffrows());
+ Assert.Equal(5, g.firebird.Select().Count());
+ Assert.Equal(5, g.firebird.Select().Where(a => a.name.StartsWith("nick")).Count());
+ }
+
+ [Fact]
+ public void ForUpdate()
+ {
+ var orm = g.firebird;
+
+ Assert.Equal("安全起见,请务必在事务开启之后,再使用 ForUpdate",
+ Assert.Throws(() => orm.Select().ForUpdate().Limit(1).ToList())?.Message);
+
+ orm.Transaction(() =>
+ {
+ var sql = orm.Select().ForUpdate().Limit(1).ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT FIRST 1 a.\"ID\", a.\"NAME\" FROM \"TOUPD1PK\" a for update with lock", sql);
+ orm.Select().ForUpdate().Limit(1).ToList();
+
+ sql = orm.Select().ForUpdate(true).Limit(1).ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT FIRST 1 a.\"ID\", a.\"NAME\" FROM \"TOUPD1PK\" a for update with lock", sql);
+ orm.Select().ForUpdate(true).Limit(1).ToList();
+ });
+ }
+
+ [Fact]
+ public void ToTreeList()
+ {
+ var fsql = g.firebird;
+ fsql.Delete