diff --git a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj
index 670584e8..64880c4e 100644
--- a/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj
+++ b/Extensions/FreeSql.Extensions.JsonMap/FreeSql.Extensions.JsonMap.csproj
@@ -28,7 +28,7 @@
-
+
diff --git a/FreeSql.DbContext/FreeSql.DbContext.csproj b/FreeSql.DbContext/FreeSql.DbContext.csproj
index 07f35455..2a978474 100644
--- a/FreeSql.DbContext/FreeSql.DbContext.csproj
+++ b/FreeSql.DbContext/FreeSql.DbContext.csproj
@@ -5,7 +5,7 @@
0.12.21
true
YeXiangQin
- FreeSql is the ORM in .NetCore, .NetFramework, And Xamarin. It supports Mysql, Postgresql, SqlServer, Oracle, Sqlite, And Odbc. 达梦
+ FreeSql is the ORM in .NetCore, .NetFramework, And Xamarin. It supports Mysql, Postgresql, SqlServer, Oracle, Sqlite, Odbc, 达梦, And Access
https://github.com/2881099/FreeSql.DbContext
FreeSql ORM DbContext
git
diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml
index dc0203b8..d9f91124 100644
--- a/FreeSql.DbContext/FreeSql.DbContext.xml
+++ b/FreeSql.DbContext/FreeSql.DbContext.xml
@@ -110,6 +110,13 @@
清空状态数据
+
+
+ 根据 lambda 条件删除数据
+
+
+
+
添加
diff --git a/FreeSql.Repository/FreeSql.Repository.csproj b/FreeSql.Repository/FreeSql.Repository.csproj
index 06e825f9..23dd38fa 100644
--- a/FreeSql.Repository/FreeSql.Repository.csproj
+++ b/FreeSql.Repository/FreeSql.Repository.csproj
@@ -4,7 +4,7 @@
netstandard2.0;net45;net40
0.12.21
YeXiangQin
- FreeSql Implementation of General Repository, Support MySql/SqlServer/PostgreSQL/Oracle/Sqlite/达梦, and read/write separation、and split table.
+ FreeSql Implementation of General Repository, Support MySql/SqlServer/PostgreSQL/Oracle/Sqlite/达梦/Access, and read/write separation、and split table.
https://github.com/2881099/FreeSql/wiki/Repository
FreeSql ORM Repository
true
diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs
index d2f84e9a..953f6479 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs
@@ -1014,6 +1014,83 @@ WHERE (((cast(a.`Id` as char)) in (SELECT b.`Title`
a.Id,
a.Clicks
});
+
+ var sqltmp12 = g.mysql.Select()
+ .Where(t => t.IsFinished && (t.AuditorId == "1" || t.AuditorId == "1cb71584-a6dd-4b26-8c88-ed9fb8cf87a3"))
+ .GroupBy(t => new { t.ProcessId, t.NodeId, t.NodeName })
+ .ToSql(t => new WF_TaskGroupBy
+ {
+ TaskId = t.Max(t.Value.Id),
+ TaskType = t.Max(t.Value.Type),
+ ProcessId = t.Key.ProcessId,
+ NodeId = t.Key.NodeId,
+ NodeName = t.Key.NodeName
+ }, FieldAliasOptions.AsProperty);
+
+ var groupsql12 = g.mysql.Select()
+ .AsTable((type, old) => type == typeof(WF_TaskGroupBy) ? $"( {sqltmp12} )" : null)
+ .LeftJoin((a, p) => p.Id == a.ProcessId)
+ .Where((a, p) => (p.IsFinished || a.TaskType == 3) && p.EnabledMark)
+ .ToSql((a, p) => new
+ {
+ WF_Task = a,
+ WF_ProcessInstance = p
+ });
+
+ Assert.Equal(@"SELECT max(a.`Id`) TaskId, max(a.`Type`) TaskType, a.`ProcessId` ProcessId, a.`NodeId` NodeId, a.`NodeName` NodeName
+FROM `WF_Task` a
+WHERE (a.`IsFinished` = 1 AND (a.`AuditorId` = '1' OR a.`AuditorId` = '1cb71584-a6dd-4b26-8c88-ed9fb8cf87a3'))
+GROUP BY a.`ProcessId`, a.`NodeId`, a.`NodeName`", sqltmp12);
+ Assert.Equal(@"SELECT a.`TaskId` as1, a.`TaskType` as2, a.`ProcessId` as3, a.`NodeId` as4, a.`NodeName` as5, b.`Id` as6, b.`TaskType` as7, b.`ProcessId` as8, b.`NodeId` as9, b.`CreateTime` as10, b.`IsFinished` as11, b.`EnabledMark` as12
+FROM ( SELECT max(a.`Id`) TaskId, max(a.`Type`) TaskType, a.`ProcessId` ProcessId, a.`NodeId` NodeId, a.`NodeName` NodeName
+ FROM `WF_Task` a
+ WHERE (a.`IsFinished` = 1 AND (a.`AuditorId` = '1' OR a.`AuditorId` = '1cb71584-a6dd-4b26-8c88-ed9fb8cf87a3'))
+ GROUP BY a.`ProcessId`, a.`NodeId`, a.`NodeName` ) a
+LEFT JOIN `WF_ProcessInstance` b ON b.`Id` = a.`ProcessId`
+WHERE ((b.`IsFinished` OR a.`TaskType` = 3) AND b.`EnabledMark` = 1)", groupsql12);
+
+ var grouplist12 = g.mysql.Select()
+ .AsTable((type, old) => $"( {sqltmp12} )")
+ .LeftJoin((a, p) => p.Id == a.ProcessId)
+ .Where((a, p) => (p.IsFinished || a.TaskType == 3) && p.EnabledMark)
+ .ToList((a, p) => new
+ {
+ WF_Task = a,
+ WF_ProcessInstance = p
+ });
+ }
+
+ [Table(DisableSyncStructure = true)]
+ class WF_TaskGroupBy
+ {
+ public int TaskId { get; set; }
+ public int TaskType { get; set; }
+ public int ProcessId { get; set; }
+ public int NodeId { get; set; }
+ public string NodeName { get; set; }
+ }
+ class WF_Task
+ {
+ [Column(IsIdentity = true)]
+ public int Id { get; set; }
+ public int Type { get; set; }
+ public int ProcessId { get; set; }
+ public int NodeId { get; set; }
+ public string NodeName { get; set; }
+ public string AuditorId { get; set; }
+ public DateTime CreateTime { get; set; }
+ public bool IsFinished { get; set; }
+ }
+ class WF_ProcessInstance
+ {
+ [Column(IsIdentity = true)]
+ public int Id { get; set; }
+ public int TaskType { get; set; }
+ public int ProcessId { get; set; }
+ public int NodeId { get; set; }
+ public DateTime CreateTime { get; set; }
+ public bool IsFinished { get; set; }
+ public bool EnabledMark { get; set; }
}
public class TestInclude_OneToManyModel1
diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs
index d8a227b4..78f2f6e3 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs
@@ -1025,6 +1025,83 @@ WHERE (((cast(a.`Id` as char)) in (SELECT b.`Title`
a.Id,
a.Clicks
});
+
+ var sqltmp12 = g.mysql.Select()
+ .Where(t => t.IsFinished && (t.AuditorId == "1" || t.AuditorId == "1cb71584-a6dd-4b26-8c88-ed9fb8cf87a3"))
+ .GroupBy(t => new { t.ProcessId, t.NodeId, t.NodeName })
+ .ToSql(t => new WF_TaskGroupBy
+ {
+ TaskId = t.Max(t.Value.Id),
+ TaskType = t.Max(t.Value.Type),
+ ProcessId = t.Key.ProcessId,
+ NodeId = t.Key.NodeId,
+ NodeName = t.Key.NodeName
+ }, FieldAliasOptions.AsProperty);
+
+ var groupsql12 = g.mysql.Select()
+ .AsTable((type, old) => type == typeof(WF_TaskGroupBy) ? $"( {sqltmp12} )" : null)
+ .LeftJoin((a, p) => p.Id == a.ProcessId)
+ .Where((a, p) => (p.IsFinished || a.TaskType == 3) && p.EnabledMark)
+ .ToSql((a, p) => new
+ {
+ WF_Task = a,
+ WF_ProcessInstance = p
+ });
+
+ Assert.Equal(@"SELECT max(a.`Id`) TaskId, max(a.`Type`) TaskType, a.`ProcessId` ProcessId, a.`NodeId` NodeId, a.`NodeName` NodeName
+FROM `WF_Task` a
+WHERE (a.`IsFinished` = 1 AND (a.`AuditorId` = '1' OR a.`AuditorId` = '1cb71584-a6dd-4b26-8c88-ed9fb8cf87a3'))
+GROUP BY a.`ProcessId`, a.`NodeId`, a.`NodeName`", sqltmp12);
+ Assert.Equal(@"SELECT a.`TaskId` as1, a.`TaskType` as2, a.`ProcessId` as3, a.`NodeId` as4, a.`NodeName` as5, b.`Id` as6, b.`TaskType` as7, b.`ProcessId` as8, b.`NodeId` as9, b.`CreateTime` as10, b.`IsFinished` as11, b.`EnabledMark` as12
+FROM ( SELECT max(a.`Id`) TaskId, max(a.`Type`) TaskType, a.`ProcessId` ProcessId, a.`NodeId` NodeId, a.`NodeName` NodeName
+ FROM `WF_Task` a
+ WHERE (a.`IsFinished` = 1 AND (a.`AuditorId` = '1' OR a.`AuditorId` = '1cb71584-a6dd-4b26-8c88-ed9fb8cf87a3'))
+ GROUP BY a.`ProcessId`, a.`NodeId`, a.`NodeName` ) a
+LEFT JOIN `WF_ProcessInstance` b ON b.`Id` = a.`ProcessId`
+WHERE ((b.`IsFinished` OR a.`TaskType` = 3) AND b.`EnabledMark` = 1)", groupsql12);
+
+ var grouplist12 = g.mysql.Select()
+ .AsTable((type, old) => $"( {sqltmp12} )")
+ .LeftJoin((a, p) => p.Id == a.ProcessId)
+ .Where((a, p) => (p.IsFinished || a.TaskType == 3) && p.EnabledMark)
+ .ToList((a, p) => new
+ {
+ WF_Task = a,
+ WF_ProcessInstance = p
+ });
+ }
+
+ [Table(DisableSyncStructure = true)]
+ class WF_TaskGroupBy
+ {
+ public int TaskId { get; set; }
+ public int TaskType { get; set; }
+ public int ProcessId { get; set; }
+ public int NodeId { get; set; }
+ public string NodeName { get; set; }
+ }
+ class WF_Task
+ {
+ [Column(IsIdentity = true)]
+ public int Id { get; set; }
+ public int Type { get; set; }
+ public int ProcessId { get; set; }
+ public int NodeId { get; set; }
+ public string NodeName { get; set; }
+ public string AuditorId { get; set; }
+ public DateTime CreateTime { get; set; }
+ public bool IsFinished { get; set; }
+ }
+ class WF_ProcessInstance
+ {
+ [Column(IsIdentity = true)]
+ public int Id { get; set; }
+ public int TaskType { get; set; }
+ public int ProcessId { get; set; }
+ public int NodeId { get; set; }
+ public DateTime CreateTime { get; set; }
+ public bool IsFinished { get; set; }
+ public bool EnabledMark { get; set; }
}
public class TestInclude_OneToManyModel1
diff --git a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.csproj b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.csproj
index 16afde1b..5d7edd8a 100644
--- a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.csproj
+++ b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.csproj
@@ -31,6 +31,7 @@
+
diff --git a/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessDeleteTest.cs b/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessDeleteTest.cs
new file mode 100644
index 00000000..8155d317
--- /dev/null
+++ b/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessDeleteTest.cs
@@ -0,0 +1,93 @@
+using FreeSql.DataAnnotations;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Xunit;
+
+namespace FreeSql.Tests.MsAccess
+{
+ public class MsAccessDeleteTest
+ {
+
+ IDelete delete => g.msaccess.Delete(); //��������
+
+ [Table(Name = "tb_topic22211")]
+ 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.msaccess.Delete().ToSql());
+ var sql = g.msaccess.Delete(new[] { 1, 2 }).ToSql();
+ Assert.Equal("DELETE FROM [tb_topic22211] WHERE ([Id] = 1 OR [Id] = 2)", sql);
+
+ sql = g.msaccess.Delete(new Topic { Id = 1, Title = "test" }).ToSql();
+ Assert.Equal("DELETE FROM [tb_topic22211] WHERE ([Id] = 1)", sql);
+
+ sql = g.msaccess.Delete(new[] { new Topic { Id = 1, Title = "test" }, new Topic { Id = 2, Title = "test" } }).ToSql();
+ Assert.Equal("DELETE FROM [tb_topic22211] WHERE ([Id] = 1 OR [Id] = 2)", sql);
+
+ sql = g.msaccess.Delete(new { id = 1 }).ToSql();
+ Assert.Equal("DELETE FROM [tb_topic22211] WHERE ([Id] = 1)", sql);
+ }
+
+ [Fact]
+ public void Where()
+ {
+ var sql = delete.Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
+ Assert.Equal("DELETE FROM [tb_topic22211] WHERE ([Id] = 1)", sql);
+
+ sql = delete.Where("id = @id", new { id = 1 }).ToSql().Replace("\r\n", "");
+ Assert.Equal("DELETE FROM [tb_topic22211] 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_topic22211] 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_topic22211] WHERE ([Id] IN (1,2,3,4,5,6,7,8,9,10))", sql);
+ }
+ [Fact]
+ public void ExecuteAffrows()
+ {
+
+ var id = g.msaccess.Insert(new Topic { Title = "xxxx", CreateTime = DateTime.Now }).ExecuteIdentity();
+ Assert.Equal(1, delete.Where(a => a.Id == id).ExecuteAffrows());
+ }
+ [Fact]
+ public void ExecuteDeleted()
+ {
+
+ //var item = g.msaccess.Delete(new Topic { Title = "xxxx", CreateTime = DateTime.Now }).ExecuteInserted();
+ //Assert.Equal(item[0].Id, delete.Where(a => a.Id == item[0].Id).ExecuteDeleted()[0].Id);
+ }
+
+ [Fact]
+ public void AsTable()
+ {
+ Assert.Null(g.msaccess.Delete().AsTable(a => "TopicAsTable").ToSql());
+ var sql = g.msaccess.Delete(new[] { 1, 2 }).AsTable(a => "TopicAsTable").ToSql();
+ Assert.Equal("DELETE FROM [TopicAsTable] WHERE ([Id] = 1 OR [Id] = 2)", sql);
+
+ sql = g.msaccess.Delete(new Topic { Id = 1, Title = "test" }).AsTable(a => "TopicAsTable").ToSql();
+ Assert.Equal("DELETE FROM [TopicAsTable] WHERE ([Id] = 1)", sql);
+
+ sql = g.msaccess.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] = 1 OR [Id] = 2)", sql);
+
+ sql = g.msaccess.Delete(new { id = 1 }).AsTable(a => "TopicAsTable").ToSql();
+ Assert.Equal("DELETE FROM [TopicAsTable] WHERE ([Id] = 1)", sql);
+ }
+ }
+}
diff --git a/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessInsertTest.cs b/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessInsertTest.cs
new file mode 100644
index 00000000..c2e44197
--- /dev/null
+++ b/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessInsertTest.cs
@@ -0,0 +1,141 @@
+using FreeSql.DataAnnotations;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Xunit;
+
+namespace FreeSql.Tests.MsAccess
+{
+ public class MsAccessInsertTest
+ {
+ IInsert insert => g.msaccess.Insert(); //��������
+
+ [Table(Name = "tb_topic")]
+ 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; }
+ }
+
+ [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, CreateTime = DateTime.Parse("2019-09-19 20:09:37") });
+
+ var sql = insert.IgnoreColumns(a => a.TypeGuid).AppendData(items.First()).ToSql();
+ Assert.Equal("INSERT INTO [tb_topic]([Clicks], [Title], [CreateTime]) VALUES(0, 'newtitle0', '2019-09-19 20:09:37')", sql);
+
+ sql = insert.IgnoreColumns(a => a.TypeGuid).AppendData(items).ToSql();
+ Assert.Equal("INSERT INTO [tb_topic]([Clicks], [Title], [CreateTime]) VALUES(0, 'newtitle0', '2019-09-19 20:09:37'), (100, 'newtitle1', '2019-09-19 20:09:37'), (200, 'newtitle2', '2019-09-19 20:09:37'), (300, 'newtitle3', '2019-09-19 20:09:37'), (400, 'newtitle4', '2019-09-19 20:09:37'), (500, 'newtitle5', '2019-09-19 20:09:37'), (600, 'newtitle6', '2019-09-19 20:09:37'), (700, 'newtitle7', '2019-09-19 20:09:37'), (800, 'newtitle8', '2019-09-19 20:09:37'), (900, 'newtitle9', '2019-09-19 20:09:37')", sql);
+
+ sql = insert.AppendData(items).InsertColumns(a => a.Title).ToSql();
+ Assert.Equal("INSERT INTO [tb_topic]([Title]) VALUES('newtitle0'), ('newtitle1'), ('newtitle2'), ('newtitle3'), ('newtitle4'), ('newtitle5'), ('newtitle6'), ('newtitle7'), ('newtitle8'), ('newtitle9')", sql);
+
+ sql = insert.IgnoreColumns(a => new { a.CreateTime, a.TypeGuid }).AppendData(items).ToSql();
+ Assert.Equal("INSERT INTO [tb_topic]([Clicks], [Title]) VALUES(0, 'newtitle0'), (100, 'newtitle1'), (200, 'newtitle2'), (300, 'newtitle3'), (400, 'newtitle4'), (500, 'newtitle5'), (600, 'newtitle6'), (700, 'newtitle7'), (800, 'newtitle8'), (900, 'newtitle9')", 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, CreateTime = DateTime.Now });
+
+ var sql = insert.AppendData(items).InsertColumns(a => a.Title).ToSql();
+ Assert.Equal("INSERT INTO [tb_topic]([Title]) VALUES('newtitle0'), ('newtitle1'), ('newtitle2'), ('newtitle3'), ('newtitle4'), ('newtitle5'), ('newtitle6'), ('newtitle7'), ('newtitle8'), ('newtitle9')", sql);
+
+ sql = insert.AppendData(items).InsertColumns(a => new { a.Title, a.Clicks }).ToSql();
+ Assert.Equal("INSERT INTO [tb_topic]([Clicks], [Title]) VALUES(0, 'newtitle0'), (100, 'newtitle1'), (200, 'newtitle2'), (300, 'newtitle3'), (400, 'newtitle4'), (500, 'newtitle5'), (600, 'newtitle6'), (700, 'newtitle7'), (800, 'newtitle8'), (900, 'newtitle9')", 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, CreateTime = DateTime.Now });
+
+ var sql = insert.AppendData(items).IgnoreColumns(a => new { a.CreateTime, a.TypeGuid }).ToSql();
+ Assert.Equal("INSERT INTO [tb_topic]([Clicks], [Title]) VALUES(0, 'newtitle0'), (100, 'newtitle1'), (200, 'newtitle2'), (300, 'newtitle3'), (400, 'newtitle4'), (500, 'newtitle5'), (600, 'newtitle6'), (700, 'newtitle7'), (800, 'newtitle8'), (900, 'newtitle9')", sql);
+
+ sql = insert.AppendData(items).IgnoreColumns(a => new { a.Title, a.CreateTime, a.TypeGuid }).ToSql();
+ Assert.Equal("INSERT INTO [tb_topic]([Clicks]) VALUES(0), (100), (200), (300), (400), (500), (600), (700), (800), (900)", sql);
+
+ g.msaccess.Delete().Where("1=1").ExecuteAffrows();
+ var itemsIgnore = new List();
+ for (var a = 0; a < 32; a++) itemsIgnore.Add(new TopicIgnore { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
+ g.msaccess.Insert().AppendData(itemsIgnore).IgnoreColumns(a => new { a.Title }).ExecuteAffrows();
+ Assert.Equal(32, itemsIgnore.Count);
+ Assert.Equal(32, g.msaccess.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, CreateTime = DateTime.Now });
+
+ Assert.Equal(1, insert.AppendData(items.First()).ExecuteAffrows());
+ Assert.Equal(10, insert.AppendData(items).ExecuteAffrows());
+
+ //items = Enumerable.Range(0, 9989).Select(a => new Topic { Title = "newtitle" + a, CreateTime = DateTime.Now }).ToList();
+ //Assert.Equal(9989, g.msaccess.Insert(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, CreateTime = DateTime.Now });
+
+ Assert.NotEqual(0, insert.AppendData(items.First()).ExecuteIdentity());
+
+
+ //items = Enumerable.Range(0, 9999).Select(a => new Topic { Title = "newtitle" + a, CreateTime = DateTime.Now }).ToList();
+ //var lastId = g.sqlite.Select().Max(a => a.Id);
+ //Assert.NotEqual(lastId, g.msaccess.Insert(items).ExecuteIdentity());
+ }
+
+ [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, CreateTime = DateTime.Parse("2019-09-19 20:01:51") });
+
+ var sql = insert.IgnoreColumns(a => a.TypeGuid).AppendData(items.First()).AsTable(a => "tb_topicAsTable").ToSql();
+ Assert.Equal("INSERT INTO [tb_topicAsTable]([Clicks], [Title], [CreateTime]) VALUES(0, 'newtitle0', '2019-09-19 20:01:51')", sql);
+
+ sql = insert.IgnoreColumns(a => a.TypeGuid).AppendData(items).AsTable(a => "tb_topicAsTable").ToSql();
+ Assert.Equal("INSERT INTO [tb_topicAsTable]([Clicks], [Title], [CreateTime]) VALUES(0, 'newtitle0', '2019-09-19 20:01:51'), (100, 'newtitle1', '2019-09-19 20:01:51'), (200, 'newtitle2', '2019-09-19 20:01:51'), (300, 'newtitle3', '2019-09-19 20:01:51'), (400, 'newtitle4', '2019-09-19 20:01:51'), (500, 'newtitle5', '2019-09-19 20:01:51'), (600, 'newtitle6', '2019-09-19 20:01:51'), (700, 'newtitle7', '2019-09-19 20:01:51'), (800, 'newtitle8', '2019-09-19 20:01:51'), (900, 'newtitle9', '2019-09-19 20:01:51')", sql);
+
+ sql = insert.IgnoreColumns(a => a.TypeGuid).AppendData(items).InsertColumns(a => a.Title).AsTable(a => "tb_topicAsTable").ToSql();
+ Assert.Equal("INSERT INTO [tb_topicAsTable]([Title]) VALUES('newtitle0'), ('newtitle1'), ('newtitle2'), ('newtitle3'), ('newtitle4'), ('newtitle5'), ('newtitle6'), ('newtitle7'), ('newtitle8'), ('newtitle9')", sql);
+
+ sql = insert.IgnoreColumns(a => new { a.CreateTime, a.TypeGuid }).AppendData(items).AsTable(a => "tb_topicAsTable").ToSql();
+ Assert.Equal("INSERT INTO [tb_topicAsTable]([Clicks], [Title]) VALUES(0, 'newtitle0'), (100, 'newtitle1'), (200, 'newtitle2'), (300, 'newtitle3'), (400, 'newtitle4'), (500, 'newtitle5'), (600, 'newtitle6'), (700, 'newtitle7'), (800, 'newtitle8'), (900, 'newtitle9')", sql);
+
+ sql = insert.IgnoreColumns(a => new { a.Title, a.TypeGuid }).InsertColumns(a => a.Title).AppendData(items).AsTable(a => "tb_topicAsTable").ToSql();
+ Assert.Equal("INSERT INTO [tb_topicAsTable]([Title]) VALUES('newtitle0'), ('newtitle1'), ('newtitle2'), ('newtitle3'), ('newtitle4'), ('newtitle5'), ('newtitle6'), ('newtitle7'), ('newtitle8'), ('newtitle9')", sql);
+
+ sql = insert.IgnoreColumns(a => a.TypeGuid).AppendData(items).InsertColumns(a => new { a.Title, a.Clicks }).AsTable(a => "tb_topicAsTable").ToSql();
+ Assert.Equal("INSERT INTO [tb_topicAsTable]([Clicks], [Title]) VALUES(0, 'newtitle0'), (100, 'newtitle1'), (200, 'newtitle2'), (300, 'newtitle3'), (400, 'newtitle4'), (500, 'newtitle5'), (600, 'newtitle6'), (700, 'newtitle7'), (800, 'newtitle8'), (900, 'newtitle9')", sql);
+
+ sql = insert.IgnoreColumns(a => new { a.CreateTime, a.TypeGuid }).AppendData(items).AsTable(a => "tb_topicAsTable").ToSql();
+ Assert.Equal("INSERT INTO [tb_topicAsTable]([Clicks], [Title]) VALUES(0, 'newtitle0'), (100, 'newtitle1'), (200, 'newtitle2'), (300, 'newtitle3'), (400, 'newtitle4'), (500, 'newtitle5'), (600, 'newtitle6'), (700, 'newtitle7'), (800, 'newtitle8'), (900, 'newtitle9')", sql);
+
+ sql = insert.IgnoreColumns(a => new { a.CreateTime, a.Title, a.TypeGuid }).AppendData(items).AsTable(a => "tb_topicAsTable").ToSql();
+ Assert.Equal("INSERT INTO [tb_topicAsTable]([Clicks]) VALUES(0), (100), (200), (300), (400), (500), (600), (700), (800), (900)", sql);
+ }
+ }
+}
diff --git a/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessSelectTest.cs
new file mode 100644
index 00000000..d968da49
--- /dev/null
+++ b/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessSelectTest.cs
@@ -0,0 +1,1414 @@
+using FreeSql.DataAnnotations;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Xunit;
+
+namespace FreeSql.Tests.MsAccess
+{
+ public class MsAccessSelectTest
+ {
+ ISelect select => g.msaccess.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; }
+ }
+ 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.msaccess.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.msaccess.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.msaccess.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.msaccess.Select().Where(a => a.Parent.Name == "xxx")
+ .LeftJoin(a => a.Parent_id == a.Parent.Id)
+ .ToSql();
+
+ var songs = g.msaccess.Select().Limit(10).ToList();
+
+
+ }
+ [Fact]
+ public void ToDataTable()
+ {
+ var items = new List();
+ for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100, CreateTime = DateTime.Now });
+
+ Assert.Equal(1, g.msaccess.Insert().AppendData(items.First()).ExecuteAffrows());
+ Assert.Equal(10, g.msaccess.Insert().AppendData(items).ExecuteAffrows());
+
+ //items = Enumerable.Range(0, 9989).Select(a => new Topic { Title = "newtitle" + a, CreateTime = DateTime.Now }).ToList();
+ //;
+ //Assert.Equal(9989, g.msaccess.Insert(items).NoneParameter().ExecuteAffrows());
+
+ var dt1 = select.Limit(10).ToDataTable();
+ var dt2 = select.Limit(10).ToDataTable("id, now()");
+ 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表的属性
+ }
+ [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() { });
+
+ g.msaccess.Insert().AppendData(new TestGuidIdToList()).ExecuteAffrows();
+ var testGuidId5 = g.msaccess.Select().ToList();
+ var testGuidId6 = g.msaccess.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);
+ }
+ 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, b) => b.Guid == a.TypeGuid && b.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] b ON (b.[Guid] = a.[TypeGuid] AND b.[Name] = 'xxx')) 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.[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 = ?)", 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 = ?)", 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, b) => b.Guid == a.TypeGuid && b.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] b ON (b.[Guid] = a.[TypeGuid] AND b.[Name] = 'xxx')) 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.[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 = ?)", 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 = ?)", 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, b) => b.Guid == a.TypeGuid && b.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] b ON (b.[Guid] = a.[TypeGuid] AND b.[Name] = 'xxx')) 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.[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 = ?)", 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 = ?)", 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 = ?", 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 = ?)", 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 = ?", 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 = ?)", 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 = ?", 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())
+ .Limit(2)
+ .Count(out var trycount)
+ .ToList(a => new
+ {
+ a.Key.tt2,
+ cou1 = a.Count(),
+ 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.msaccess.Insert().AppendData(new TestTypeInfo { Name = "Name" + DateTime.Now.ToString("yyyyMMddHHmmss") }).ExecuteIdentity();
+ g.msaccess.Insert().AppendData(new TestInfo { Title = "Title" + DateTime.Now.ToString("yyyyMMddHHmmss"), CreateTime = DateTime.Now, TypeGuid = (int)testpid1 }).ExecuteAffrows();
+
+ 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 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 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), avg = a.Avg(Convert.ToInt64(a.Key.Id)), count = a.Count(), max = a.Max(a.Key.Id), min = a.Min(a.Key.Id) });
+ }
+ [Fact]
+ public void OrderBy()
+ {
+ var sql = select.OrderBy(a => new Random().NextDouble()).ToList();
+ }
+ [Fact]
+ public void Take_Limit()
+ {
+ var sql = select.Limit(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] as as1, a.[Clicks] as as2, a.[TypeGuid] as as3, a.[Title] as as4, a.[CreateTime] as as5, (SELECT TOP 1 sum(b.[Id])
+ FROM [tb_topic22] b) as 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] as as1, a.[Clicks] as as2, a.[TypeGuid] as as3, a.[Title] as as4, a.[CreateTime] as as5, (SELECT TOP 1 min(b.[Id])
+ FROM [tb_topic22] b) as 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] as as1, a.[Clicks] as as2, a.[TypeGuid] as as3, a.[Title] as as4, a.[CreateTime] as as5, (SELECT TOP 1 max(b.[Id])
+ FROM [tb_topic22] b) as 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] as as1, a.[Clicks] as as2, a.[TypeGuid] as as3, a.[Title] as as4, a.[CreateTime] as as5, (SELECT TOP 1 avg(b.[Id])
+ FROM [tb_topic22] b) as 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 (((cstr(a.[Id])) 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 (type == typeof(Topic)) return oldname + "AsTable1";
+ else if (type == typeof(TestTypeInfo)) return oldname + "AsTable2";
+ return oldname + "AsTable";
+ };
+
+ //����е�������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_topic22AsTable1] a LEFT JOIN [TestTypeInfoAsTable2] 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_topic22AsTable1] a LEFT JOIN [TestTypeInfoAsTable2] 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_topic22AsTable1] a LEFT JOIN [TestTypeInfoAsTable2] a__Type ON (a__Type.[Guid] = a.[TypeGuid] AND a__Type.[Name] = 'xxx')) LEFT JOIN [TestTypeParentInfoAsTable] 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_topic22AsTable1] a LEFT JOIN [TestTypeInfoAsTable2] 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_topic22AsTable1] a LEFT JOIN [TestTypeInfoAsTable2] b ON (b.[Guid] = a.[TypeGuid] AND b.[Name] = 'xxx')", sql);
+
+ query = select.LeftJoin((a, b) => b.Guid == a.TypeGuid && b.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_topic22AsTable1] a LEFT JOIN [TestTypeInfoAsTable2] b ON (b.[Guid] = a.[TypeGuid] AND b.[Name] = 'xxx')) LEFT JOIN [TestTypeInfoAsTable2] a__Type ON (a__Type.[Guid] = a.[TypeGuid])) LEFT JOIN [TestTypeParentInfoAsTable] 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_topic22AsTable1] a LEFT JOIN [TestTypeInfoAsTable2] a__Type ON (a__Type.[Guid] = a.[TypeGuid])) LEFT JOIN [TestTypeParentInfoAsTable] a__Type__Parent ON (a__Type__Parent.[Id] = a__Type.[ParentId])", sql);
+
+ query = select
+ .LeftJoin((a, b) => b.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], b.[Guid], b.[ParentId], b.[Name], a.[Title], a.[CreateTime] FROM (([tb_topic22AsTable1] a LEFT JOIN [TestTypeInfoAsTable2] a__Type ON (a__Type.[Guid] = a.[TypeGuid])) LEFT JOIN [TestTypeInfoAsTable2] b ON (b.[Guid] = a.[TypeGuid])) LEFT JOIN [TestTypeParentInfoAsTable] 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_topic22AsTable1] a LEFT JOIN [TestTypeInfoAsTable2] b ON (a.[TypeGuid] = b.[Guid])) LEFT JOIN [TestTypeParentInfoAsTable] 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_topic22AsTable1] 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_topic22AsTable1] 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 TestInclude_OneToManyModel1
+ {
+ [Column(IsIdentity = true)]
+ public int id { get; set; }
+ public virtual TestInclude_OneToManyModel2 model2 { get; set; }
+
+ public string m1name { get; set; }
+ }
+ public class TestInclude_OneToManyModel2
+ {
+ [Column(IsPrimary = true)]
+ public int model2id { get; set; }
+ public virtual TestInclude_OneToManyModel1 model1 { get; set; }
+
+ public string m2setting { get; set; }
+
+ public List childs { get; set; }
+ }
+ public class TestInclude_OneToManyModel3
+ {
+ [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 TestInclude_OneToManyModel4
+ {
+ [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 TestInclude_OneToManyModel1 { m1name = DateTime.Now.Second.ToString() };
+ model1.id = (int)g.msaccess.Insert(model1).ExecuteIdentity();
+ var model2 = new TestInclude_OneToManyModel2 { model2id = model1.id, m2setting = DateTime.Now.Second.ToString() };
+ g.msaccess.Insert(model2).ExecuteAffrows();
+
+ var model3_1 = new TestInclude_OneToManyModel3 { model2111Idaaa = model1.id, title = "testmodel3__111" };
+ model3_1.id = (int)g.msaccess.Insert(model3_1).ExecuteIdentity();
+ var model3_2 = new TestInclude_OneToManyModel3 { model2111Idaaa = model1.id, title = "testmodel3__222" };
+ model3_2.id = (int)g.msaccess.Insert(model3_2).ExecuteIdentity();
+ var model3_3 = new TestInclude_OneToManyModel3 { model2111Idaaa = model1.id, title = "testmodel3__333" };
+ model3_3.id = (int)g.msaccess.Insert(model3_2).ExecuteIdentity();
+
+ var model4s = new[] {
+ new TestInclude_OneToManyModel4{ model3333Id333 = model3_1.id, title444 = "testmodel3_4__111" },
+ new TestInclude_OneToManyModel4{ model3333Id333 = model3_1.id, title444 = "testmodel3_4__222" },
+ new TestInclude_OneToManyModel4{ model3333Id333 = model3_2.id, title444 = "testmodel3_4__111" },
+ new TestInclude_OneToManyModel4{ model3333Id333 = model3_2.id, title444 = "testmodel3_4__222" },
+ new TestInclude_OneToManyModel4{ model3333Id333 = model3_2.id, title444 = "testmodel3_4__333" }
+ };
+ Assert.Equal(5, g.msaccess.Insert(model4s).ExecuteAffrows());
+
+ var t0 = g.msaccess.Select()
+ .IncludeMany(a => a.childs.Where(m3 => m3.model2111Idaaa == a.model2id))
+ .Where(a => a.model2id <= model1.id)
+ .ToList();
+
+ var t1 = g.msaccess.Select()
+ .IncludeMany(a => a.model2.childs.Where(m3 => m3.model2111Idaaa == a.model2.model2id))
+ .Where(a => a.id <= model1.id)
+ .ToList();
+
+ var t2 = g.msaccess.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.msaccess.Select()
+ .IncludeMany(a => a.childs.Take(1).Where(m3 => m3.model2111Idaaa == a.model2id))
+ .Where(a => a.model2id <= model1.id)
+ .ToList();
+
+ var t11 = g.msaccess.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.msaccess.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();
+ }
+
+ public class TestInclude_OneToManyModel11
+ {
+ [Column(IsIdentity = true)]
+ public int id { get; set; }
+ public int model2id { get; set; }
+ public string m3setting { get; set; }
+ public TestInclude_OneToManyModel22 model2 { get; set; }
+ public string m1name { get; set; }
+ }
+
+ public class TestInclude_OneToManyModel22
+ {
+ [Column(IsIdentity = true)]
+ public int id { get; set; }
+ public string m2setting { get; set; }
+ public List childs { get; set; }
+ }
+ public class TestInclude_OneToManyModel33
+ {
+ [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 TestInclude_OneToManyModel22 { m2setting = DateTime.Now.Second.ToString() };
+ model2.id = (int)g.msaccess.Insert(model2).ExecuteIdentity();
+
+ var model3s = new[]
+ {
+ new TestInclude_OneToManyModel33 {model2Id = model2.id, title = "testmodel3__111", setting = setting},
+ new TestInclude_OneToManyModel33 {model2Id = model2.id, title = "testmodel3__222", setting = setting},
+ new TestInclude_OneToManyModel33 {model2Id = model2.id, title = "testmodel3__333", setting = setting}
+ };
+ Assert.Equal(3, g.msaccess.Insert(model3s).ExecuteAffrows());
+
+ var model1 = new TestInclude_OneToManyModel11 { m1name = DateTime.Now.Second.ToString(), model2id = model2.id, m3setting = setting };
+ model1.id = (int)g.msaccess.Insert(model1).ExecuteIdentity();
+
+ var t1 = g.msaccess.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.msaccess.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);
+ }
+
+ [Fact]
+ public void Include_OneToChilds()
+ {
+ var tag1 = new Tag
+ {
+ Ddd = DateTime.Now.Second,
+ Name = "test_oneToChilds_01_中国"
+ };
+ tag1.Id = (int)g.msaccess.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.msaccess.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.msaccess.Insert(tag1_2).ExecuteIdentity();
+
+ var tag2 = new Tag
+ {
+ Ddd = DateTime.Now.Second,
+ Name = "test_oneToChilds_02_美国"
+ };
+ tag2.Id = (int)g.msaccess.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.msaccess.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.msaccess.Insert(tag2_2).ExecuteIdentity();
+
+ var tags0 = g.msaccess.Select()
+ .Include(a => a.Parent)
+ .Where(a => a.Id == tag1.Id || a.Id == tag2.Id)
+ .ToList();
+
+ var tags1 = g.msaccess.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.msaccess.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.msaccess.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.msaccess.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.msaccess.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.msaccess.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();
+ }
+
+ [Fact]
+ public void Include_ManyToMany()
+ {
+
+ var tag1 = new Tag
+ {
+ Ddd = DateTime.Now.Second,
+ Name = "test_manytoMany_01_中国"
+ };
+ tag1.Id = (int)g.msaccess.Insert(tag1).ExecuteIdentity();
+ var tag2 = new Tag
+ {
+ Ddd = DateTime.Now.Second,
+ Name = "test_manytoMany_02_美国"
+ };
+ tag2.Id = (int)g.msaccess.Insert(tag2).ExecuteIdentity();
+ var tag3 = new Tag
+ {
+ Ddd = DateTime.Now.Second,
+ Name = "test_manytoMany_03_日本"
+ };
+ tag3.Id = (int)g.msaccess.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.msaccess.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.msaccess.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.msaccess.Insert(song3).ExecuteIdentity();
+
+ g.msaccess.Insert(new Song_tag { Song_id = song1.Id, Tag_id = tag1.Id }).ExecuteAffrows();
+ g.msaccess.Insert(new Song_tag { Song_id = song2.Id, Tag_id = tag1.Id }).ExecuteAffrows();
+ g.msaccess.Insert(new Song_tag { Song_id = song3.Id, Tag_id = tag1.Id }).ExecuteAffrows();
+ g.msaccess.Insert(new Song_tag { Song_id = song1.Id, Tag_id = tag2.Id }).ExecuteAffrows();
+ g.msaccess.Insert(new Song_tag { Song_id = song3.Id, Tag_id = tag2.Id }).ExecuteAffrows();
+ g.msaccess.Insert(new Song_tag { Song_id = song3.Id, Tag_id = tag3.Id }).ExecuteAffrows();
+
+ var songs1 = g.msaccess.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.msaccess.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.msaccess.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.msaccess.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.msaccess.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.msaccess.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);
+ }
+
+ 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.msaccess.Select().ToDelete().ExecuteAffrows();
+ Assert.Equal(0, g.msaccess.Select().Count());
+ g.msaccess.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.msaccess.Select().Where(a => a.name.StartsWith("name")).ToDelete().ExecuteAffrows());
+ Assert.Equal(3, g.msaccess.Select().Count());
+ Assert.Equal(3, g.msaccess.Select().Where(a => a.name.StartsWith("nick")).Count());
+
+ g.msaccess.Select().ToDelete().ExecuteAffrows();
+ Assert.Equal(0, g.msaccess.Select().Count());
+ g.msaccess.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.msaccess.Select().Where(a => a.name.StartsWith("name")).ToDelete().ExecuteAffrows());
+ Assert.Equal(3, g.msaccess.Select().Count());
+ Assert.Equal(3, g.msaccess.Select().Where(a => a.name.StartsWith("nick")).Count());
+
+ g.msaccess.Select().ToDelete().ExecuteAffrows();
+ Assert.Equal(0, g.msaccess.Select().Count());
+ g.msaccess.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.msaccess.Select().Where(a => a.name.StartsWith("name")).ToDelete().ExecuteAffrows());
+ Assert.Equal(3, g.msaccess.Select().Count());
+ Assert.Equal(3, g.msaccess.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.msaccess.Select().ToDelete().ExecuteAffrows();
+ Assert.Equal(0, g.msaccess.Select().Count());
+ g.msaccess.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.msaccess.Select().Where(a => a.name.StartsWith("name")).ToUpdate().Set(a => a.name, "nick?").ExecuteAffrows());
+ Assert.Equal(5, g.msaccess.Select().Count());
+ Assert.Equal(5, g.msaccess.Select().Where(a => a.name.StartsWith("nick")).Count());
+
+ g.msaccess.Select().ToDelete().ExecuteAffrows();
+ Assert.Equal(0, g.msaccess.Select().Count());
+ g.msaccess.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.msaccess.Select().Where(a => a.name.StartsWith("name")).ToUpdate().Set(a => a.name, "nick?").ExecuteAffrows());
+ Assert.Equal(5, g.msaccess.Select().Count());
+ Assert.Equal(5, g.msaccess.Select().Where(a => a.name.StartsWith("nick")).Count());
+
+ g.msaccess.Select().ToDelete().ExecuteAffrows();
+ Assert.Equal(0, g.msaccess.Select().Count());
+ g.msaccess.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.msaccess.Select().Where(a => a.name.StartsWith("name")).ToUpdate().Set(a => a.name, "nick?").ExecuteAffrows());
+ Assert.Equal(5, g.msaccess.Select().Count());
+ Assert.Equal(5, g.msaccess.Select().Where(a => a.name.StartsWith("nick")).Count());
+ }
+
+ [Fact]
+ public void ForUpdate()
+ {
+ var orm = g.msaccess;
+
+ 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 TOP 1 a.[id], a.[name] FROM [ToUpd1Pk] a", sql);
+ orm.Select().ForUpdate().Limit(1).ToList();
+
+ sql = orm.Select().ForUpdate(true).Limit(1).ToSql().Replace("\r\n", "");
+ Assert.Equal("SELECT TOP 1 a.[id], a.[name] FROM [ToUpd1Pk] a", sql);
+ orm.Select().ForUpdate(true).Limit(1).ToList();
+ });
+ }
+ }
+}
diff --git a/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessUpdateTest.cs
new file mode 100644
index 00000000..804f570e
--- /dev/null
+++ b/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessUpdateTest.cs
@@ -0,0 +1,141 @@
+using FreeSql.DataAnnotations;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Xunit;
+
+namespace FreeSql.Tests.MsAccess
+{
+ public class MsAccessUpdateTest
+ {
+ IUpdate update => g.msaccess.Update();
+
+ [Table(Name = "tb_topic")]
+ 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; }
+ }
+
+ [Fact]
+ public void Dywhere()
+ {
+ Assert.Null(g.msaccess.Update().ToSql());
+ Assert.Equal("UPDATE [tb_topic] SET title='test' \r\nWHERE ([Id] = 1 OR [Id] = 2)", g.msaccess.Update(new[] { 1, 2 }).SetRaw("title='test'").ToSql());
+ Assert.Equal("UPDATE [tb_topic] SET title='test1' \r\nWHERE ([Id] = 1)", g.msaccess.Update(new Topic { Id = 1, Title = "test" }).SetRaw("title='test1'").ToSql());
+ Assert.Equal("UPDATE [tb_topic] SET title='test1' \r\nWHERE ([Id] = 1 OR [Id] = 2)", g.msaccess.Update(new[] { new Topic { Id = 1, Title = "test" }, new Topic { Id = 2, Title = "test" } }).SetRaw("title='test1'").ToSql());
+ Assert.Equal("UPDATE [tb_topic] SET title='test1' \r\nWHERE ([Id] = 1)", g.msaccess.Update(new { id = 1 }).SetRaw("title='test1'").ToSql());
+ }
+
+ [Fact]
+ public void SetSource()
+ {
+ var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).IgnoreColumns(a => a.TypeGuid).ToSql().Replace("\r\n", "");
+ Assert.Equal("UPDATE [tb_topic] SET [Clicks] = NULL, [Title] = 'newtitle', [CreateTime] = '1970-01-01 00:00:00' 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 });
+ items[0].Clicks = null;
+
+ sql = update.SetSource(items).IgnoreColumns(a => a.TypeGuid).ToSql().Replace("\r\n", "");
+ Assert.Equal("UPDATE [tb_topic] SET [Clicks] = CASE [Id] WHEN 1 THEN NULL WHEN 2 THEN 100 WHEN 3 THEN 200 WHEN 4 THEN 300 WHEN 5 THEN 400 WHEN 6 THEN 500 WHEN 7 THEN 600 WHEN 8 THEN 700 WHEN 9 THEN 800 WHEN 10 THEN 900 END, [Title] = CASE [Id] WHEN 1 THEN 'newtitle0' WHEN 2 THEN 'newtitle1' WHEN 3 THEN 'newtitle2' WHEN 4 THEN 'newtitle3' WHEN 5 THEN 'newtitle4' WHEN 6 THEN 'newtitle5' WHEN 7 THEN 'newtitle6' WHEN 8 THEN 'newtitle7' WHEN 9 THEN 'newtitle8' WHEN 10 THEN 'newtitle9' END, [CreateTime] = CASE [Id] WHEN 1 THEN '1970-01-01 00:00:00' WHEN 2 THEN '1970-01-01 00:00:00' WHEN 3 THEN '1970-01-01 00:00:00' WHEN 4 THEN '1970-01-01 00:00:00' WHEN 5 THEN '1970-01-01 00:00:00' WHEN 6 THEN '1970-01-01 00:00:00' WHEN 7 THEN '1970-01-01 00:00:00' WHEN 8 THEN '1970-01-01 00:00:00' WHEN 9 THEN '1970-01-01 00:00:00' WHEN 10 THEN '1970-01-01 00:00:00' END WHERE ([Id] IN (1,2,3,4,5,6,7,8,9,10))", sql);
+
+ sql = update.SetSource(items).IgnoreColumns(a => new { a.Clicks, a.CreateTime, a.TypeGuid }).ToSql().Replace("\r\n", "");
+ Assert.Equal("UPDATE [tb_topic] SET [Title] = CASE [Id] WHEN 1 THEN 'newtitle0' WHEN 2 THEN 'newtitle1' WHEN 3 THEN 'newtitle2' WHEN 4 THEN 'newtitle3' WHEN 5 THEN 'newtitle4' WHEN 6 THEN 'newtitle5' WHEN 7 THEN 'newtitle6' WHEN 8 THEN 'newtitle7' WHEN 9 THEN 'newtitle8' WHEN 10 THEN 'newtitle9' END WHERE ([Id] IN (1,2,3,4,5,6,7,8,9,10))", sql);
+
+ sql = update.SetSource(items).IgnoreColumns(a => a.TypeGuid).Set(a => a.CreateTime, new DateTime(2020, 1, 1)).ToSql().Replace("\r\n", "");
+ Assert.Equal("UPDATE [tb_topic] SET [CreateTime] = '2020-01-01 00:00:00' WHERE ([Id] IN (1,2,3,4,5,6,7,8,9,10))", sql);
+ }
+ [Fact]
+ public void IgnoreColumns()
+ {
+ var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).IgnoreColumns(a => new { a.Clicks, a.CreateTime, a.TypeGuid }).ToSql().Replace("\r\n", "");
+ Assert.Equal("UPDATE [tb_topic] SET [Title] = 'newtitle' WHERE ([Id] = 1)", sql);
+ }
+ [Fact]
+ public void UpdateColumns()
+ {
+ var sql = update.SetSource(new Topic { Id = 1, Title = "newtitle" }).UpdateColumns(a => a.Title).ToSql().Replace("\r\n", "");
+ Assert.Equal("UPDATE [tb_topic] SET [Title] = 'newtitle' WHERE ([Id] = 1)", sql);
+ }
+ [Fact]
+ public void Set()
+ {
+ var sql = update.Where(a => a.Id == 1).Set(a => a.Title, "newtitle").ToSql().Replace("\r\n", "");
+ Assert.Equal("UPDATE [tb_topic] SET [Title] = 'newtitle' WHERE ([Id] = 1)", sql);
+
+ sql = update.Where(a => a.Id == 1).Set(a => a.Title, "newtitle").Set(a => a.CreateTime, new DateTime(2020, 1, 1)).ToSql().Replace("\r\n", "");
+ Assert.Equal("UPDATE [tb_topic] SET [Title] = 'newtitle', [CreateTime] = '2020-01-01 00:00:00' WHERE ([Id] = 1)", sql);
+
+ sql = update.Set(a => a.Clicks * 10 / 1).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
+ Assert.Equal("UPDATE [tb_topic] SET [Clicks] = iif(isnull([Clicks]), 0, [Clicks]) * 10 / 1 WHERE ([Id] = 1)", sql);
+
+ sql = update.Set(a => a.Id - 10).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
+ Assert.Equal("UPDATE [tb_topic] SET [Id] = ([Id] - 10) WHERE ([Id] = 1)", sql);
+
+ int incrv = 10;
+ sql = update.Set(a => a.Clicks * incrv / 1).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
+ Assert.Equal("UPDATE [tb_topic] SET [Clicks] = iif(isnull([Clicks]), 0, [Clicks]) * 10 / 1 WHERE ([Id] = 1)", sql);
+
+ sql = update.Set(a => a.Id - incrv).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
+ Assert.Equal("UPDATE [tb_topic] SET [Id] = ([Id] - 10) WHERE ([Id] = 1)", sql);
+
+ sql = update.Set(a => a.Clicks == a.Clicks * 10 / 1).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
+ Assert.Equal("UPDATE [tb_topic] SET [Clicks] = [Clicks] * 10 / 1 WHERE ([Id] = 1)", sql);
+
+ sql = update.Set(a => a.Id == 10).Where(a => a.Id == 1).ToSql().Replace("\r\n", "");
+ Assert.Equal("UPDATE [tb_topic] SET [Id] = 10 WHERE ([Id] = 1)", sql);
+ }
+ [Fact]
+ public void SetRaw()
+ {
+ var sql = update.Where(a => a.Id == 1).SetRaw("clicks = clicks + ?", new { incrClick = 1 }).ToSql().Replace("\r\n", "");
+ Assert.Equal("UPDATE [tb_topic] SET clicks = clicks + ? WHERE ([Id] = 1)", sql);
+ }
+ [Fact]
+ public void Where()
+ {
+ var sql = update.Where(a => a.Id == 1).SetRaw("title='newtitle'").ToSql().Replace("\r\n", "");
+ Assert.Equal("UPDATE [tb_topic] SET title='newtitle' WHERE ([Id] = 1)", sql);
+
+ sql = update.Where("id = ?", new { id = 1 }).SetRaw("title='newtitle'").ToSql().Replace("\r\n", "");
+ Assert.Equal("UPDATE [tb_topic] SET title='newtitle' WHERE (id = ?)", sql);
+
+ var item = new Topic { Id = 1, Title = "newtitle" };
+ sql = update.Where(item).SetRaw("title='newtitle'").ToSql().Replace("\r\n", "");
+ Assert.Equal("UPDATE [tb_topic] SET title='newtitle' 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 = update.Where(items).SetRaw("title='newtitle'").ToSql().Replace("\r\n", "");
+ Assert.Equal("UPDATE [tb_topic] SET title='newtitle' WHERE ([Id] IN (1,2,3,4,5,6,7,8,9,10))", sql);
+ }
+ [Fact]
+ public void ExecuteAffrows()
+ {
+ var items = new List();
+ for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });
+
+ var time = DateTime.Now;
+ var items222 = g.msaccess.Select().Where(a => a.CreateTime > Convert.ToDateTime(time)).Limit(10).ToList();
+
+ update.SetSource(items.First()).NoneParameter().ExecuteAffrows();
+ update.SetSource(items).NoneParameter().ExecuteAffrows();
+ }
+
+ [Fact]
+ public void AsTable()
+ {
+ Assert.Null(g.msaccess.Update().ToSql());
+ Assert.Equal("UPDATE [tb_topicAsTable] SET title='test' \r\nWHERE ([Id] = 1 OR [Id] = 2)", g.msaccess.Update(new[] { 1, 2 }).SetRaw("title='test'").AsTable(a => "tb_topicAsTable").ToSql());
+ Assert.Equal("UPDATE [tb_topicAsTable] SET title='test1' \r\nWHERE ([Id] = 1)", g.msaccess.Update(new Topic { Id = 1, Title = "test" }).SetRaw("title='test1'").AsTable(a => "tb_topicAsTable").ToSql());
+ Assert.Equal("UPDATE [tb_topicAsTable] SET title='test1' \r\nWHERE ([Id] = 1 OR [Id] = 2)", g.msaccess.Update(new[] { new Topic { Id = 1, Title = "test" }, new Topic { Id = 2, Title = "test" } }).SetRaw("title='test1'").AsTable(a => "tb_topicAsTable").ToSql());
+ Assert.Equal("UPDATE [tb_topicAsTable] SET title='test1' \r\nWHERE ([Id] = 1)", g.msaccess.Update(new { id = 1 }).SetRaw("title='test1'").AsTable(a => "tb_topicAsTable").ToSql());
+ }
+ }
+}
diff --git a/FreeSql.Tests/FreeSql.Tests/MsAccess/MapType/BoolNullableTest.cs b/FreeSql.Tests/FreeSql.Tests/MsAccess/MapType/BoolNullableTest.cs
new file mode 100644
index 00000000..4ba03b05
--- /dev/null
+++ b/FreeSql.Tests/FreeSql.Tests/MsAccess/MapType/BoolNullableTest.cs
@@ -0,0 +1,1571 @@
+using FreeSql.DataAnnotations;
+using System;
+using Xunit;
+
+namespace FreeSql.Tests.MsAccessMapType
+{
+ public class BoolNullableTest
+ {
+ class BoolNullableMap
+ {
+ public Guid id { get; set; }
+ [Column(MapType = typeof(bool))]
+ public bool? tobool { get; set; } = true;
+
+ [Column(MapType = typeof(sbyte))]
+ public bool? tosbyte { get; set; } = true;
+ [Column(MapType = typeof(sbyte?))]
+ public bool? tosbytenullable { get; set; } = true;
+
+ [Column(MapType = typeof(short))]
+ public bool? toshort { get; set; } = true;
+
+ [Column(MapType = typeof(short?))]
+ public bool? toshortnullable { get; set; } = true;
+
+ [Column(MapType = typeof(int))]
+ public bool? toint { get; set; } = true;
+
+ [Column(MapType = typeof(int?))]
+ public bool? tointnullable { get; set; } = true;
+
+ [Column(MapType = typeof(long))]
+ public bool? tolong { get; set; } = true;
+ [Column(MapType = typeof(long?))]
+ public bool? tolongnullable { get; set; } = true;
+
+ [Column(MapType = typeof(byte))]
+ public bool? tobyte { get; set; } = true;
+ [Column(MapType = typeof(byte?))]
+ public bool? tobytenullable { get; set; } = true;
+
+ [Column(MapType = typeof(ushort))]
+ public bool? toushort { get; set; } = true;
+
+ [Column(MapType = typeof(ushort?))]
+ public bool? toushortnullable { get; set; } = true;
+
+ [Column(MapType = typeof(uint))]
+ public bool? touint { get; set; } = true;
+
+ [Column(MapType = typeof(uint?))]
+ public bool? touintnullable { get; set; } = true;
+
+ [Column(MapType = typeof(ulong))]
+ public bool? toulong { get; set; } = true;
+ [Column(MapType = typeof(ulong?))]
+ public bool? toulongnullable { get; set; } = true;
+
+ [Column(MapType = typeof(string))]
+ public bool? tostring { get; set; } = true;
+ }
+ [Fact]
+ public void Bool()
+ {
+ //insert
+ var orm = g.msaccess;
+ var item = new BoolNullableMap { };
+ Assert.Equal(1, orm.Insert().AppendData(item).ExecuteAffrows());
+ var find = orm.Select().Where(a => a.id == item.id && a.tobool == true).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Equal(item.tobool, find.tobool);
+ Assert.Equal(true, find.tobool);
+
+ item = new BoolNullableMap { tobool = false };
+ Assert.Equal(1, orm.Insert().AppendData(item).ExecuteAffrows());
+ find = orm.Select().Where(a => a.id == item.id && a.tobool == false).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Equal(item.tobool, find.tobool);
+ Assert.Equal(false, find.tobool);
+
+ item = new BoolNullableMap { tobool = null };
+ Assert.Equal(1, orm.Insert().AppendData(item).ExecuteAffrows());
+ Assert.Null(orm.Select().Where(a => a.id == item.id && a.tobool == null).First());
+ find = orm.Select().Where(a => a.id == item.id && a.tobool == false).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.NotEqual(item.tobool, find.tobool);
+ Assert.Equal(false, find.tobool);
+
+ //update all
+ item.tobool = true;
+ Assert.Equal(1, orm.Update().SetSource(item).ExecuteAffrows());
+ find = orm.Select().Where(a => a.id == item.id && a.tobool == true).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Equal(item.tobool, find.tobool);
+ Assert.Equal(true, find.tobool);
+
+ item.tobool = false;
+ Assert.Equal(1, orm.Update().SetSource(item).ExecuteAffrows());
+ find = orm.Select().Where(a => a.id == item.id && a.tobool == false).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Equal(item.tobool, find.tobool);
+ Assert.Equal(false, find.tobool);
+
+ item.tobool = null;
+ Assert.Equal(1, orm.Update().SetSource(item).ExecuteAffrows());
+ Assert.Null(orm.Select().Where(a => a.id == item.id && a.tobool == null).First());
+ find = orm.Select().Where(a => a.id == item.id && a.tobool == false).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.NotEqual(item.tobool, find.tobool);
+ Assert.Equal(false, find.tobool);
+
+ //update set
+ Assert.Equal(1, orm.Update().Where(a => a.id == item.id).Set(a => a.tobool, true).ExecuteAffrows());
+ find = orm.Select().Where(a => a.id == item.id && a.tobool == true).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Equal(true, find.tobool);
+
+ Assert.Equal(1, orm.Update().Where(a => a.id == item.id).Set(a => a.tobool, false).ExecuteAffrows());
+ find = orm.Select().Where(a => a.id == item.id && a.tobool == false).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Equal(false, find.tobool);
+
+ Assert.Equal(1, orm.Update().Where(a => a.id == item.id).Set(a => a.tobool, null).ExecuteAffrows());
+ Assert.Null(orm.Select().Where(a => a.id == item.id && a.tobool == null).First());
+ find = orm.Select().Where(a => a.id == item.id && a.tobool == false).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Equal(false, find.tobool);
+
+ //delete
+ Assert.Equal(0, orm.Delete().Where(a => a.id == item.id && a.tobool == true).ExecuteAffrows());
+ Assert.Equal(0, orm.Delete().Where(a => a.id == item.id && a.tobool == null).ExecuteAffrows());
+ Assert.Equal(1, orm.Delete().Where(a => a.id == item.id && a.tobool == false).ExecuteAffrows());
+ Assert.Null(orm.Select().Where(a => a.id == item.id).First());
+ }
+ [Fact]
+ public void SByte()
+ {
+ //insert
+ var orm = g.msaccess;
+ var item = new BoolNullableMap { };
+ Assert.Equal(1, orm.Insert().AppendData(item).ExecuteAffrows());
+ var find = orm.Select().Where(a => a.id == item.id && a.tosbyte == true).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Equal(item.tosbyte, find.tosbyte);
+ Assert.Equal(true, find.tosbyte);
+
+ item = new BoolNullableMap { tosbyte = false };
+ Assert.Equal(1, orm.Insert().AppendData(item).ExecuteAffrows());
+ find = orm.Select().Where(a => a.id == item.id && a.tosbyte == false).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Equal(item.tosbyte, find.tosbyte);
+ Assert.Equal(false, find.tosbyte);
+
+ item = new BoolNullableMap { tosbyte = null };
+ Assert.Equal(1, orm.Insert().AppendData(item).ExecuteAffrows());
+ Assert.Null(orm.Select().Where(a => a.id == item.id && a.tosbyte == null).First());
+ find = orm.Select().Where(a => a.id == item.id && a.tosbyte == false).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.NotEqual(item.tosbyte, find.tosbyte);
+ Assert.Equal(false, find.tosbyte);
+
+ //update all
+ item.tosbyte = true;
+ Assert.Equal(1, orm.Update().SetSource(item).ExecuteAffrows());
+ find = orm.Select().Where(a => a.id == item.id && a.tosbyte == true).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Equal(item.tosbyte, find.tosbyte);
+ Assert.Equal(true, find.tosbyte);
+
+ item.tosbyte = false;
+ Assert.Equal(1, orm.Update().SetSource(item).ExecuteAffrows());
+ find = orm.Select().Where(a => a.id == item.id && a.tosbyte == false).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Equal(item.tosbyte, find.tosbyte);
+ Assert.Equal(false, find.tosbyte);
+
+ item.tosbyte = null;
+ Assert.Equal(1, orm.Update().SetSource(item).ExecuteAffrows());
+ Assert.Null(orm.Select().Where(a => a.id == item.id && a.tosbyte == null).First());
+ find = orm.Select().Where(a => a.id == item.id && a.tosbyte == false).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.NotEqual(item.tosbyte, find.tosbyte);
+ Assert.Equal(false, find.tosbyte);
+
+ //update set
+ Assert.Equal(1, orm.Update().Where(a => a.id == item.id).Set(a => a.tosbyte, true).ExecuteAffrows());
+ find = orm.Select().Where(a => a.id == item.id && a.tosbyte == true).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Equal(true, find.tosbyte);
+
+ Assert.Equal(1, orm.Update().Where(a => a.id == item.id).Set(a => a.tosbyte, false).ExecuteAffrows());
+ find = orm.Select().Where(a => a.id == item.id && a.tosbyte == false).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Equal(false, find.tosbyte);
+
+ Assert.Equal(1, orm.Update().Where(a => a.id == item.id).Set(a => a.tosbyte, null).ExecuteAffrows());
+ Assert.Null(orm.Select().Where(a => a.id == item.id && a.tosbyte == null).First());
+ find = orm.Select().Where(a => a.id == item.id && a.tosbyte == false).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Equal(false, find.tosbyte);
+
+ //delete
+ Assert.Equal(0, orm.Delete().Where(a => a.id == item.id && a.tosbyte == true).ExecuteAffrows());
+ Assert.Equal(0, orm.Delete().Where(a => a.id == item.id && a.tosbyte == null).ExecuteAffrows());
+ Assert.Equal(1, orm.Delete().Where(a => a.id == item.id && a.tosbyte == false).ExecuteAffrows());
+ Assert.Null(orm.Select().Where(a => a.id == item.id).First());
+ }
+ [Fact]
+ public void SByteNullable()
+ {
+ //insert
+ var orm = g.msaccess;
+ var item = new BoolNullableMap { };
+ Assert.Equal(1, orm.Insert().AppendData(item).ExecuteAffrows());
+ var find = orm.Select().Where(a => a.id == item.id && a.tosbytenullable == true).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Equal(item.tosbytenullable, find.tosbytenullable);
+ Assert.Equal(true, find.tosbytenullable);
+
+ item = new BoolNullableMap { tosbytenullable = false };
+ Assert.Equal(1, orm.Insert().AppendData(item).ExecuteAffrows());
+ find = orm.Select().Where(a => a.id == item.id && a.tosbytenullable == false).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Equal(item.tosbytenullable, find.tosbytenullable);
+ Assert.Equal(false, find.tosbytenullable);
+
+ item = new BoolNullableMap { tosbytenullable = null };
+ Assert.Equal(1, orm.Insert().AppendData(item).ExecuteAffrows());
+ Assert.Null(orm.Select().Where(a => a.id == item.id && a.tosbytenullable == false).First());
+ find = orm.Select().Where(a => a.id == item.id && a.tosbytenullable == null).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Equal(item.tosbytenullable, find.tosbytenullable);
+ Assert.Null(find.tosbytenullable);
+
+ //update all
+ item.tosbytenullable = true;
+ Assert.Equal(1, orm.Update().SetSource(item).ExecuteAffrows());
+ find = orm.Select().Where(a => a.id == item.id && a.tosbytenullable == true).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Equal(item.tosbytenullable, find.tosbytenullable);
+ Assert.Equal(true, find.tosbytenullable);
+
+ item.tosbytenullable = false;
+ Assert.Equal(1, orm.Update().SetSource(item).ExecuteAffrows());
+ find = orm.Select().Where(a => a.id == item.id && a.tosbytenullable == false).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Equal(item.tosbytenullable, find.tosbytenullable);
+ Assert.Equal(false, find.tosbytenullable);
+
+ item.tosbytenullable = null;
+ Assert.Equal(1, orm.Update().SetSource(item).ExecuteAffrows());
+ Assert.Null(orm.Select().Where(a => a.id == item.id && a.tosbytenullable == false).First());
+ find = orm.Select().Where(a => a.id == item.id && a.tosbytenullable == null).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Equal(item.tosbytenullable, find.tosbytenullable);
+ Assert.Null(find.tosbytenullable);
+
+ //update set
+ Assert.Equal(1, orm.Update().Where(a => a.id == item.id).Set(a => a.tosbytenullable, true).ExecuteAffrows());
+ find = orm.Select().Where(a => a.id == item.id && a.tosbytenullable == true).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Equal(true, find.tosbytenullable);
+
+ Assert.Equal(1, orm.Update().Where(a => a.id == item.id).Set(a => a.tosbytenullable, false).ExecuteAffrows());
+ find = orm.Select().Where(a => a.id == item.id && a.tosbytenullable == false).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Equal(false, find.tosbytenullable);
+
+ Assert.Equal(1, orm.Update().Where(a => a.id == item.id).Set(a => a.tosbytenullable, null).ExecuteAffrows());
+ Assert.Null(orm.Select().Where(a => a.id == item.id && a.tosbytenullable == false).First());
+ find = orm.Select().Where(a => a.id == item.id && a.tosbytenullable == null).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Null(find.tosbytenullable);
+
+ //delete
+ Assert.Equal(0, orm.Delete().Where(a => a.id == item.id && a.tosbytenullable == true).ExecuteAffrows());
+ Assert.Equal(1, orm.Delete().Where(a => a.id == item.id && a.tosbytenullable == null).ExecuteAffrows());
+ Assert.Equal(0, orm.Delete().Where(a => a.id == item.id && a.tosbytenullable == false).ExecuteAffrows());
+ Assert.Null(orm.Select().Where(a => a.id == item.id).First());
+ }
+ [Fact]
+ public void Short()
+ {
+ //insert
+ var orm = g.msaccess;
+ var item = new BoolNullableMap { };
+ Assert.Equal(1, orm.Insert().AppendData(item).ExecuteAffrows());
+ var find = orm.Select().Where(a => a.id == item.id && a.toshort == true).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Equal(item.toshort, find.toshort);
+ Assert.Equal(true, find.toshort);
+
+ item = new BoolNullableMap { toshort = false };
+ Assert.Equal(1, orm.Insert().AppendData(item).ExecuteAffrows());
+ find = orm.Select().Where(a => a.id == item.id && a.toshort == false).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Equal(item.toshort, find.toshort);
+ Assert.Equal(false, find.toshort);
+
+ item = new BoolNullableMap { toshort = null };
+ Assert.Equal(1, orm.Insert().AppendData(item).ExecuteAffrows());
+ Assert.Null(orm.Select().Where(a => a.id == item.id && a.toshort == null).First());
+ find = orm.Select().Where(a => a.id == item.id && a.toshort == false).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.NotEqual(item.toshort, find.toshort);
+ Assert.Equal(false, find.toshort);
+
+ //update all
+ item.toshort = true;
+ Assert.Equal(1, orm.Update().SetSource(item).ExecuteAffrows());
+ find = orm.Select().Where(a => a.id == item.id && a.toshort == true).First();
+ Assert.NotNull(find);
+ Assert.Equal(item.id, find.id);
+ Assert.Equal(item.toshort, find.toshort);
+ Assert.Equal(true, find.toshort);
+
+ item.toshort = false;
+ Assert.Equal(1, orm.Update().SetSource(item).ExecuteAffrows());
+ find = orm.Select