diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 28fdb213..ddd18378 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -110,6 +110,13 @@ 清空状态数据 + + + 根据 lambda 条件删除数据 + + + + 添加 @@ -204,6 +211,15 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + 动态Type,在使用 Repository<object> 后使用本方法,指定实体类型 diff --git a/FreeSql.Tests/FreeSql.Tests.DbContext/g.cs b/FreeSql.Tests/FreeSql.Tests.DbContext/g.cs index 6bb48a5e..5e6cf923 100644 --- a/FreeSql.Tests/FreeSql.Tests.DbContext/g.cs +++ b/FreeSql.Tests/FreeSql.Tests.DbContext/g.cs @@ -44,7 +44,7 @@ public class g static Lazy pgsqlLazy = new Lazy(() => new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=10") .UseAutoSyncStructure(true) - .UseSyncStructureToLower(true) + .UseNameConvert(FreeSql.Internal.NameConvertType.ToLower) .UseLazyLoading(true) .UseMonitorCommand( cmd => @@ -63,7 +63,7 @@ public class g .UseConnectionString(FreeSql.DataType.Oracle, "user id=user1;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=10") .UseAutoSyncStructure(true) .UseLazyLoading(true) - .UseSyncStructureToUpper(true) + .UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper) .UseNoneCommandParameter(true) .UseMonitorCommand( 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 b1881760..77ba34f0 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs @@ -270,7 +270,7 @@ namespace FreeSql.Tests.MySqlConnector }) }); var ddd = g.mysql.Select().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList(); - Assert.Equal(1, ddd.Count); + Assert.Single(ddd); Assert.Equal(2, ddd[0].Childs.Count); } public class District diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/OnDuplicateKeyUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/OnDuplicateKeyUpdateTest.cs index ff852737..2145dedb 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/OnDuplicateKeyUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/OnDuplicateKeyUpdateTest.cs @@ -21,10 +21,10 @@ namespace FreeSql.Tests.MySqlConnector { g.mysql.Delete(new[] { 100, 101, 102 }).ExecuteAffrows(); var odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 100, title = "title-100", time = DateTime.Parse("2000-01-01") }).NoneParameter().OnDuplicateKeyUpdate(); - Assert.Equal(odku1.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(100, 'title-100', '2000-01-01 00:00:00.000') + Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(100, 'title-100', '2000-01-01 00:00:00.000') ON DUPLICATE KEY UPDATE `title` = VALUES(`title`), -`time` = VALUES(`time`)"); +`time` = VALUES(`time`)", odku1.ToSql()); Assert.Equal(1, odku1.ExecuteAffrows()); var odku2 = g.mysql.Insert(new[] { @@ -32,10 +32,10 @@ ON DUPLICATE KEY UPDATE new TestOnDuplicateKeyUpdateInfo { id = 101, title = "title-101", time = DateTime.Parse("2000-01-01") }, new TestOnDuplicateKeyUpdateInfo { id = 102, title = "title-102", time = DateTime.Parse("2000-01-01") } }).NoneParameter().OnDuplicateKeyUpdate(); - Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(100, 'title-100', '2000-01-01 00:00:00.000'), (101, 'title-101', '2000-01-01 00:00:00.000'), (102, 'title-102', '2000-01-01 00:00:00.000') + Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(100, 'title-100', '2000-01-01 00:00:00.000'), (101, 'title-101', '2000-01-01 00:00:00.000'), (102, 'title-102', '2000-01-01 00:00:00.000') ON DUPLICATE KEY UPDATE `title` = VALUES(`title`), -`time` = VALUES(`time`)"); +`time` = VALUES(`time`)", odku2.ToSql()); odku2.ExecuteAffrows(); } @@ -44,10 +44,10 @@ ON DUPLICATE KEY UPDATE { g.mysql.Delete(new[] { 200, 201, 202 }).ExecuteAffrows(); var odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 200, title = "title-200", time = DateTime.Parse("2000-01-01") }).IgnoreColumns(a => a.time).NoneParameter().OnDuplicateKeyUpdate(); - Assert.Equal(odku1.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200') + Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200') ON DUPLICATE KEY UPDATE `title` = VALUES(`title`), -`time` = '2000-01-01 00:00:00.000'"); +`time` = '2000-01-01 00:00:00.000'", odku1.ToSql()); Assert.Equal(1, odku1.ExecuteAffrows()); var odku2 = g.mysql.Insert(new[] { @@ -55,21 +55,21 @@ ON DUPLICATE KEY UPDATE new TestOnDuplicateKeyUpdateInfo { id = 201, title = "title-201", time = DateTime.Parse("2000-01-01") }, new TestOnDuplicateKeyUpdateInfo { id = 202, title = "title-202", time = DateTime.Parse("2000-01-01") } }).IgnoreColumns(a => a.time).NoneParameter().OnDuplicateKeyUpdate(); - Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202') + Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202') ON DUPLICATE KEY UPDATE `title` = VALUES(`title`), `time` = CASE `id` WHEN 200 THEN '2000-01-01 00:00:00.000' WHEN 201 THEN '2000-01-01 00:00:00.000' -WHEN 202 THEN '2000-01-01 00:00:00.000' END"); +WHEN 202 THEN '2000-01-01 00:00:00.000' END", odku2.ToSql()); odku2.ExecuteAffrows(); g.mysql.Delete(new[] { 200, 201, 202 }).ExecuteAffrows(); odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 200, title = "title-200", time = DateTime.Parse("2000-01-01") }).IgnoreColumns(a => a.time).NoneParameter().OnDuplicateKeyUpdate().IgnoreColumns(a => a.title); - Assert.Equal(odku1.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200') + Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200') ON DUPLICATE KEY UPDATE -`time` = '2000-01-01 00:00:00.000'"); +`time` = '2000-01-01 00:00:00.000'", odku1.ToSql()); Assert.Equal(1, odku1.ExecuteAffrows()); odku2 = g.mysql.Insert(new[] { @@ -77,12 +77,12 @@ ON DUPLICATE KEY UPDATE new TestOnDuplicateKeyUpdateInfo { id = 201, title = "title-201", time = DateTime.Parse("2000-01-01") }, new TestOnDuplicateKeyUpdateInfo { id = 202, title = "title-202", time = DateTime.Parse("2000-01-01") } }).IgnoreColumns(a => a.time).NoneParameter().OnDuplicateKeyUpdate().IgnoreColumns(a => a.title); - Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202') + Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202') ON DUPLICATE KEY UPDATE `time` = CASE `id` WHEN 200 THEN '2000-01-01 00:00:00.000' WHEN 201 THEN '2000-01-01 00:00:00.000' -WHEN 202 THEN '2000-01-01 00:00:00.000' END"); +WHEN 202 THEN '2000-01-01 00:00:00.000' END", odku2.ToSql()); odku2.ExecuteAffrows(); } @@ -91,10 +91,10 @@ WHEN 202 THEN '2000-01-01 00:00:00.000' END"); { g.mysql.Delete(new[] { 300, 301, 302 }).ExecuteAffrows(); var odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 300, title = "title-300", time = DateTime.Parse("2000-01-01") }).InsertColumns(a => a.title).NoneParameter().OnDuplicateKeyUpdate(); - Assert.Equal(odku1.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300') + Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300') ON DUPLICATE KEY UPDATE `title` = VALUES(`title`), -`time` = '2000-01-01 00:00:00.000'"); +`time` = '2000-01-01 00:00:00.000'", odku1.ToSql()); Assert.Equal(1, odku1.ExecuteAffrows()); var odku2 = g.mysql.Insert(new[] { @@ -102,21 +102,21 @@ ON DUPLICATE KEY UPDATE new TestOnDuplicateKeyUpdateInfo { id = 301, title = "title-301", time = DateTime.Parse("2000-01-01") }, new TestOnDuplicateKeyUpdateInfo { id = 302, title = "title-302", time = DateTime.Parse("2000-01-01") } }).InsertColumns(a => a.title).NoneParameter().OnDuplicateKeyUpdate(); - Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302') + Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302') ON DUPLICATE KEY UPDATE `title` = VALUES(`title`), `time` = CASE `id` WHEN 300 THEN '2000-01-01 00:00:00.000' WHEN 301 THEN '2000-01-01 00:00:00.000' -WHEN 302 THEN '2000-01-01 00:00:00.000' END"); +WHEN 302 THEN '2000-01-01 00:00:00.000' END", odku2.ToSql()); odku2.ExecuteAffrows(); g.mysql.Delete(new[] { 300, 301, 302 }).ExecuteAffrows(); odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 300, title = "title-300", time = DateTime.Parse("2000-01-01") }).InsertColumns(a => a.title).NoneParameter().OnDuplicateKeyUpdate().UpdateColumns(a => a.time); - Assert.Equal(odku1.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300') + Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300') ON DUPLICATE KEY UPDATE -`time` = '2000-01-01 00:00:00.000'"); +`time` = '2000-01-01 00:00:00.000'", odku1.ToSql()); Assert.Equal(1, odku1.ExecuteAffrows()); odku2 = g.mysql.Insert(new[] { @@ -124,12 +124,12 @@ ON DUPLICATE KEY UPDATE new TestOnDuplicateKeyUpdateInfo { id = 301, title = "title-301", time = DateTime.Parse("2000-01-01") }, new TestOnDuplicateKeyUpdateInfo { id = 302, title = "title-302", time = DateTime.Parse("2000-01-01") } }).InsertColumns(a => a.title).NoneParameter().OnDuplicateKeyUpdate().UpdateColumns(a => a.time); - Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302') + Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302') ON DUPLICATE KEY UPDATE `time` = CASE `id` WHEN 300 THEN '2000-01-01 00:00:00.000' WHEN 301 THEN '2000-01-01 00:00:00.000' -WHEN 302 THEN '2000-01-01 00:00:00.000' END"); +WHEN 302 THEN '2000-01-01 00:00:00.000' END", odku2.ToSql()); odku2.ExecuteAffrows(); } @@ -138,9 +138,9 @@ WHEN 302 THEN '2000-01-01 00:00:00.000' END"); { g.mysql.Delete(new[] { 400, 401, 402 }).ExecuteAffrows(); var odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 400, title = "title-400", time = DateTime.Parse("2000-01-01") }).NoneParameter().OnDuplicateKeyUpdate().Set(a => a.time, DateTime.Parse("2020-1-1")); - Assert.Equal(odku1.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000') + Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000') ON DUPLICATE KEY UPDATE -`time` = '2020-01-01 00:00:00.000'"); +`time` = '2020-01-01 00:00:00.000'", odku1.ToSql()); Assert.Equal(1, odku1.ExecuteAffrows()); var odku2 = g.mysql.Insert(new[] { @@ -148,18 +148,18 @@ ON DUPLICATE KEY UPDATE new TestOnDuplicateKeyUpdateInfo { id = 401, title = "title-401", time = DateTime.Parse("2000-01-01") }, new TestOnDuplicateKeyUpdateInfo { id = 402, title = "title-402", time = DateTime.Parse("2000-01-01") } }).NoneParameter().OnDuplicateKeyUpdate().Set(a => a.time, DateTime.Parse("2020-1-1")); - Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000'), (401, 'title-401', '2000-01-01 00:00:00.000'), (402, 'title-402', '2000-01-01 00:00:00.000') + Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000'), (401, 'title-401', '2000-01-01 00:00:00.000'), (402, 'title-402', '2000-01-01 00:00:00.000') ON DUPLICATE KEY UPDATE -`time` = '2020-01-01 00:00:00.000'"); +`time` = '2020-01-01 00:00:00.000'", odku2.ToSql()); odku2.ExecuteAffrows(); var dt2020 = DateTime.Parse("2020-1-1"); g.mysql.Delete(new[] { 400, 401, 402 }).ExecuteAffrows(); odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 400, title = "title-400", time = DateTime.Parse("2000-01-01") }).NoneParameter().OnDuplicateKeyUpdate().Set(a => a.time == dt2020); - Assert.Equal(odku1.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000') + Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000') ON DUPLICATE KEY UPDATE -`time` = '2020-01-01 00:00:00.000'"); +`time` = '2020-01-01 00:00:00.000'", odku1.ToSql()); Assert.Equal(1, odku1.ExecuteAffrows()); odku2 = g.mysql.Insert(new[] { @@ -167,17 +167,17 @@ ON DUPLICATE KEY UPDATE new TestOnDuplicateKeyUpdateInfo { id = 401, title = "title-401", time = DateTime.Parse("2000-01-01") }, new TestOnDuplicateKeyUpdateInfo { id = 402, title = "title-402", time = DateTime.Parse("2000-01-01") } }).NoneParameter().OnDuplicateKeyUpdate().Set(a => a.time == dt2020); - Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000'), (401, 'title-401', '2000-01-01 00:00:00.000'), (402, 'title-402', '2000-01-01 00:00:00.000') + Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000'), (401, 'title-401', '2000-01-01 00:00:00.000'), (402, 'title-402', '2000-01-01 00:00:00.000') ON DUPLICATE KEY UPDATE -`time` = '2020-01-01 00:00:00.000'"); +`time` = '2020-01-01 00:00:00.000'", odku2.ToSql()); odku2.ExecuteAffrows(); g.mysql.Delete(new[] { 400, 401, 402 }).ExecuteAffrows(); odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 400, title = "title-400", time = DateTime.Parse("2000-01-01") }).NoneParameter().OnDuplicateKeyUpdate().Set(a => new { time = dt2020, title = a.title + "123" }); - Assert.Equal(odku1.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000') + Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000') ON DUPLICATE KEY UPDATE -`time` = '2020-01-01 00:00:00.000', `title` = concat(`title`, '123')"); +`time` = '2020-01-01 00:00:00.000', `title` = concat(`title`, '123')", odku1.ToSql()); Assert.Equal(1, odku1.ExecuteAffrows()); odku2 = g.mysql.Insert(new[] { @@ -185,9 +185,9 @@ ON DUPLICATE KEY UPDATE new TestOnDuplicateKeyUpdateInfo { id = 401, title = "title-401", time = DateTime.Parse("2000-01-01") }, new TestOnDuplicateKeyUpdateInfo { id = 402, title = "title-402", time = DateTime.Parse("2000-01-01") } }).NoneParameter().OnDuplicateKeyUpdate().Set(a => new { time = dt2020, title = a.title + "123" }); - Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000'), (401, 'title-401', '2000-01-01 00:00:00.000'), (402, 'title-402', '2000-01-01 00:00:00.000') + Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000'), (401, 'title-401', '2000-01-01 00:00:00.000'), (402, 'title-402', '2000-01-01 00:00:00.000') ON DUPLICATE KEY UPDATE -`time` = '2020-01-01 00:00:00.000', `title` = concat(`title`, '123')"); +`time` = '2020-01-01 00:00:00.000', `title` = concat(`title`, '123')", odku2.ToSql()); odku2.ExecuteAffrows(); } diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs index f4ab9a5b..34f665fc 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs @@ -211,7 +211,7 @@ namespace FreeSql.Tests.Odbc.Dameng }) }); var ddd = g.dameng.Select().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList(); - Assert.Equal(1, ddd.Count); + Assert.Single(ddd); Assert.Equal(2, ddd[0].Childs.Count); } public class District diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcSelectTest.cs index 9e404f0f..bf9b4bdc 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcSelectTest.cs @@ -202,7 +202,7 @@ namespace FreeSql.Tests.Odbc.Default }) }); var ddd = g.odbc.Select().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList(); - Assert.Equal(1, ddd.Count); + Assert.Single(ddd); Assert.Equal(2, ddd[0].Childs.Count); } public class District 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 04c11f44..39785795 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs @@ -311,7 +311,7 @@ namespace FreeSql.Tests.Odbc.MySql }) }); var ddd = g.mysql.Select().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList(); - Assert.Equal(1, ddd.Count); + Assert.Single(ddd); Assert.Equal(2, ddd[0].Childs.Count); } public class District diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs index f003c4cf..22d51222 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs @@ -211,7 +211,7 @@ namespace FreeSql.Tests.Odbc.Oracle }) }); var ddd = g.oracle.Select().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList(); - Assert.Equal(1, ddd.Count); + Assert.Single(ddd); Assert.Equal(2, ddd[0].Childs.Count); } public class District diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs index 38514d5c..b7b9b513 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs @@ -287,7 +287,7 @@ namespace FreeSql.Tests.Odbc.PostgreSQL }) }); var ddd = g.pgsql.Select().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList(); - Assert.Equal(1, ddd.Count); + Assert.Single(ddd); Assert.Equal(2, ddd[0].Childs.Count); } public class District diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs index b868dc81..e636c42b 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs @@ -201,7 +201,7 @@ namespace FreeSql.Tests.Odbc.SqlServer }) }); var ddd = g.sqlserver.Select().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList(); - Assert.Equal(1, ddd.Count); + Assert.Single(ddd); Assert.Equal(2, ddd[0].Childs.Count); } public class District diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/g.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/g.cs index 4bb24a55..e0b589bd 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/g.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/g.cs @@ -35,7 +35,7 @@ public class g //.UseConnectionFactory(FreeSql.DataType.OdbcOracle, () => new System.Data.Odbc.OdbcConnection("Driver={Oracle in XE};Server=//127.0.0.1:1521/XE;Persist Security Info=False;Trusted_Connection=Yes;UID=odbc1;PWD=123456")) .UseAutoSyncStructure(true) .UseLazyLoading(true) - .UseSyncStructureToUpper(true) + .UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper) //.UseNoneCommandParameter(true) .UseMonitorCommand( @@ -50,7 +50,7 @@ public class g .UseConnectionString(FreeSql.DataType.OdbcPostgreSQL, "Driver={PostgreSQL Unicode(x64)};Server=192.168.164.10;Port=5432;UID=postgres;PWD=123456;Database=tedb_odbc;Pooling=true;Maximum Pool Size=2") //.UseConnectionFactory(FreeSql.DataType.OdbcPostgreSQL, () => new System.Data.Odbc.OdbcConnection("Driver={PostgreSQL Unicode(x64)};Server=192.168.164.10;Port=5432;UID=postgres;PWD=123456;Database=tedb_odbc;Pooling=true;")) .UseAutoSyncStructure(true) - .UseSyncStructureToLower(true) + .UseNameConvert(FreeSql.Internal.NameConvertType.ToLower) .UseLazyLoading(true) .UseMonitorCommand( cmd => Trace.WriteLine(cmd.CommandText), //监听SQL命令对象,在执行前 @@ -74,7 +74,7 @@ public class g //.UseConnectionFactory(FreeSql.DataType.OdbcDameng, () => new System.Data.Odbc.OdbcConnection("Driver={DM8 ODBC DRIVER};Server=127.0.0.1:5236;Persist Security Info=False;Trusted_Connection=Yes;UID=USER1;PWD=123456789")) .UseAutoSyncStructure(true) .UseLazyLoading(true) - .UseSyncStructureToUpper(true) + .UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper) //.UseNoneCommandParameter(true) .UseMonitorCommand( @@ -89,7 +89,7 @@ public class g //.UseConnectionFactory(FreeSql.DataType.OdbcDameng, () => new System.Data.Odbc.OdbcConnection("Driver={DM8 ODBC DRIVER};Server=127.0.0.1:5236;Persist Security Info=False;Trusted_Connection=Yes;UID=USER1;PWD=123456789")) .UseAutoSyncStructure(true) .UseLazyLoading(true) - .UseSyncStructureToUpper(true) + .UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper) //.UseNoneCommandParameter(true) .UseMonitorCommand( diff --git a/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessSelectTest.cs index aa03e685..d4191350 100644 --- a/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MsAccess/Curd/MsAccessSelectTest.cs @@ -202,7 +202,7 @@ namespace FreeSql.Tests.MsAccess }) }); var ddd = g.msaccess.Select().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList(); - Assert.Equal(1, ddd.Count); + Assert.Single(ddd); Assert.Equal(2, ddd[0].Childs.Count); } public class District diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs index 86e92f50..223ce220 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs @@ -311,7 +311,7 @@ namespace FreeSql.Tests.MySql }) }); var ddd = g.mysql.Select().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList(); - Assert.Equal(1, ddd.Count); + Assert.Single(ddd); Assert.Equal(2, ddd[0].Childs.Count); } public class District diff --git a/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs index 2c3c2928..88cab797 100644 --- a/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs @@ -211,7 +211,7 @@ namespace FreeSql.Tests.Oracle }) }); var ddd = g.oracle.Select().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList(); - Assert.Equal(1, ddd.Count); + Assert.Single(ddd); Assert.Equal(2, ddd[0].Childs.Count); } public class District diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs index f1a5ff31..1cfd5d9f 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs @@ -287,7 +287,7 @@ namespace FreeSql.Tests.PostgreSQL }) }); var ddd = g.pgsql.Select().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList(); - Assert.Equal(1, ddd.Count); + Assert.Single(ddd); Assert.Equal(2, ddd[0].Childs.Count); } public class District diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs index 11d570b7..c739c6a6 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs @@ -211,7 +211,7 @@ namespace FreeSql.Tests.SqlServer }) }); var ddd = g.sqlserver.Select().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList(); - Assert.Equal(1, ddd.Count); + Assert.Single(ddd); Assert.Equal(2, ddd[0].Childs.Count); } public class District diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs index 9414c910..86f622e9 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs @@ -228,7 +228,7 @@ namespace FreeSql.Tests.Sqlite }) }); var ddd = g.sqlite.Select().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList(); - Assert.Equal(1, ddd.Count); + Assert.Single(ddd); Assert.Equal(2, ddd[0].Childs.Count); } public class District diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs index f7df0e51..ddd934e8 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest1.cs @@ -574,7 +574,7 @@ namespace FreeSql.Tests IFreeSql fsql = new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=7") - .UseEntityPropertyNameConvert(Internal.StringConvertType.PascalCaseToUnderscoreWithLower) + .UseNameConvert(Internal.NameConvertType.PascalCaseToUnderscoreWithLower) .UseNoneCommandParameter(true) .UseAutoSyncStructure(true) //自动同步实体结构到数据库 .UseMonitorCommand(a => Trace.WriteLine(a.CommandText)) diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs index 67dadc54..cbdb223b 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs @@ -247,7 +247,7 @@ namespace FreeSql.Tests .UseAutoSyncStructure(true) .UseGenerateCommandParameterWithLambda(true) .UseLazyLoading(true) - .UseSyncStructureToUpper(true) + .UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper) .UseMonitorCommand(cmd => Trace.WriteLine("\r\n线程" + Thread.CurrentThread.ManagedThreadId + ": " + cmd.CommandText)) .Build()); ib.Register("db3", () => new FreeSql.FreeSqlBuilder() diff --git a/FreeSql.Tests/FreeSql.Tests/g.cs b/FreeSql.Tests/FreeSql.Tests/g.cs index 985eae8b..992dfb44 100644 --- a/FreeSql.Tests/FreeSql.Tests/g.cs +++ b/FreeSql.Tests/FreeSql.Tests/g.cs @@ -29,7 +29,7 @@ public class g //.UseConnectionFactory(FreeSql.DataType.PostgreSQL, () => new Npgsql.NpgsqlConnection("Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;")) .UseAutoSyncStructure(true) //.UseGenerateCommandParameterWithLambda(true) - .UseSyncStructureToLower(true) + .UseNameConvert(FreeSql.Internal.NameConvertType.ToLower) .UseLazyLoading(true) .UseMonitorCommand( cmd => Trace.WriteLine("\r\n线程" + Thread.CurrentThread.ManagedThreadId + ": " + cmd.CommandText) //监听SQL命令对象,在执行前 @@ -60,7 +60,7 @@ public class g .UseAutoSyncStructure(true) //.UseGenerateCommandParameterWithLambda(true) .UseLazyLoading(true) - .UseSyncStructureToUpper(true) + .UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper) //.UseNoneCommandParameter(true) .UseMonitorCommand( diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index cd174404..d9dcf8c7 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -902,10 +902,11 @@ - + 不使用参数化,可通过 IFreeSql.CodeFirst.IsNotCommandParameter 全局性设置 + 是否不使用参数化 @@ -1937,10 +1938,11 @@ - + 不使用参数化,可通过 IFreeSql.CodeFirst.IsNotCommandParameter 全局性设置 + 是否不使用参数化 @@ -2692,12 +2694,12 @@ - 转小写同步结构 + 转小写同步结构,适用 PostgreSQL - 转大写同步结构 + 转大写同步结构,适用 Oracle/达梦 @@ -3178,14 +3180,52 @@ BigApple -> bigapple - + + + 不进行任何处理 + + + 将帕斯卡命名字符串转换为下划线分隔字符串 BigApple -> Big_Apple - - + + + + 将帕斯卡命名字符串转换为下划线分隔字符串,且转换为全大写 + + BigApple -> BIG_APPLE + + + + + 将帕斯卡命名字符串转换为下划线分隔字符串,且转换为全小写 + + BigApple -> big_apple + + + + + 将下划线分隔字符串命名字符串转换为帕斯卡 + + big_apple -> BigApple + + + + + 将字符串转换为大写 + + BigApple -> BIGAPPLE + + + + + 将字符串转换为小写 + + BigApple -> bigapple + diff --git a/FreeSql/FreeSqlBuilder.cs b/FreeSql/FreeSqlBuilder.cs index 26720246..c4b74eec 100644 --- a/FreeSql/FreeSqlBuilder.cs +++ b/FreeSql/FreeSqlBuilder.cs @@ -21,6 +21,7 @@ namespace FreeSql bool _isGenerateCommandParameterWithLambda = false; bool _isLazyLoading = false; StringConvertType _entityPropertyConvertType = StringConvertType.None; + NameConvertType _nameConvertType = NameConvertType.None; Action _aopCommandExecuting = null; Action _aopCommandExecuted = null; Type _providerType = null; @@ -82,6 +83,7 @@ namespace FreeSql /// /// true:转小写, false:不转 /// + [Obsolete("请使用 UseNameConvert(NameConvertType.ToLower),或者 fsql.CodeFirst.IsSyncStructureToLower = value")] public FreeSqlBuilder UseSyncStructureToLower(bool value) { _isSyncStructureToLower = value; @@ -92,6 +94,7 @@ namespace FreeSql /// /// true:转大写, false:不转 /// + [Obsolete("请使用 UseNameConvert(NameConvertType.ToUpper),或者 fsql.CodeFirst.IsSyncStructureToUpper = value")] public FreeSqlBuilder UseSyncStructureToUpper(bool value) { _isSyncStructureToUpper = value; @@ -163,12 +166,25 @@ namespace FreeSql /// /// /// + [Obsolete("请使用 UseNameConvert 功能")] public FreeSqlBuilder UseEntityPropertyNameConvert(StringConvertType convertType) { _entityPropertyConvertType = convertType; return this; } + /// + /// 实体类名 -> 数据库表名,命名转换(类名、属性名都生效) + /// 优先级小于 [Table(Name = "xxx")]、[Column(Name = "xxx")] + /// + /// + /// + public FreeSqlBuilder UseNameConvert(NameConvertType convertType) + { + _nameConvertType = convertType; + return this; + } + public IFreeSql Build() => Build(); public IFreeSql Build() { @@ -263,27 +279,60 @@ namespace FreeSql //添加实体属性名全局AOP转换处理 if (_entityPropertyConvertType != StringConvertType.None) { + string PascalCaseToUnderScore(string str) => string.Concat(str.Select((x, i) => i > 0 && char.IsUpper(x) ? "_" + x.ToString() : x.ToString())); + switch (_entityPropertyConvertType) { case StringConvertType.Lower: - ret.Aop.ConfigEntityProperty += (_, e) => - e.ModifyResult.Name = e.Property.Name.ToLower(); + ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = e.Property.Name.ToLower(); break; case StringConvertType.Upper: - ret.Aop.ConfigEntityProperty += (_, e) => - e.ModifyResult.Name = e.Property.Name.ToUpper(); + ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = e.Property.Name.ToUpper(); break; case StringConvertType.PascalCaseToUnderscore: - ret.Aop.ConfigEntityProperty += (_, e) => - e.ModifyResult.Name = StringUtils.PascalCaseToUnderScore(e.Property.Name); + ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = PascalCaseToUnderScore(e.Property.Name); break; case StringConvertType.PascalCaseToUnderscoreWithLower: - ret.Aop.ConfigEntityProperty += (_, e) => - e.ModifyResult.Name = StringUtils.PascalCaseToUnderScore(e.Property.Name).ToLower(); + ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = PascalCaseToUnderScore(e.Property.Name).ToLower(); break; case StringConvertType.PascalCaseToUnderscoreWithUpper: - ret.Aop.ConfigEntityProperty += (_, e) => - e.ModifyResult.Name = StringUtils.PascalCaseToUnderScore(e.Property.Name).ToUpper(); + ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = PascalCaseToUnderScore(e.Property.Name).ToUpper(); + break; + default: + break; + } + } + //添加实体属性名全局AOP转换处理 + if (_nameConvertType != NameConvertType.None) + { + string PascalCaseToUnderScore(string str) => string.Concat(str.Select((x, i) => i > 0 && char.IsUpper(x) ? "_" + x.ToString() : x.ToString())); + string UnderScorePascalCase(string str) => string.Join("", str.Split('_').Select(a => a.Length > 0 ? string.Concat(char.ToUpper(a[0]), a.Substring(1)) : "")); + + switch (_nameConvertType) + { + case NameConvertType.ToLower: + ret.Aop.ConfigEntity += (_, e) => e.ModifyResult.Name = e.EntityType.Name.ToLower(); + ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = e.Property.Name.ToLower(); + break; + case NameConvertType.ToUpper: + ret.Aop.ConfigEntity += (_, e) => e.ModifyResult.Name = e.EntityType.Name.ToUpper(); + ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = e.Property.Name.ToUpper(); + break; + case NameConvertType.PascalCaseToUnderscore: + ret.Aop.ConfigEntity += (_, e) => e.ModifyResult.Name = PascalCaseToUnderScore(e.EntityType.Name); + ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = PascalCaseToUnderScore(e.Property.Name); + break; + case NameConvertType.PascalCaseToUnderscoreWithLower: + ret.Aop.ConfigEntity += (_, e) => e.ModifyResult.Name = PascalCaseToUnderScore(e.EntityType.Name).ToLower(); + ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = PascalCaseToUnderScore(e.Property.Name).ToLower(); + break; + case NameConvertType.PascalCaseToUnderscoreWithUpper: + ret.Aop.ConfigEntity += (_, e) => e.ModifyResult.Name = PascalCaseToUnderScore(e.EntityType.Name).ToUpper(); + ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = PascalCaseToUnderScore(e.Property.Name).ToUpper(); + break; + case NameConvertType.UnderscoreToPascalCase: + ret.Aop.ConfigEntity += (_, e) => e.ModifyResult.Name = UnderScorePascalCase(e.EntityType.Name); + ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = UnderScorePascalCase(e.Property.Name); break; default: break; diff --git a/FreeSql/Interface/ICodeFirst.cs b/FreeSql/Interface/ICodeFirst.cs index 04f2085e..e242a390 100644 --- a/FreeSql/Interface/ICodeFirst.cs +++ b/FreeSql/Interface/ICodeFirst.cs @@ -13,11 +13,11 @@ namespace FreeSql bool IsAutoSyncStructure { get; set; } /// - /// 转小写同步结构 + /// 转小写同步结构,适用 PostgreSQL /// bool IsSyncStructureToLower { get; set; } /// - /// 转大写同步结构 + /// 转大写同步结构,适用 Oracle/达梦 /// bool IsSyncStructureToUpper { get; set; } /// diff --git a/FreeSql/Internal/StringConvertType.cs b/FreeSql/Internal/StringConvertType.cs index 281fe8fa..6571b7a0 100644 --- a/FreeSql/Internal/StringConvertType.cs +++ b/FreeSql/Internal/StringConvertType.cs @@ -1,4 +1,6 @@ -namespace FreeSql.Internal +using System; + +namespace FreeSql.Internal { public enum StringConvertType { @@ -42,4 +44,54 @@ /// Lower } + + public enum NameConvertType + { + /// + /// 不进行任何处理 + /// + None = 0, + + /// + /// 将帕斯卡命名字符串转换为下划线分隔字符串 + /// + /// BigApple -> Big_Apple + /// + PascalCaseToUnderscore, + + /// + /// 将帕斯卡命名字符串转换为下划线分隔字符串,且转换为全大写 + /// + /// BigApple -> BIG_APPLE + /// + PascalCaseToUnderscoreWithUpper, + + /// + /// 将帕斯卡命名字符串转换为下划线分隔字符串,且转换为全小写 + /// + /// BigApple -> big_apple + /// + PascalCaseToUnderscoreWithLower, + + /// + /// 将下划线分隔字符串命名字符串转换为帕斯卡 + /// + /// big_apple -> BigApple + /// + UnderscoreToPascalCase, + + /// + /// 将字符串转换为大写 + /// + /// BigApple -> BIGAPPLE + /// + ToUpper, + + /// + /// 将字符串转换为小写 + /// + /// BigApple -> bigapple + /// + ToLower + } } \ No newline at end of file diff --git a/FreeSql/Internal/StringUtils.cs b/FreeSql/Internal/StringUtils.cs deleted file mode 100644 index 6ec4819b..00000000 --- a/FreeSql/Internal/StringUtils.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.Linq; - -namespace FreeSql.Internal -{ - public static class StringUtils - { - /// - /// 将帕斯卡命名字符串转换为下划线分隔字符串 - /// - /// BigApple -> Big_Apple - /// - /// - /// - public static string PascalCaseToUnderScore(string str) - { - return string.Concat(str.Select((x, i) => - i > 0 && char.IsUpper(x) ? "_" + x.ToString() : x.ToString())); - } - } -} \ No newline at end of file