From f8e897e20164bea915b6b1cebf7423ea471400ba Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Tue, 28 May 2019 21:32:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8B=86=E5=88=86=20FreeSql=20=E6=8C=89?= =?UTF-8?q?=E9=9C=80=E5=BC=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/efcore_to_freesql/Startup.cs | 5 - Examples/restful/Startup.cs | 1 - .../FreeSql.Extensions.LazyLoading.csproj | 28 + .../LazyLoadingComplier.cs | 30 + .../FreeSql.Tests.PerformanceTests.csproj | 6 + FreeSql.Tests.PerformanceTests/g.cs | 8 +- FreeSql.Tests/FreeSql.Tests.csproj | 8 +- .../Generator/MySqlTemplateGeneratorTest.cs | 27 - .../PostgreSQLTemplateGeneratorTest.cs | 27 - .../SqlServerTemplateGeneratorTest.cs | 37 - FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs | 14 +- FreeSql.Tests/MySql/MySqlCodeFirstTest.cs | 16 - FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs | 10 - .../PostgreSQL/Curd/PostgreSQLSelectTest.cs | 15 +- .../SqlServer/Curd/SqlServerSelectTest.cs | 11 +- FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs | 10 - FreeSql.Tests/UnitTest1.cs | 4 +- FreeSql.sln | 122 ++++ FreeSql/DataAnnotations/ColumnAttribute.cs | 2 +- FreeSql/DatabaseModel/DBColumnInfo.cs | 22 +- FreeSql/DatabaseModel/DBTableInfo.cs | 20 +- FreeSql/DatabaseModel/DbForeignInfo.cs | 8 +- FreeSql/Extensions/FreeSqlGlobalExtensions.cs | 2 +- FreeSql/FreeSql.csproj | 13 +- FreeSql/FreeSql.xml | 226 ------ FreeSql/FreeSqlBuilder.cs | 48 +- FreeSql/FreeUtil.cs | 34 - FreeSql/Generator/TemplateEngin.cs | 644 ------------------ FreeSql/Generator/TemplateGenerator.cs | 72 -- FreeSql/Interface/Curd/ISelect/ISelect0.cs | 7 - FreeSql/Interface/IAdo.cs | 5 - FreeSql/Interface/ICache.cs | 108 --- FreeSql/Interface/IFreeSql.cs | 4 - FreeSql/Internal/CommonExpression.cs | 52 +- .../CommonProvider/AdoProvider/AdoProvider.cs | 15 +- .../AdoProvider/AdoProviderTransaction.cs | 36 +- .../Internal/CommonProvider/AopProvider.cs | 2 +- .../Internal/CommonProvider/CacheProvider.cs | 186 ----- .../Internal/CommonProvider/DeleteProvider.cs | 2 +- .../Internal/CommonProvider/InsertProvider.cs | 28 +- .../SelectProvider/Select0Provider.cs | 378 +++++----- .../SelectProvider/Select10Provider.cs | 2 +- .../SelectProvider/Select1Provider.cs | 2 +- .../SelectProvider/Select2Provider.cs | 2 +- .../SelectProvider/Select3Provider.cs | 2 +- .../SelectProvider/Select4Provider.cs | 2 +- .../SelectProvider/Select5Provider.cs | 2 +- .../SelectProvider/Select6Provider.cs | 2 +- .../SelectProvider/Select7Provider.cs | 2 +- .../SelectProvider/Select8Provider.cs | 2 +- .../SelectProvider/Select9Provider.cs | 2 +- .../SelectProvider/SelectGroupingProvider.cs | 2 +- .../Internal/CommonProvider/UpdateProvider.cs | 18 +- FreeSql/Internal/CommonUtils.cs | 87 ++- .../Internal/Model/ReadAnonymousTypeInfo.cs | 4 +- FreeSql/Internal/Model/SelectColumnInfo.cs | 2 +- FreeSql/Internal/Model/SelectTableInfo.cs | 4 +- FreeSql/Internal/UtilsExpressionTree.cs | 82 +-- .../Curd/MySqlDelete.cs | 0 .../Curd/MySqlInsert.cs | 8 +- .../Curd/MySqlSelect.cs | 0 .../Curd/MySqlUpdate.cs | 4 +- .../FreeSql.Provider.MySql.csproj | 28 + .../MySqlAdo/MySqlAdo.cs | 5 +- .../MySqlAdo/MySqlConnectionPool.cs | 2 +- .../MySqlAdo/MygisTypes.cs | 0 .../MySqlAdo/MygisTypesExtensions.cs | 0 .../FreeSql.Provider.MySql}/MySqlCodeFirst.cs | 0 .../FreeSql.Provider.MySql}/MySqlDbFirst.cs | 0 .../MySqlExpression.cs | 18 +- .../MySqlExtensions.cs | 0 .../FreeSql.Provider.MySql}/MySqlProvider.cs | 28 +- .../FreeSql.Provider.MySql}/MySqlUtils.cs | 26 +- .../Curd/OracleDelete.cs | 0 .../Curd/OracleInsert.cs | 8 +- .../Curd/OracleSelect.cs | 0 .../Curd/OracleUpdate.cs | 4 +- .../FreeSql.Provider.Oracle.csproj | 29 + .../OracleAdo/OracleAdo.cs | 5 +- .../OracleAdo/OracleConnectionPool.cs | 2 +- .../OracleCodeFirst.cs | 0 .../FreeSql.Provider.Oracle}/OracleDbFirst.cs | 0 .../OracleExpression.cs | 18 +- .../OracleExtensions.cs | 0 .../OracleProvider.cs | 14 +- .../FreeSql.Provider.Oracle}/OracleUtils.cs | 25 +- .../Curd/PostgreSQLDelete.cs | 0 .../Curd/PostgreSQLInsert.cs | 8 +- .../Curd/PostgreSQLSelect.cs | 0 .../Curd/PostgreSQLUpdate.cs | 4 +- .../FreeSql.Provider.PostgreSQL.csproj | 29 + .../PostgreSQLAdo/PostgreSQLAdo.cs | 5 +- .../PostgreSQLAdo/PostgreSQLConnectionPool.cs | 2 +- .../PostgreSQLAdo/PostgreSQLTypesConverter.cs | 0 .../PostgreSQLTypesExtensions.cs | 0 .../PostgreSQLCodeFirst.cs | 0 .../PostgreSQLDbFirst.cs | 0 .../PostgreSQLExpression.cs | 18 +- .../PostgreSQLExtensions.cs | 0 .../PostgreSQLProvider.cs | 28 +- .../PostgreSQLUtils.cs | 26 +- .../Curd/SqlServerDelete.cs | 0 .../Curd/SqlServerInsert.cs | 8 +- .../Curd/SqlServerSelect.cs | 0 .../Curd/SqlServerUpdate.cs | 4 +- .../FreeSql.Provider.SqlServer.csproj | 28 + .../SqlServerAdo/SqlServerAdo.cs | 5 +- .../SqlServerAdo/SqlServerConnectionPool.cs | 2 +- .../SqlServerCodeFirst.cs | 0 .../SqlServerDbFirst.cs | 0 .../SqlServerExpression.cs | 18 +- .../SqlServerExtensions.cs | 0 .../SqlServerProvider.cs | 14 +- .../SqlServerUtils.cs | 27 +- .../Curd/SqliteDelete.cs | 0 .../Curd/SqliteInsert.cs | 8 +- .../Curd/SqliteSelect.cs | 0 .../Curd/SqliteUpdate.cs | 4 +- .../FreeSql.Provider.Sqlite.csproj | 28 + .../SqliteAdo/SqliteAdo.cs | 5 +- .../SqliteAdo/SqliteConnectionPool.cs | 2 +- .../SqliteCodeFirst.cs | 0 .../SqliteExpression.cs | 18 +- .../SqliteExtensions.cs | 0 .../SqliteProvider.cs | 14 +- .../FreeSql.Provider.Sqlite}/SqliteUtils.cs | 25 +- Templates/MySql/include/enumtype.tpl | 71 -- .../rich-entity-navigation-object/Const.cs | 5 - .../Model/for-table.cs.freesql | 240 ------- .../rich-entity-navigation-object/readme.md | 94 --- .../Model/for-table.cs.freesql | 59 -- .../simple-entity-navigation-object/readme.md | 94 --- .../simple-entity/Model/for-table.cs.freesql | 33 - Templates/MySql/simple-entity/readme.md | 94 --- .../rich-entity-navigation-object/Const.cs | 5 - .../Model/for-table.cs.freesql | 240 ------- .../rich-entity-navigation-object/readme.md | 94 --- .../Model/for-table.cs.freesql | 60 -- .../simple-entity-navigation-object/readme.md | 94 --- .../simple-entity/Model/for-table.cs.freesql | 35 - Templates/PostgreSQL/simple-entity/readme.md | 94 --- .../rich-entity-navigation-object/Const.cs | 5 - .../Model/for-table.cs.freesql | 240 ------- .../rich-entity-navigation-object/readme.md | 94 --- .../Model/for-table.cs.freesql | 59 -- .../simple-entity-navigation-object/readme.md | 94 --- .../simple-entity/Model/for-table.cs.freesql | 33 - Templates/SqlServer/simple-entity/readme.md | 94 --- readme.md | 30 +- 149 files changed, 945 insertions(+), 4082 deletions(-) create mode 100644 Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj create mode 100644 Extensions/FreeSql.Extensions.LazyLoading/LazyLoadingComplier.cs delete mode 100644 FreeSql.Tests/Generator/MySqlTemplateGeneratorTest.cs delete mode 100644 FreeSql.Tests/Generator/PostgreSQLTemplateGeneratorTest.cs delete mode 100644 FreeSql.Tests/Generator/SqlServerTemplateGeneratorTest.cs delete mode 100644 FreeSql/Generator/TemplateEngin.cs delete mode 100644 FreeSql/Generator/TemplateGenerator.cs delete mode 100644 FreeSql/Interface/ICache.cs delete mode 100644 FreeSql/Internal/CommonProvider/CacheProvider.cs rename {FreeSql/MySql => Providers/FreeSql.Provider.MySql}/Curd/MySqlDelete.cs (100%) rename {FreeSql/MySql => Providers/FreeSql.Provider.MySql}/Curd/MySqlInsert.cs (94%) rename {FreeSql/MySql => Providers/FreeSql.Provider.MySql}/Curd/MySqlSelect.cs (100%) rename {FreeSql/MySql => Providers/FreeSql.Provider.MySql}/Curd/MySqlUpdate.cs (97%) create mode 100644 Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj rename {FreeSql/MySql => Providers/FreeSql.Provider.MySql}/MySqlAdo/MySqlAdo.cs (90%) rename {FreeSql/MySql => Providers/FreeSql.Provider.MySql}/MySqlAdo/MySqlConnectionPool.cs (98%) rename {FreeSql/MySql => Providers/FreeSql.Provider.MySql}/MySqlAdo/MygisTypes.cs (100%) rename {FreeSql/MySql => Providers/FreeSql.Provider.MySql}/MySqlAdo/MygisTypesExtensions.cs (100%) rename {FreeSql/MySql => Providers/FreeSql.Provider.MySql}/MySqlCodeFirst.cs (100%) rename {FreeSql/MySql => Providers/FreeSql.Provider.MySql}/MySqlDbFirst.cs (100%) rename {FreeSql/MySql => Providers/FreeSql.Provider.MySql}/MySqlExpression.cs (95%) rename {FreeSql/MySql => Providers/FreeSql.Provider.MySql}/MySqlExtensions.cs (100%) rename {FreeSql/MySql => Providers/FreeSql.Provider.MySql}/MySqlProvider.cs (62%) rename {FreeSql/MySql => Providers/FreeSql.Provider.MySql}/MySqlUtils.cs (70%) rename {FreeSql/Oracle => Providers/FreeSql.Provider.Oracle}/Curd/OracleDelete.cs (100%) rename {FreeSql/Oracle => Providers/FreeSql.Provider.Oracle}/Curd/OracleInsert.cs (96%) rename {FreeSql/Oracle => Providers/FreeSql.Provider.Oracle}/Curd/OracleSelect.cs (100%) rename {FreeSql/Oracle => Providers/FreeSql.Provider.Oracle}/Curd/OracleUpdate.cs (94%) create mode 100644 Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj rename {FreeSql/Oracle => Providers/FreeSql.Provider.Oracle}/OracleAdo/OracleAdo.cs (90%) rename {FreeSql/Oracle => Providers/FreeSql.Provider.Oracle}/OracleAdo/OracleConnectionPool.cs (98%) rename {FreeSql/Oracle => Providers/FreeSql.Provider.Oracle}/OracleCodeFirst.cs (100%) rename {FreeSql/Oracle => Providers/FreeSql.Provider.Oracle}/OracleDbFirst.cs (100%) rename {FreeSql/Oracle => Providers/FreeSql.Provider.Oracle}/OracleExpression.cs (95%) rename {FreeSql/Oracle => Providers/FreeSql.Provider.Oracle}/OracleExtensions.cs (100%) rename {FreeSql/Oracle => Providers/FreeSql.Provider.Oracle}/OracleProvider.cs (78%) rename {FreeSql/Oracle => Providers/FreeSql.Provider.Oracle}/OracleUtils.cs (63%) rename {FreeSql/PostgreSQL => Providers/FreeSql.Provider.PostgreSQL}/Curd/PostgreSQLDelete.cs (100%) rename {FreeSql/PostgreSQL => Providers/FreeSql.Provider.PostgreSQL}/Curd/PostgreSQLInsert.cs (96%) rename {FreeSql/PostgreSQL => Providers/FreeSql.Provider.PostgreSQL}/Curd/PostgreSQLSelect.cs (100%) rename {FreeSql/PostgreSQL => Providers/FreeSql.Provider.PostgreSQL}/Curd/PostgreSQLUpdate.cs (97%) create mode 100644 Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj rename {FreeSql/PostgreSQL => Providers/FreeSql.Provider.PostgreSQL}/PostgreSQLAdo/PostgreSQLAdo.cs (92%) rename {FreeSql/PostgreSQL => Providers/FreeSql.Provider.PostgreSQL}/PostgreSQLAdo/PostgreSQLConnectionPool.cs (98%) rename {FreeSql/PostgreSQL => Providers/FreeSql.Provider.PostgreSQL}/PostgreSQLAdo/PostgreSQLTypesConverter.cs (100%) rename {FreeSql/PostgreSQL => Providers/FreeSql.Provider.PostgreSQL}/PostgreSQLAdo/PostgreSQLTypesExtensions.cs (100%) rename {FreeSql/PostgreSQL => Providers/FreeSql.Provider.PostgreSQL}/PostgreSQLCodeFirst.cs (100%) rename {FreeSql/PostgreSQL => Providers/FreeSql.Provider.PostgreSQL}/PostgreSQLDbFirst.cs (100%) rename {FreeSql/PostgreSQL => Providers/FreeSql.Provider.PostgreSQL}/PostgreSQLExpression.cs (96%) rename {FreeSql/PostgreSQL => Providers/FreeSql.Provider.PostgreSQL}/PostgreSQLExtensions.cs (100%) rename {FreeSql/PostgreSQL => Providers/FreeSql.Provider.PostgreSQL}/PostgreSQLProvider.cs (77%) rename {FreeSql/PostgreSQL => Providers/FreeSql.Provider.PostgreSQL}/PostgreSQLUtils.cs (87%) rename {FreeSql/SqlServer => Providers/FreeSql.Provider.SqlServer}/Curd/SqlServerDelete.cs (100%) rename {FreeSql/SqlServer => Providers/FreeSql.Provider.SqlServer}/Curd/SqlServerInsert.cs (95%) rename {FreeSql/SqlServer => Providers/FreeSql.Provider.SqlServer}/Curd/SqlServerSelect.cs (100%) rename {FreeSql/SqlServer => Providers/FreeSql.Provider.SqlServer}/Curd/SqlServerUpdate.cs (97%) create mode 100644 Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj rename {FreeSql/SqlServer => Providers/FreeSql.Provider.SqlServer}/SqlServerAdo/SqlServerAdo.cs (91%) rename {FreeSql/SqlServer => Providers/FreeSql.Provider.SqlServer}/SqlServerAdo/SqlServerConnectionPool.cs (98%) rename {FreeSql/SqlServer => Providers/FreeSql.Provider.SqlServer}/SqlServerCodeFirst.cs (100%) rename {FreeSql/SqlServer => Providers/FreeSql.Provider.SqlServer}/SqlServerDbFirst.cs (100%) rename {FreeSql/SqlServer => Providers/FreeSql.Provider.SqlServer}/SqlServerExpression.cs (95%) rename {FreeSql/SqlServer => Providers/FreeSql.Provider.SqlServer}/SqlServerExtensions.cs (100%) rename {FreeSql/SqlServer => Providers/FreeSql.Provider.SqlServer}/SqlServerProvider.cs (79%) rename {FreeSql/SqlServer => Providers/FreeSql.Provider.SqlServer}/SqlServerUtils.cs (66%) rename {FreeSql/Sqlite => Providers/FreeSql.Provider.Sqlite}/Curd/SqliteDelete.cs (100%) rename {FreeSql/Sqlite => Providers/FreeSql.Provider.Sqlite}/Curd/SqliteInsert.cs (91%) rename {FreeSql/Sqlite => Providers/FreeSql.Provider.Sqlite}/Curd/SqliteSelect.cs (100%) rename {FreeSql/Sqlite => Providers/FreeSql.Provider.Sqlite}/Curd/SqliteUpdate.cs (94%) create mode 100644 Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj rename {FreeSql/Sqlite => Providers/FreeSql.Provider.Sqlite}/SqliteAdo/SqliteAdo.cs (90%) rename {FreeSql/Sqlite => Providers/FreeSql.Provider.Sqlite}/SqliteAdo/SqliteConnectionPool.cs (98%) rename {FreeSql/Sqlite => Providers/FreeSql.Provider.Sqlite}/SqliteCodeFirst.cs (100%) rename {FreeSql/Sqlite => Providers/FreeSql.Provider.Sqlite}/SqliteExpression.cs (95%) rename {FreeSql/Sqlite => Providers/FreeSql.Provider.Sqlite}/SqliteExtensions.cs (100%) rename {FreeSql/Sqlite => Providers/FreeSql.Provider.Sqlite}/SqliteProvider.cs (77%) rename {FreeSql/Sqlite => Providers/FreeSql.Provider.Sqlite}/SqliteUtils.cs (64%) delete mode 100644 Templates/MySql/include/enumtype.tpl delete mode 100644 Templates/MySql/rich-entity-navigation-object/Const.cs delete mode 100644 Templates/MySql/rich-entity-navigation-object/Model/for-table.cs.freesql delete mode 100644 Templates/MySql/rich-entity-navigation-object/readme.md delete mode 100644 Templates/MySql/simple-entity-navigation-object/Model/for-table.cs.freesql delete mode 100644 Templates/MySql/simple-entity-navigation-object/readme.md delete mode 100644 Templates/MySql/simple-entity/Model/for-table.cs.freesql delete mode 100644 Templates/MySql/simple-entity/readme.md delete mode 100644 Templates/PostgreSQL/rich-entity-navigation-object/Const.cs delete mode 100644 Templates/PostgreSQL/rich-entity-navigation-object/Model/for-table.cs.freesql delete mode 100644 Templates/PostgreSQL/rich-entity-navigation-object/readme.md delete mode 100644 Templates/PostgreSQL/simple-entity-navigation-object/Model/for-table.cs.freesql delete mode 100644 Templates/PostgreSQL/simple-entity-navigation-object/readme.md delete mode 100644 Templates/PostgreSQL/simple-entity/Model/for-table.cs.freesql delete mode 100644 Templates/PostgreSQL/simple-entity/readme.md delete mode 100644 Templates/SqlServer/rich-entity-navigation-object/Const.cs delete mode 100644 Templates/SqlServer/rich-entity-navigation-object/Model/for-table.cs.freesql delete mode 100644 Templates/SqlServer/rich-entity-navigation-object/readme.md delete mode 100644 Templates/SqlServer/simple-entity-navigation-object/Model/for-table.cs.freesql delete mode 100644 Templates/SqlServer/simple-entity-navigation-object/readme.md delete mode 100644 Templates/SqlServer/simple-entity/Model/for-table.cs.freesql delete mode 100644 Templates/SqlServer/simple-entity/readme.md diff --git a/Examples/efcore_to_freesql/Startup.cs b/Examples/efcore_to_freesql/Startup.cs index ebbd056d..8f30257d 100644 --- a/Examples/efcore_to_freesql/Startup.cs +++ b/Examples/efcore_to_freesql/Startup.cs @@ -24,7 +24,6 @@ namespace efcore_to_freesql Fsql = new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|\document.db;Pooling=true;Max Pool Size=10") - .UseLogger(loggerFactory.CreateLogger()) .UseAutoSyncStructure(true) .Build(); @@ -69,10 +68,6 @@ namespace efcore_to_freesql public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { - Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); - Console.OutputEncoding = Encoding.GetEncoding("GB2312"); - Console.InputEncoding = Encoding.GetEncoding("GB2312"); - loggerFactory.AddConsole(Configuration.GetSection("Logging")); loggerFactory.AddDebug(); diff --git a/Examples/restful/Startup.cs b/Examples/restful/Startup.cs index 3cc16581..88b7777d 100644 --- a/Examples/restful/Startup.cs +++ b/Examples/restful/Startup.cs @@ -14,7 +14,6 @@ namespace restful { Fsql = new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|\document.db;Attachs=xxxtb.db;Pooling=true;Max Pool Size=10") - .UseLogger(loggerFactory.CreateLogger()) .UseAutoSyncStructure(true) .Build(); diff --git a/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj new file mode 100644 index 00000000..6e0c035c --- /dev/null +++ b/Extensions/FreeSql.Extensions.LazyLoading/FreeSql.Extensions.LazyLoading.csproj @@ -0,0 +1,28 @@ + + + + netstandard2.0 + 0.6.1 + true + YeXiangQin + FreeSql 扩展包,可实现【延时加载】属性. + https://github.com/2881099/FreeSql + https://github.com/2881099/FreeSql + git + MIT + FreeSql;ORM + $(AssemblyName) + $(AssemblyName) + true + true + + + + + + + + + + + diff --git a/Extensions/FreeSql.Extensions.LazyLoading/LazyLoadingComplier.cs b/Extensions/FreeSql.Extensions.LazyLoading/LazyLoadingComplier.cs new file mode 100644 index 00000000..9c50116a --- /dev/null +++ b/Extensions/FreeSql.Extensions.LazyLoading/LazyLoadingComplier.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text; + +namespace FreeSql.Extensions.LazyLoading { + + public class LazyLoadingComplier { + + internal static Lazy _compiler = new Lazy(() => { + //var dlls = Directory.GetFiles(Directory.GetParent(Type.GetType("IFreeSql, FreeSql").Assembly.Location).FullName, "*.dll"); + var compiler = new CSScriptLib.RoslynEvaluator(); + compiler.DisableReferencingFromCode = false; + //compiler.DebugBuild = true; + //foreach (var dll in dlls) { + // Console.WriteLine(dll); + // var ass = Assembly.LoadFile(dll); + // compiler.ReferenceAssembly(ass); + //} + compiler + .ReferenceAssemblyOf() + .ReferenceDomainAssemblies(); + return compiler; + }); + + public static Assembly CompileCode(string cscode) { + return _compiler.Value.CompileCode(cscode); + } + } +} diff --git a/FreeSql.Tests.PerformanceTests/FreeSql.Tests.PerformanceTests.csproj b/FreeSql.Tests.PerformanceTests/FreeSql.Tests.PerformanceTests.csproj index fb6098e9..70e6eb76 100644 --- a/FreeSql.Tests.PerformanceTests/FreeSql.Tests.PerformanceTests.csproj +++ b/FreeSql.Tests.PerformanceTests/FreeSql.Tests.PerformanceTests.csproj @@ -14,7 +14,13 @@ + + + + + + diff --git a/FreeSql.Tests.PerformanceTests/g.cs b/FreeSql.Tests.PerformanceTests/g.cs index 76990132..ceb1c0a1 100644 --- a/FreeSql.Tests.PerformanceTests/g.cs +++ b/FreeSql.Tests.PerformanceTests/g.cs @@ -1,5 +1,4 @@ -using Microsoft.Extensions.Logging; -using System; +using System; using System.Collections.Generic; using System.Text; @@ -8,32 +7,27 @@ public class g { public static IFreeSql mysql = new FreeSql.FreeSqlBuilder() .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=100") - .UseLogger(new LoggerFactory().CreateLogger("FreeSql.MySql")) .UseAutoSyncStructure(false) .Build(); //public static IFreeSql sqlserver = new FreeSql.FreeSqlBuilder() // .UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=.;Integrated Security=True;Initial Catalog=cms;Pooling=true;Max Pool Size=10") - // .UseLogger(new LoggerFactory().CreateLogger("FreeSql.SqlServer")) // .UseAutoSyncStructure(false) // .Build(); //public static IFreeSql pgsql = 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") - // .UseLogger(new LoggerFactory().CreateLogger("FreeSql.PostgreSQL")) // .UseAutoSyncStructure(false) // .UseSyncStructureToLower(true) // .Build(); //public static IFreeSql oracle = new FreeSql.FreeSqlBuilder() // .UseConnectionString(FreeSql.DataType.Oracle, "user id=user1;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=10") - // .UseLogger(new LoggerFactory().CreateLogger("FreeSql.Oracle")) // .UseAutoSyncStructure(false) // .Build(); //public static IFreeSql sqlite = new FreeSql.FreeSqlBuilder() // .UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|\document.db;Attachs=xxxtb.db;Pooling=true;Max Pool Size=10") - // .UseLogger(new LoggerFactory().CreateLogger("FreeSql.Sqlite")) // .UseAutoSyncStructure(false) // .Build(); } diff --git a/FreeSql.Tests/FreeSql.Tests.csproj b/FreeSql.Tests/FreeSql.Tests.csproj index e43255e6..b778f4e2 100644 --- a/FreeSql.Tests/FreeSql.Tests.csproj +++ b/FreeSql.Tests/FreeSql.Tests.csproj @@ -7,7 +7,6 @@ - @@ -15,7 +14,14 @@ + + + + + + + diff --git a/FreeSql.Tests/Generator/MySqlTemplateGeneratorTest.cs b/FreeSql.Tests/Generator/MySqlTemplateGeneratorTest.cs deleted file mode 100644 index ff0e085b..00000000 --- a/FreeSql.Tests/Generator/MySqlTemplateGeneratorTest.cs +++ /dev/null @@ -1,27 +0,0 @@ -using FreeSql.DataAnnotations; -using FreeSql.Generator; -using System; -using Xunit; - -namespace FreeSql.Tests.Generator { - public class MySqlTemplateGeneratorTest { - - [Fact] - public void BuildSimpleEntity() { - var gen = new TemplateGenerator(); - gen.Build(g.mysql.DbFirst, @"C:\Users\28810\Desktop\github\FreeSql\Templates\MySql\simple-entity", @"C:\Users\28810\Desktop\新建文件夹 (9)", "cccddd"); - } - - [Fact] - public void BuildSimpleEntityNavigationObject () { - var gen = new TemplateGenerator(); - gen.Build(g.mysql.DbFirst, @"C:\Users\28810\Desktop\github\FreeSql\Templates\MySql\simple-entity-navigation-object", @"C:\Users\28810\Desktop\新建文件夹 (9)", "cccddd"); - } - - [Fact] - public void BuildRichEntityNavigationObject() { - var gen = new TemplateGenerator(); - gen.Build(g.mysql.DbFirst, @"C:\Users\28810\Desktop\github\FreeSql\Templates\MySql\rich-entity-navigation-object", @"C:\Users\28810\Desktop\新建文件夹 (9)", "cccddd"); - } - } -} diff --git a/FreeSql.Tests/Generator/PostgreSQLTemplateGeneratorTest.cs b/FreeSql.Tests/Generator/PostgreSQLTemplateGeneratorTest.cs deleted file mode 100644 index 87facccb..00000000 --- a/FreeSql.Tests/Generator/PostgreSQLTemplateGeneratorTest.cs +++ /dev/null @@ -1,27 +0,0 @@ -using FreeSql.DataAnnotations; -using FreeSql.Generator; -using System; -using Xunit; - -namespace FreeSql.Tests.Generator { - public class PostgreSQLTemplateGeneratorTest { - - [Fact] - public void BuildSimpleEntity() { - var gen = new TemplateGenerator(); - gen.Build(g.pgsql.DbFirst, @"C:\Users\28810\Desktop\github\FreeSql\Templates\PostgreSQL\simple-entity", @"C:\Users\28810\Desktop\新建文件夹 (9)", "tedb"); - } - - [Fact] - public void BuildSimpleEntityNavigationObject () { - var gen = new TemplateGenerator(); - gen.Build(g.pgsql.DbFirst, @"C:\Users\28810\Desktop\github\FreeSql\Templates\PostgreSQL\simple-entity-navigation-object", @"C:\Users\28810\Desktop\新建文件夹 (9)", "tedb"); - } - - [Fact] - public void BuildRichEntityNavigationObject() { - var gen = new TemplateGenerator(); - gen.Build(g.pgsql.DbFirst, @"C:\Users\28810\Desktop\github\FreeSql\Templates\PostgreSQL\rich-entity-navigation-object", @"C:\Users\28810\Desktop\新建文件夹 (9)", "tedb"); - } - } -} diff --git a/FreeSql.Tests/Generator/SqlServerTemplateGeneratorTest.cs b/FreeSql.Tests/Generator/SqlServerTemplateGeneratorTest.cs deleted file mode 100644 index afad2d98..00000000 --- a/FreeSql.Tests/Generator/SqlServerTemplateGeneratorTest.cs +++ /dev/null @@ -1,37 +0,0 @@ -using FreeSql.DataAnnotations; -using FreeSql.Generator; -using FreeSql.Tests.DataContext.SqlServer; -using System; -using Xunit; - -namespace FreeSql.Tests.Generator { - - [Collection("SqlServerCollection")] - public class SqlServerTemplateGeneratorTest { - SqlServerFixture _sqlserverFixture; - - public SqlServerTemplateGeneratorTest(SqlServerFixture sqlserverFixture) - { - _sqlserverFixture = sqlserverFixture; - } - - - [Fact] - public void BuildSimpleEntity() { - var gen = new TemplateGenerator(); - gen.Build(_sqlserverFixture.SqlServer.DbFirst, @"C:\Users\28810\Desktop\github\FreeSql\Templates\SqlServer\simple-entity", @"C:\Users\28810\Desktop\新建文件夹 (9)", "shop"); - } - - [Fact] - public void BuildSimpleEntityNavigationObject () { - var gen = new TemplateGenerator(); - gen.Build(_sqlserverFixture.SqlServer.DbFirst, @"C:\Users\28810\Desktop\github\FreeSql\Templates\SqlServer\simple-entity-navigation-object", @"C:\Users\28810\Desktop\新建文件夹 (9)", "shop"); - } - - [Fact] - public void BuildRichEntityNavigationObject() { - var gen = new TemplateGenerator(); - gen.Build(_sqlserverFixture.SqlServer.DbFirst, @"C:\Users\28810\Desktop\github\FreeSql\Templates\SqlServer\rich-entity-navigation-object", @"C:\Users\28810\Desktop\新建文件夹 (9)", "shop"); - } - } -} diff --git a/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs b/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs index 52ed6c06..bf184608 100644 --- a/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs +++ b/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs @@ -230,8 +230,8 @@ namespace FreeSql.Tests.MySql { }); - var t100 = g.mysql.Select().Where("").Where(a => a.Id > 0).Skip(100).Limit(200).Caching(50).ToList(); - var t101 = g.mysql.Select().As("b").Where("").Where(a => a.Id > 0).Skip(100).Limit(200).Caching(50).ToList(); + var t100 = g.mysql.Select().Where("").Where(a => a.Id > 0).Skip(100).Limit(200).ToList(); + var t101 = g.mysql.Select().As("b").Where("").Where(a => a.Id > 0).Skip(100).Limit(200).ToList(); var t1111 = g.mysql.Select().ToList(a => new { a.Id, a.Title, a.Type }); @@ -304,16 +304,6 @@ namespace FreeSql.Tests.MySql { Assert.StartsWith(" SELECT", select.Master().Where(a => 1 == 1).ToSql()); } [Fact] - public void Caching() { - var result1 = select.Where(a => 1 == 1).Caching(20, "testcaching").ToList(); - var testcaching1 = g.mysql.Cache.Get("testcaching"); - Assert.NotNull(testcaching1); - var result2 = select.Where(a => 1 == 1).Caching(20, "testcaching").ToList(); - var testcaching2 = g.mysql.Cache.Get("testcaching"); - Assert.NotNull(testcaching2); - Assert.Equal(result1.Count, result1.Count); - } - [Fact] public void From() { var query2 = select.From((s, b) => s .LeftJoin(a => a.TypeGuid == b.Guid) diff --git a/FreeSql.Tests/MySql/MySqlCodeFirstTest.cs b/FreeSql.Tests/MySql/MySqlCodeFirstTest.cs index 8f2caee6..11b7c086 100644 --- a/FreeSql.Tests/MySql/MySqlCodeFirstTest.cs +++ b/FreeSql.Tests/MySql/MySqlCodeFirstTest.cs @@ -385,27 +385,11 @@ namespace FreeSql.Tests.MySql { internal static IFreeSql mysql => null; public static FreeSql.ISelect Select => mysql.Select(); - public static int ItemCacheTimeout = 180; - public static Tb_alltype GetItem(int Id) => Select.Where(a => a.Id == Id).Caching(ItemCacheTimeout, string.Concat("test:tb_alltype:", Id)).ToOne(); - public static long Delete(int Id) { var affrows = mysql.Delete().Where(a => a.Id == Id).ExecuteAffrows(); - if (ItemCacheTimeout > 0) RemoveCache(new Tb_alltype { Id = Id }); return affrows; } - internal static void RemoveCache(Tb_alltype item) => RemoveCache(item == null ? null : new[] { item }); - internal static void RemoveCache(IEnumerable items) { - if (ItemCacheTimeout <= 0 || items == null || items.Any() == false) return; - var keys = new string[items.Count() * 1]; - var keysIdx = 0; - foreach (var item in items) { - keys[keysIdx++] = string.Concat("test:tb_alltype:", item.Id); - } - if (mysql.Ado.TransactionCurrentThread != null) mysql.Ado.TransactionPreRemoveCache(keys); - else mysql.Cache.Remove(keys); - } - /// /// ӣֵ UpdateӰΪ 0 Insert /// diff --git a/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs b/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs index 97f0a718..6167d286 100644 --- a/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs +++ b/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs @@ -199,16 +199,6 @@ namespace FreeSql.Tests.Oracle { Assert.StartsWith(" SELECT", select.Master().Where(a => 1 == 1).ToSql()); } [Fact] - public void Caching() { - var result1 = select.Where(a => 1 == 1).Caching(20, "testcaching").ToList(); - var testcaching1 = g.oracle.Cache.Get("testcaching"); - Assert.NotNull(testcaching1); - var result2 = select.Where(a => 1 == 1).Caching(20, "testcaching").ToList(); - var testcaching2 = g.oracle.Cache.Get("testcaching"); - Assert.NotNull(testcaching2); - Assert.Equal(result1.Count, result1.Count); - } - [Fact] public void From() { var query2 = select.From((s, b) => s .LeftJoin(a => a.TypeGuid == b.Guid) diff --git a/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs b/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs index 7a5c4064..08b6a39e 100644 --- a/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs +++ b/FreeSql.Tests/PostgreSQL/Curd/PostgreSQLSelectTest.cs @@ -208,8 +208,8 @@ namespace FreeSql.Tests.PostgreSQL { }); - var t100 = g.pgsql.Select().Where("").Where(a => a.Id > 0).Skip(100).Limit(200).Caching(50).ToList(); - var t101 = g.pgsql.Select().As("b").Where("").Where(a => a.Id > 0).Skip(100).Limit(200).Caching(50).ToList(); + var t100 = g.pgsql.Select().Where("").Where(a => a.Id > 0).Skip(100).Limit(200).ToList(); + var t101 = g.pgsql.Select().As("b").Where("").Where(a => a.Id > 0).Skip(100).Limit(200).ToList(); var t1111 = g.pgsql.Select().ToList(a => new { a.Id, a.Title, a.Type }); @@ -268,16 +268,7 @@ namespace FreeSql.Tests.PostgreSQL { public void Master() { Assert.StartsWith(" SELECT", select.Master().Where(a => 1 == 1).ToSql()); } - [Fact] - public void Caching() { - var result1 = select.Where(a => 1 == 1).Caching(20, "testcaching").ToList(); - var testcaching1 = g.pgsql.Cache.Get("testcaching"); - Assert.NotNull(testcaching1); - var result2 = select.Where(a => 1 == 1).Caching(20, "testcaching").ToList(); - var testcaching2 = g.pgsql.Cache.Get("testcaching"); - Assert.NotNull(testcaching2); - Assert.Equal(result1.Count, result1.Count); - } + [Fact] public void From() { diff --git a/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs b/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs index 56c58afc..fa9b68ac 100644 --- a/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs +++ b/FreeSql.Tests/SqlServer/Curd/SqlServerSelectTest.cs @@ -200,16 +200,7 @@ namespace FreeSql.Tests.SqlServer { public void Master() { Assert.StartsWith(" SELECT", select.Master().Where(a => 1 == 1).ToSql()); } - [Fact] - public void Caching() { - var result1 = select.Where(a => 1 == 1).Caching(20, "testcaching").ToList(); - var testcaching1 = _sqlserverFixture.SqlServer.Cache.Get("testcaching"); - Assert.NotNull(testcaching1); - var result2 = select.Where(a => 1 == 1).Caching(20, "testcaching").ToList(); - var testcaching2 = _sqlserverFixture.SqlServer.Cache.Get("testcaching"); - Assert.NotNull(testcaching2); - Assert.Equal(result1.Count, result1.Count); - } + [Fact] public void From() { var query2 = select.From((s, b) => s diff --git a/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs b/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs index e4a45982..4805780d 100644 --- a/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs +++ b/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs @@ -210,16 +210,6 @@ namespace FreeSql.Tests.Sqlite { Assert.StartsWith(" SELECT", select.Master().Where(a => 1 == 1).ToSql()); } [Fact] - public void Caching() { - var result1 = select.Where(a => 1 == 1).Caching(20, "testcaching").ToList(); - var testcaching1 = g.sqlite.Cache.Get("testcaching"); - Assert.NotNull(testcaching1); - var result2 = select.Where(a => 1 == 1).Caching(20, "testcaching").ToList(); - var testcaching2 = g.sqlite.Cache.Get("testcaching"); - Assert.NotNull(testcaching2); - Assert.Equal(result1.Count, result1.Count); - } - [Fact] public void From() { var query2 = select.From((s, b) => s .LeftJoin(a => a.TypeGuid == b.Guid) diff --git a/FreeSql.Tests/UnitTest1.cs b/FreeSql.Tests/UnitTest1.cs index 016444be..9af6083d 100644 --- a/FreeSql.Tests/UnitTest1.cs +++ b/FreeSql.Tests/UnitTest1.cs @@ -508,8 +508,8 @@ namespace FreeSql.Tests { }); - var t100 = g.mysql.Select().Where("").Where(a => a.Id > 0).Skip(100).Limit(200).Caching(50).ToList(); - var t101 = g.mysql.Select().As("b").Where("").Where(a => a.Id > 0).Skip(100).Limit(200).Caching(50).ToList(); + var t100 = g.mysql.Select().Where("").Where(a => a.Id > 0).Skip(100).Limit(200).ToList(); + var t101 = g.mysql.Select().As("b").Where("").Where(a => a.Id > 0).Skip(100).Limit(200).ToList(); var t1111 = g.mysql.Select().ToList(a => new { a.Id, a.Title, a.Type }); diff --git a/FreeSql.sln b/FreeSql.sln index b25315b6..ae3c37ce 100644 --- a/FreeSql.sln +++ b/FreeSql.sln @@ -24,6 +24,26 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "orm_vs", "Examples\orm_vs\o EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "benchmarker", "Examples\benchmarker\benchmarker.csproj", "{E7405816-F32A-4F3E-AD76-29129962C6AA}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Providers", "Providers", "{2A381C57-2697-427B-9F10-55DA11FD02E4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Provider.MySql", "Providers\FreeSql.Provider.MySql\FreeSql.Provider.MySql.csproj", "{28C6A39C-7AE7-4210-B7B0-0970216637A8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Provider.Oracle", "Providers\FreeSql.Provider.Oracle\FreeSql.Provider.Oracle.csproj", "{3DE45286-B0DB-4D74-B322-F5467FB2EF53}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FreeSql.Provider.Sqlite", "Providers\FreeSql.Provider.Sqlite\FreeSql.Provider.Sqlite.csproj", "{559B6369-1868-4A06-A590-F80BA7B80A1B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FreeSql.Provider.SqlServer", "Providers\FreeSql.Provider.SqlServer\FreeSql.Provider.SqlServer.csproj", "{B61AAC9E-59E9-4F47-BBE3-97AC24112EFE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FreeSql.Provider.PostgreSQL", "Providers\FreeSql.Provider.PostgreSQL\FreeSql.Provider.PostgreSQL.csproj", "{22C0B061-F7CC-4A7F-AEC7-D4DBBE6B23B2}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Extensions", "Extensions", "{4A92E8A6-9A6D-41A1-9CDA-DE10899648AA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FreeSql.Extensions.LazyLoading", "Extensions\FreeSql.Extensions.LazyLoading\FreeSql.Extensions.LazyLoading.csproj", "{1FE00D5E-EC0F-4238-93EC-DABA26DBD1A9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.DbContext", "..\FreeSql.DbContext\FreeSql.DbContext\FreeSql.DbContext.csproj", "{84BA8C1A-A432-4D03-A2FA-127B8776C872}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Repository", "..\FreeSql.DbContext\FreeSql.Repository\FreeSql.Repository.csproj", "{8B92F97B-02FC-4FA0-8FA5-F494CAF15336}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -118,6 +138,102 @@ Global {E7405816-F32A-4F3E-AD76-29129962C6AA}.Release|x64.Build.0 = Release|Any CPU {E7405816-F32A-4F3E-AD76-29129962C6AA}.Release|x86.ActiveCfg = Release|Any CPU {E7405816-F32A-4F3E-AD76-29129962C6AA}.Release|x86.Build.0 = Release|Any CPU + {28C6A39C-7AE7-4210-B7B0-0970216637A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {28C6A39C-7AE7-4210-B7B0-0970216637A8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {28C6A39C-7AE7-4210-B7B0-0970216637A8}.Debug|x64.ActiveCfg = Debug|Any CPU + {28C6A39C-7AE7-4210-B7B0-0970216637A8}.Debug|x64.Build.0 = Debug|Any CPU + {28C6A39C-7AE7-4210-B7B0-0970216637A8}.Debug|x86.ActiveCfg = Debug|Any CPU + {28C6A39C-7AE7-4210-B7B0-0970216637A8}.Debug|x86.Build.0 = Debug|Any CPU + {28C6A39C-7AE7-4210-B7B0-0970216637A8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {28C6A39C-7AE7-4210-B7B0-0970216637A8}.Release|Any CPU.Build.0 = Release|Any CPU + {28C6A39C-7AE7-4210-B7B0-0970216637A8}.Release|x64.ActiveCfg = Release|Any CPU + {28C6A39C-7AE7-4210-B7B0-0970216637A8}.Release|x64.Build.0 = Release|Any CPU + {28C6A39C-7AE7-4210-B7B0-0970216637A8}.Release|x86.ActiveCfg = Release|Any CPU + {28C6A39C-7AE7-4210-B7B0-0970216637A8}.Release|x86.Build.0 = Release|Any CPU + {3DE45286-B0DB-4D74-B322-F5467FB2EF53}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3DE45286-B0DB-4D74-B322-F5467FB2EF53}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3DE45286-B0DB-4D74-B322-F5467FB2EF53}.Debug|x64.ActiveCfg = Debug|Any CPU + {3DE45286-B0DB-4D74-B322-F5467FB2EF53}.Debug|x64.Build.0 = Debug|Any CPU + {3DE45286-B0DB-4D74-B322-F5467FB2EF53}.Debug|x86.ActiveCfg = Debug|Any CPU + {3DE45286-B0DB-4D74-B322-F5467FB2EF53}.Debug|x86.Build.0 = Debug|Any CPU + {3DE45286-B0DB-4D74-B322-F5467FB2EF53}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3DE45286-B0DB-4D74-B322-F5467FB2EF53}.Release|Any CPU.Build.0 = Release|Any CPU + {3DE45286-B0DB-4D74-B322-F5467FB2EF53}.Release|x64.ActiveCfg = Release|Any CPU + {3DE45286-B0DB-4D74-B322-F5467FB2EF53}.Release|x64.Build.0 = Release|Any CPU + {3DE45286-B0DB-4D74-B322-F5467FB2EF53}.Release|x86.ActiveCfg = Release|Any CPU + {3DE45286-B0DB-4D74-B322-F5467FB2EF53}.Release|x86.Build.0 = Release|Any CPU + {559B6369-1868-4A06-A590-F80BA7B80A1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {559B6369-1868-4A06-A590-F80BA7B80A1B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {559B6369-1868-4A06-A590-F80BA7B80A1B}.Debug|x64.ActiveCfg = Debug|Any CPU + {559B6369-1868-4A06-A590-F80BA7B80A1B}.Debug|x64.Build.0 = Debug|Any CPU + {559B6369-1868-4A06-A590-F80BA7B80A1B}.Debug|x86.ActiveCfg = Debug|Any CPU + {559B6369-1868-4A06-A590-F80BA7B80A1B}.Debug|x86.Build.0 = Debug|Any CPU + {559B6369-1868-4A06-A590-F80BA7B80A1B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {559B6369-1868-4A06-A590-F80BA7B80A1B}.Release|Any CPU.Build.0 = Release|Any CPU + {559B6369-1868-4A06-A590-F80BA7B80A1B}.Release|x64.ActiveCfg = Release|Any CPU + {559B6369-1868-4A06-A590-F80BA7B80A1B}.Release|x64.Build.0 = Release|Any CPU + {559B6369-1868-4A06-A590-F80BA7B80A1B}.Release|x86.ActiveCfg = Release|Any CPU + {559B6369-1868-4A06-A590-F80BA7B80A1B}.Release|x86.Build.0 = Release|Any CPU + {B61AAC9E-59E9-4F47-BBE3-97AC24112EFE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B61AAC9E-59E9-4F47-BBE3-97AC24112EFE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B61AAC9E-59E9-4F47-BBE3-97AC24112EFE}.Debug|x64.ActiveCfg = Debug|Any CPU + {B61AAC9E-59E9-4F47-BBE3-97AC24112EFE}.Debug|x64.Build.0 = Debug|Any CPU + {B61AAC9E-59E9-4F47-BBE3-97AC24112EFE}.Debug|x86.ActiveCfg = Debug|Any CPU + {B61AAC9E-59E9-4F47-BBE3-97AC24112EFE}.Debug|x86.Build.0 = Debug|Any CPU + {B61AAC9E-59E9-4F47-BBE3-97AC24112EFE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B61AAC9E-59E9-4F47-BBE3-97AC24112EFE}.Release|Any CPU.Build.0 = Release|Any CPU + {B61AAC9E-59E9-4F47-BBE3-97AC24112EFE}.Release|x64.ActiveCfg = Release|Any CPU + {B61AAC9E-59E9-4F47-BBE3-97AC24112EFE}.Release|x64.Build.0 = Release|Any CPU + {B61AAC9E-59E9-4F47-BBE3-97AC24112EFE}.Release|x86.ActiveCfg = Release|Any CPU + {B61AAC9E-59E9-4F47-BBE3-97AC24112EFE}.Release|x86.Build.0 = Release|Any CPU + {22C0B061-F7CC-4A7F-AEC7-D4DBBE6B23B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {22C0B061-F7CC-4A7F-AEC7-D4DBBE6B23B2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {22C0B061-F7CC-4A7F-AEC7-D4DBBE6B23B2}.Debug|x64.ActiveCfg = Debug|Any CPU + {22C0B061-F7CC-4A7F-AEC7-D4DBBE6B23B2}.Debug|x64.Build.0 = Debug|Any CPU + {22C0B061-F7CC-4A7F-AEC7-D4DBBE6B23B2}.Debug|x86.ActiveCfg = Debug|Any CPU + {22C0B061-F7CC-4A7F-AEC7-D4DBBE6B23B2}.Debug|x86.Build.0 = Debug|Any CPU + {22C0B061-F7CC-4A7F-AEC7-D4DBBE6B23B2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {22C0B061-F7CC-4A7F-AEC7-D4DBBE6B23B2}.Release|Any CPU.Build.0 = Release|Any CPU + {22C0B061-F7CC-4A7F-AEC7-D4DBBE6B23B2}.Release|x64.ActiveCfg = Release|Any CPU + {22C0B061-F7CC-4A7F-AEC7-D4DBBE6B23B2}.Release|x64.Build.0 = Release|Any CPU + {22C0B061-F7CC-4A7F-AEC7-D4DBBE6B23B2}.Release|x86.ActiveCfg = Release|Any CPU + {22C0B061-F7CC-4A7F-AEC7-D4DBBE6B23B2}.Release|x86.Build.0 = Release|Any CPU + {1FE00D5E-EC0F-4238-93EC-DABA26DBD1A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1FE00D5E-EC0F-4238-93EC-DABA26DBD1A9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1FE00D5E-EC0F-4238-93EC-DABA26DBD1A9}.Debug|x64.ActiveCfg = Debug|Any CPU + {1FE00D5E-EC0F-4238-93EC-DABA26DBD1A9}.Debug|x64.Build.0 = Debug|Any CPU + {1FE00D5E-EC0F-4238-93EC-DABA26DBD1A9}.Debug|x86.ActiveCfg = Debug|Any CPU + {1FE00D5E-EC0F-4238-93EC-DABA26DBD1A9}.Debug|x86.Build.0 = Debug|Any CPU + {1FE00D5E-EC0F-4238-93EC-DABA26DBD1A9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1FE00D5E-EC0F-4238-93EC-DABA26DBD1A9}.Release|Any CPU.Build.0 = Release|Any CPU + {1FE00D5E-EC0F-4238-93EC-DABA26DBD1A9}.Release|x64.ActiveCfg = Release|Any CPU + {1FE00D5E-EC0F-4238-93EC-DABA26DBD1A9}.Release|x64.Build.0 = Release|Any CPU + {1FE00D5E-EC0F-4238-93EC-DABA26DBD1A9}.Release|x86.ActiveCfg = Release|Any CPU + {1FE00D5E-EC0F-4238-93EC-DABA26DBD1A9}.Release|x86.Build.0 = Release|Any CPU + {84BA8C1A-A432-4D03-A2FA-127B8776C872}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {84BA8C1A-A432-4D03-A2FA-127B8776C872}.Debug|Any CPU.Build.0 = Debug|Any CPU + {84BA8C1A-A432-4D03-A2FA-127B8776C872}.Debug|x64.ActiveCfg = Debug|Any CPU + {84BA8C1A-A432-4D03-A2FA-127B8776C872}.Debug|x64.Build.0 = Debug|Any CPU + {84BA8C1A-A432-4D03-A2FA-127B8776C872}.Debug|x86.ActiveCfg = Debug|Any CPU + {84BA8C1A-A432-4D03-A2FA-127B8776C872}.Debug|x86.Build.0 = Debug|Any CPU + {84BA8C1A-A432-4D03-A2FA-127B8776C872}.Release|Any CPU.ActiveCfg = Release|Any CPU + {84BA8C1A-A432-4D03-A2FA-127B8776C872}.Release|Any CPU.Build.0 = Release|Any CPU + {84BA8C1A-A432-4D03-A2FA-127B8776C872}.Release|x64.ActiveCfg = Release|Any CPU + {84BA8C1A-A432-4D03-A2FA-127B8776C872}.Release|x64.Build.0 = Release|Any CPU + {84BA8C1A-A432-4D03-A2FA-127B8776C872}.Release|x86.ActiveCfg = Release|Any CPU + {84BA8C1A-A432-4D03-A2FA-127B8776C872}.Release|x86.Build.0 = Release|Any CPU + {8B92F97B-02FC-4FA0-8FA5-F494CAF15336}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8B92F97B-02FC-4FA0-8FA5-F494CAF15336}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8B92F97B-02FC-4FA0-8FA5-F494CAF15336}.Debug|x64.ActiveCfg = Debug|Any CPU + {8B92F97B-02FC-4FA0-8FA5-F494CAF15336}.Debug|x64.Build.0 = Debug|Any CPU + {8B92F97B-02FC-4FA0-8FA5-F494CAF15336}.Debug|x86.ActiveCfg = Debug|Any CPU + {8B92F97B-02FC-4FA0-8FA5-F494CAF15336}.Debug|x86.Build.0 = Debug|Any CPU + {8B92F97B-02FC-4FA0-8FA5-F494CAF15336}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8B92F97B-02FC-4FA0-8FA5-F494CAF15336}.Release|Any CPU.Build.0 = Release|Any CPU + {8B92F97B-02FC-4FA0-8FA5-F494CAF15336}.Release|x64.ActiveCfg = Release|Any CPU + {8B92F97B-02FC-4FA0-8FA5-F494CAF15336}.Release|x64.Build.0 = Release|Any CPU + {8B92F97B-02FC-4FA0-8FA5-F494CAF15336}.Release|x86.ActiveCfg = Release|Any CPU + {8B92F97B-02FC-4FA0-8FA5-F494CAF15336}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -127,6 +243,12 @@ Global {B93981B8-3295-4EDD-B314-BCA77B6BF37A} = {94C8A78D-AA15-47B2-A348-530CD86BFC1B} {1A5EC2EB-8C2B-4547-8AC6-EB5C0DE0CA81} = {94C8A78D-AA15-47B2-A348-530CD86BFC1B} {E7405816-F32A-4F3E-AD76-29129962C6AA} = {94C8A78D-AA15-47B2-A348-530CD86BFC1B} + {28C6A39C-7AE7-4210-B7B0-0970216637A8} = {2A381C57-2697-427B-9F10-55DA11FD02E4} + {3DE45286-B0DB-4D74-B322-F5467FB2EF53} = {2A381C57-2697-427B-9F10-55DA11FD02E4} + {559B6369-1868-4A06-A590-F80BA7B80A1B} = {2A381C57-2697-427B-9F10-55DA11FD02E4} + {B61AAC9E-59E9-4F47-BBE3-97AC24112EFE} = {2A381C57-2697-427B-9F10-55DA11FD02E4} + {22C0B061-F7CC-4A7F-AEC7-D4DBBE6B23B2} = {2A381C57-2697-427B-9F10-55DA11FD02E4} + {1FE00D5E-EC0F-4238-93EC-DABA26DBD1A9} = {4A92E8A6-9A6D-41A1-9CDA-DE10899648AA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {089687FD-5D25-40AB-BA8A-A10D1E137F98} diff --git a/FreeSql/DataAnnotations/ColumnAttribute.cs b/FreeSql/DataAnnotations/ColumnAttribute.cs index df5c9835..4bc8dedb 100644 --- a/FreeSql/DataAnnotations/ColumnAttribute.cs +++ b/FreeSql/DataAnnotations/ColumnAttribute.cs @@ -66,7 +66,7 @@ namespace FreeSql.DataAnnotations { /// /// 数据库默认值 /// - internal object DbDefautValue { get; set; } + public object DbDefautValue { get; set; } /// /// 类型映射,比如:可将 enum 属性映射成 typeof(string) diff --git a/FreeSql/DatabaseModel/DBColumnInfo.cs b/FreeSql/DatabaseModel/DBColumnInfo.cs index 62fec15d..2fd9f6af 100644 --- a/FreeSql/DatabaseModel/DBColumnInfo.cs +++ b/FreeSql/DatabaseModel/DBColumnInfo.cs @@ -5,46 +5,46 @@ namespace FreeSql.DatabaseModel { /// /// 所属表 /// - public DbTableInfo Table { get; internal set; } + public DbTableInfo Table { get; set; } /// /// 列名 /// - public string Name { get; internal set; } + public string Name { get; set; } /// /// 映射到 C# 类型 /// - public Type CsType { get; internal set; } + public Type CsType { get; set; } /// /// 数据库枚举类型int值 /// - public int DbType { get; internal set; } + public int DbType { get; set; } /// /// 数据库类型,字符串,varchar /// - public string DbTypeText { get; internal set; } + public string DbTypeText { get; set; } /// /// 数据库类型,字符串,varchar(255) /// - public string DbTypeTextFull { get; internal set; } + public string DbTypeTextFull { get; set; } /// /// 最大长度 /// - public int MaxLength { get; internal set; } + public int MaxLength { get; set; } /// /// 主键 /// - public bool IsPrimary { get; internal set; } + public bool IsPrimary { get; set; } /// /// 自增标识 /// - public bool IsIdentity { get; internal set; } + public bool IsIdentity { get; set; } /// /// 是否可DBNull /// - public bool IsNullable { get; internal set; } + public bool IsNullable { get; set; } /// /// 备注 /// - public string Coment { get; internal set; } + public string Coment { get; set; } } } diff --git a/FreeSql/DatabaseModel/DBTableInfo.cs b/FreeSql/DatabaseModel/DBTableInfo.cs index c662f7f3..01a602f6 100644 --- a/FreeSql/DatabaseModel/DBTableInfo.cs +++ b/FreeSql/DatabaseModel/DBTableInfo.cs @@ -6,19 +6,19 @@ namespace FreeSql.DatabaseModel { /// /// 唯一标识 /// - public string Id { get; internal set; } + public string Id { get; set; } /// /// SqlServer下是Owner、PostgreSQL下是Schema、MySql下是数据库名 /// - public string Schema { get; internal set; } + public string Schema { get; set; } /// /// 表名 /// - public string Name { get; internal set; } + public string Name { get; set; } /// /// 表备注,SqlServer下是扩展属性 MS_Description /// - public string Comment { get; internal set; } + public string Comment { get; set; } /// /// 表/视图 /// @@ -26,27 +26,27 @@ namespace FreeSql.DatabaseModel { /// /// 列 /// - public List Columns { get; internal set; } = new List(); + public List Columns { get; set; } = new List(); /// /// 自增列 /// - public List Identitys { get; internal set; } = new List(); + public List Identitys { get; set; } = new List(); /// /// 主键/组合 /// - public List Primarys { get; internal set; } = new List(); + public List Primarys { get; set; } = new List(); /// /// 唯一键/组合 /// - public Dictionary> UniquesDict { get; internal set; } = new Dictionary>(); + public Dictionary> UniquesDict { get; set; } = new Dictionary>(); /// /// 索引/组合 /// - public Dictionary> IndexesDict { get; internal set; } = new Dictionary>(); + public Dictionary> IndexesDict { get; set; } = new Dictionary>(); /// /// 外键 /// - public Dictionary ForeignsDict { get; internal set; } = new Dictionary(); + public Dictionary ForeignsDict { get; set; } = new Dictionary(); public List> Uniques => UniquesDict.Values.ToList(); public List> Indexes => IndexesDict.Values.ToList(); diff --git a/FreeSql/DatabaseModel/DbForeignInfo.cs b/FreeSql/DatabaseModel/DbForeignInfo.cs index eda23933..70dca1f5 100644 --- a/FreeSql/DatabaseModel/DbForeignInfo.cs +++ b/FreeSql/DatabaseModel/DbForeignInfo.cs @@ -2,10 +2,10 @@ namespace FreeSql.DatabaseModel { public class DbForeignInfo { - public DbTableInfo Table { get; internal set; } - public List Columns { get; internal set; } = new List(); - public DbTableInfo ReferencedTable { get; internal set; } - public List ReferencedColumns { get; internal set; } = new List(); + public DbTableInfo Table { get; set; } + public List Columns { get; set; } = new List(); + public DbTableInfo ReferencedTable { get; set; } + public List ReferencedColumns { get; set; } = new List(); } } diff --git a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs index 98d1d050..c5fde52a 100644 --- a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs +++ b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs @@ -28,7 +28,7 @@ public static partial class FreeSqlGlobalExtensions { public static bool IsNumberType(this Type that) => that == null ? false : dicIsNumberType.Value.ContainsKey(that); public static bool IsNullableType(this Type that) => that?.FullName.StartsWith("System.Nullable`1[") == true; public static bool IsAnonymousType(this Type that) => that?.FullName.StartsWith("<>f__AnonymousType") == true; - internal static Type NullableTypeOrThis(this Type that) => that?.IsNullableType() == true ? that.GenericTypeArguments.First() : that; + public static Type NullableTypeOrThis(this Type that) => that?.IsNullableType() == true ? that.GenericTypeArguments.First() : that; /// /// 测量两个经纬度的距离,返回单位:米 diff --git a/FreeSql/FreeSql.csproj b/FreeSql/FreeSql.csproj index bbc28275..5fb7079e 100644 --- a/FreeSql/FreeSql.csproj +++ b/FreeSql/FreeSql.csproj @@ -2,7 +2,7 @@ netstandard2.0 - 0.5.23 + 0.6.1 true YeXiangQin FreeSql is the most convenient ORM in dotnet. It supports Mysql, Postgresql, SqlServer, Oracle and Sqlite. @@ -23,18 +23,7 @@ - - - - - - - - - - - diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 7c722880..cca0ec01 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -409,20 +409,6 @@ - - - 使用缓存,不指定默认使用内存 - - 缓存实现 - - - - - 使用日志,不指定默认输出控制台 - - - - 使用连接串 @@ -488,16 +474,6 @@ 执行后,可监视执行性能 - - - - - 返回内容 - 渲染对象 - 当前文件路径 - - - 指定事务对象 @@ -807,14 +783,6 @@ - - - 缓存查询结果 - - 缓存秒数 - 缓存key - - 左联查询,使用导航属性自动生成SQL @@ -1643,12 +1611,6 @@ 当前线程的事务 - - - 事务完成前预删除缓存 - - - 查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】 @@ -2081,118 +2043,6 @@ 耗时(单位:毫秒) - - - 缓存数据时序列化方法,若无设置则默认使用 Json.net - - - - - 获取缓存数据时反序列化方法,若无设置则默认使用 Json.net - - - - - 缓存可序列化数据 - - - 缓存键 - 可序列化数据 - 缓存秒数,<=0时永久缓存 - - - - 循环或批量获取缓存数据 - - - - - - - - 循环或批量获取缓存数据 - - - - - - - 循环或批量删除缓存键 - - 缓存键[数组] - - - - 缓存壳 - - 缓存类型 - 缓存键 - 缓存秒数 - 获取源数据的函数 - - - - - 缓存壳(哈希表) - - 缓存类型 - 缓存键 - 字段 - 缓存秒数 - 获取源数据的函数 - - - - - 缓存可序列化数据 - - - 缓存键 - 可序列化数据 - 缓存秒数,<=0时永久缓存 - - - - 循环或批量获取缓存数据 - - - - - - - - 循环或批量获取缓存数据 - - - - - - - 循环或批量删除缓存键 - - 缓存键[数组] - - - - 缓存壳 - - 缓存类型 - 缓存键 - 缓存秒数 - 获取源数据的函数 - - - - - 缓存壳(哈希表) - - 缓存类型 - 缓存键 - 字段 - 缓存秒数 - 获取源数据的函数 - - 【开发环境必备】自动同步实体结构到数据库,程序运行中检查实体表是否存在,然后创建或修改 @@ -2385,46 +2235,6 @@ - - - 特殊处理类似 string.Format 的使用方法,防止注入,以及 IS NULL 转换 - - - - - - - - 特殊处理类似 string.Format 的使用方法,防止注入,以及 IS NULL 转换 - - - - - - - - 特殊处理类似 string.Format 的使用方法,防止注入,以及 IS NULL 转换 - - - - - - - - 特殊处理类似 string.Format 的使用方法,防止注入,以及 IS NULL 转换 - - - - - - - - 特殊处理类似 string.Format 的使用方法,防止注入,以及 IS NULL 转换 - - - - - 生成类似Mongodb的ObjectId有序、不重复Guid @@ -2520,11 +2330,6 @@ 事务体 () => {} 超时,未执行完将自动提交 - - - 缓存 - - 数据库访问对象 @@ -2545,36 +2350,5 @@ DbFirst 模式开发相关方法 - - - 测量两个经纬度的距离,返回单位:米 - - 经纬坐标1 - 经纬坐标2 - 返回距离(单位:米) - - - - 测量两个经纬度的距离,返回单位:米 - - 经纬坐标1 - 经纬坐标2 - 返回距离(单位:米) - - - - 测量两个经纬度的距离,返回单位:米 - - 经纬坐标1 - 经纬坐标2 - 返回距离(单位:米) - - - - 将 1010101010 这样的二进制字符串转换成 BitArray - - 1010101010 - - diff --git a/FreeSql/FreeSqlBuilder.cs b/FreeSql/FreeSqlBuilder.cs index 8e49e579..f9875fd8 100644 --- a/FreeSql/FreeSqlBuilder.cs +++ b/FreeSql/FreeSqlBuilder.cs @@ -1,12 +1,8 @@ -using Microsoft.Extensions.Caching.Distributed; -using Microsoft.Extensions.Logging; -using System; +using System; using System.Data.Common; namespace FreeSql { public class FreeSqlBuilder { - IDistributedCache _cache; - ILogger _logger; DataType _dataType; string _masterConnectionString; string[] _slaveConnectionString; @@ -19,25 +15,6 @@ namespace FreeSql { Action _aopCommandExecuting = null; Action _aopCommandExecuted = null; - /// - /// 使用缓存,不指定默认使用内存 - /// - /// 缓存实现 - /// - public FreeSqlBuilder UseCache(IDistributedCache cache) { - _cache = cache; - return this; - } - - /// - /// 使用日志,不指定默认输出控制台 - /// - /// - /// - public FreeSqlBuilder UseLogger(ILogger logger) { - _logger = logger; - return this; - } /// /// 使用连接串 /// @@ -127,14 +104,27 @@ namespace FreeSql { public IFreeSql Build() => Build(); public IFreeSql Build() { IFreeSql ret = null; + Type type = null; switch(_dataType) { - case DataType.MySql: ret = new MySql.MySqlProvider(_cache, _logger, _masterConnectionString, _slaveConnectionString); break; - case DataType.SqlServer: ret = new SqlServer.SqlServerProvider(_cache, _logger, _masterConnectionString, _slaveConnectionString); break; - case DataType.PostgreSQL: ret = new PostgreSQL.PostgreSQLProvider(_cache, _logger, _masterConnectionString, _slaveConnectionString); break; - case DataType.Oracle: ret = new Oracle.OracleProvider(_cache, _logger, _masterConnectionString, _slaveConnectionString); break; - case DataType.Sqlite: ret = new Sqlite.SqliteProvider(_cache, _logger, _masterConnectionString, _slaveConnectionString); break; + case DataType.MySql: + type = Type.GetType("FreeSql.MySql.MySqlProvider`1,FreeSql.Provider.MySql")?.MakeGenericType(typeof(TMark)); + if (type == null) throw new Exception("缺少 FreeSql 数据库实现包:FreeSql.Provider.MySql.dll,可前往 nuget 下载"); + break; + case DataType.SqlServer: type = Type.GetType("FreeSql.SqlServer.SqlServerProvider`1,FreeSql.Provider.SqlServer")?.MakeGenericType(typeof(TMark)); + if (type == null) throw new Exception("缺少 FreeSql 数据库实现包:FreeSql.Provider.SqlServer.dll,可前往 nuget 下载"); + break; + case DataType.PostgreSQL: type = Type.GetType("FreeSql.PostgreSQL.PostgreSQLProvider`1,FreeSql.Provider.PostgreSQL")?.MakeGenericType(typeof(TMark)); + if (type == null) throw new Exception("缺少 FreeSql 数据库实现包:FreeSql.Provider.PostgreSQL.dll,可前往 nuget 下载"); + break; + case DataType.Oracle: type = Type.GetType("FreeSql.Oracle.OracleProvider`1,FreeSql.Provider.Oracle")?.MakeGenericType(typeof(TMark)); + if (type == null) throw new Exception("缺少 FreeSql 数据库实现包:FreeSql.Provider.Oracle.dll,可前往 nuget 下载"); + break; + case DataType.Sqlite: type = Type.GetType("FreeSql.Sqlite.SqliteProvider`1,FreeSql.Provider.Sqlite")?.MakeGenericType(typeof(TMark)); + if (type == null) throw new Exception("缺少 FreeSql 数据库实现包:FreeSql.Provider.Sqlite.dll,可前往 nuget 下载"); + break; default: throw new Exception("未指定 UseConnectionString"); } + ret = Activator.CreateInstance(type, new object[] { _masterConnectionString, _slaveConnectionString }) as IFreeSql; if (ret != null) { ret.CodeFirst.IsAutoSyncStructure = _isAutoSyncStructure; diff --git a/FreeSql/FreeUtil.cs b/FreeSql/FreeUtil.cs index 1bc14ccb..11a82798 100644 --- a/FreeSql/FreeUtil.cs +++ b/FreeSql/FreeUtil.cs @@ -31,38 +31,4 @@ public static class FreeUtil { var guid = $"{uninxtime.ToString("x8").PadLeft(8, '0')}{__staticMachine.ToString("x8").PadLeft(8, '0').Substring(2, 6)}{__staticPid.ToString("x8").PadLeft(8, '0').Substring(6, 2)}{increment.ToString("x8").PadLeft(8, '0')}{rand.ToString("x8").PadLeft(8, '0')}"; return Guid.Parse(guid); } - - internal static void PrevReheatConnectionPool(ObjectPool pool, int minPoolSize) { - if (minPoolSize <= 0) minPoolSize = Math.Min(5, pool.Policy.PoolSize); - if (minPoolSize > pool.Policy.PoolSize) minPoolSize = pool.Policy.PoolSize; - var initTestOk = true; - var initStartTime = DateTime.Now; - var initConns = new ConcurrentBag>(); - - try { - var conn = pool.Get(); - initConns.Add(conn); - pool.Policy.OnCheckAvailable(conn); - } catch { - initTestOk = false; //预热一次失败,后面将不进行 - } - for (var a = 1; initTestOk && a < minPoolSize; a += 10) { - if (initStartTime.Subtract(DateTime.Now).TotalSeconds > 3) break; //预热耗时超过3秒,退出 - var b = Math.Min(minPoolSize - a, 10); //每10个预热 - var initTasks = new Task[b]; - for (var c = 0; c < b; c++) { - initTasks[c] = Task.Run(() => { - try { - var conn = pool.Get(); - initConns.Add(conn); - pool.Policy.OnCheckAvailable(conn); - } catch { - initTestOk = false; //有失败,下一组退出预热 - } - }); - } - Task.WaitAll(initTasks); - } - while (initConns.TryTake(out var conn)) pool.Return(conn); - } } \ No newline at end of file diff --git a/FreeSql/Generator/TemplateEngin.cs b/FreeSql/Generator/TemplateEngin.cs deleted file mode 100644 index 501082f3..00000000 --- a/FreeSql/Generator/TemplateEngin.cs +++ /dev/null @@ -1,644 +0,0 @@ -using Microsoft.CSharp; -using System; -using System.CodeDom.Compiler; -using System.Collections; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading; - -namespace FreeSql.Generator { - public class TemplateEngin : IDisposable { - public interface ITemplateOutput { - /// - /// - /// - /// 返回内容 - /// 渲染对象 - /// 当前文件路径 - /// - /// - TemplateReturnInfo OuTpUt(StringBuilder tOuTpUt, IDictionary oPtIoNs, string rEfErErFiLeNaMe, TemplateEngin tEmPlAtEsEnDeR); - } - public class TemplateReturnInfo { - public Dictionary Blocks; - public StringBuilder Sb; - } - public delegate bool TemplateIf(object exp); - public delegate void TemplatePrint(params object[] parms); - - private static int _view = 0; - private static Regex _reg = new Regex(@"\{(\$TEMPLATE__CODE|\/\$TEMPLATE__CODE|import\s+|module\s+|extends\s+|block\s+|include\s+|for\s+|if\s+|#|\/for|elseif|else|\/if|\/block|\/module)([^\}]*)\}", RegexOptions.Compiled); - private static Regex _reg_forin = new Regex(@"^([\w_]+)\s*,?\s*([\w_]+)?\s+in\s+(.+)", RegexOptions.Compiled); - private static Regex _reg_foron = new Regex(@"^([\w_]+)\s*,?\s*([\w_]+)?,?\s*([\w_]+)?\s+on\s+(.+)", RegexOptions.Compiled); - private static Regex _reg_forab = new Regex(@"^([\w_]+)\s+([^,]+)\s*,\s*(.+)", RegexOptions.Compiled); - private static Regex _reg_miss = new Regex(@"\{\/?miss\}", RegexOptions.Compiled); - private static Regex _reg_code = new Regex(@"(\{%|%\})", RegexOptions.Compiled); - private static Regex _reg_syntax = new Regex(@"<(\w+)\s+@(if|for|else)\s*=""([^""]*)""", RegexOptions.Compiled); - private static Regex _reg_htmltag = new Regex(@"<\/?\w+[^>]*>", RegexOptions.Compiled); - private static Regex _reg_blank = new Regex(@"\s+", RegexOptions.Compiled); - private static Regex _reg_complie_undefined = new Regex(@"(当前上下文中不存在名称)?“(\w+)”", RegexOptions.Compiled); - - private Dictionary _cache = new Dictionary(); - private object _cache_lock = new object(); - private string _viewDir; - private string[] _usings; - private FileSystemWatcher _fsw = new FileSystemWatcher(); - - public TemplateEngin(string viewDir, params string[] usings) { - _viewDir = Utils.TranslateUrl(viewDir); - _usings = usings; - _fsw = new FileSystemWatcher(_viewDir); - _fsw.IncludeSubdirectories = true; - _fsw.Changed += ViewDirChange; - _fsw.Renamed += ViewDirChange; - _fsw.EnableRaisingEvents = true; - } - public void Dispose() { - _fsw.Dispose(); - } - void ViewDirChange(object sender, FileSystemEventArgs e) { - string filename = e.FullPath.ToLower(); - lock (_cache_lock) { - _cache.Remove(filename); - } - } - public TemplateReturnInfo RenderFile2(StringBuilder sb, IDictionary options, string filename, string refererFilename) { - if (filename[0] == '/' || string.IsNullOrEmpty(refererFilename)) refererFilename = _viewDir; - //else refererFilename = Path.GetDirectoryName(refererFilename); - string filename2 = Utils.TranslateUrl(filename, refererFilename); - ITemplateOutput tpl; - if (_cache.TryGetValue(filename2, out tpl) == false) { - string tplcode = File.Exists(filename2) == false ? string.Concat("文件不存在 ", filename) : Utils.ReadTextFile(filename2); - tpl = Parser(tplcode, _usings, options); - lock (_cache_lock) { - if (_cache.ContainsKey(filename2) == false) { - _cache.Add(filename2, tpl); - } - } - } - try { - return tpl.OuTpUt(sb, options, filename2, this); - } catch (Exception ex) { - TemplateReturnInfo ret = sb == null ? - new TemplateReturnInfo { Sb = new StringBuilder(), Blocks = new Dictionary() } : - new TemplateReturnInfo { Sb = sb, Blocks = new Dictionary() }; - ret.Sb.Append(refererFilename); - ret.Sb.Append(" -> "); - ret.Sb.Append(filename); - ret.Sb.Append("\r\n"); - ret.Sb.Append(ex.Message); - ret.Sb.Append("\r\n"); - ret.Sb.Append(ex.StackTrace); - return ret; - } - } - public string RenderFile(string filename, IDictionary options) { - TemplateReturnInfo ret = this.RenderFile2(null, options, filename, null); - return ret.Sb.ToString(); - } - private static ITemplateOutput Parser(string tplcode, string[] usings, IDictionary options) { - int view = Interlocked.Increment(ref _view); - StringBuilder sb = new StringBuilder(); - IDictionary options_copy = new Hashtable(); - foreach (DictionaryEntry options_de in options) options_copy[options_de.Key] = options_de.Value; - sb.AppendFormat(@" -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions;{1} - -//namespace TplDynamicCodeGenerate {{ - public class TplDynamicCodeGenerate_view{0} : FreeSql.Generator.TemplateEngin.ITemplateOutput {{ - public FreeSql.Generator.TemplateEngin.TemplateReturnInfo OuTpUt(StringBuilder tOuTpUt, IDictionary oPtIoNs, string rEfErErFiLeNaMe, FreeSql.Generator.TemplateEngin tEmPlAtEsEnDeR) {{ - FreeSql.Generator.TemplateEngin.TemplateReturnInfo rTn = tOuTpUt == null ? - new FreeSql.Generator.TemplateEngin.TemplateReturnInfo {{ Sb = (tOuTpUt = new StringBuilder()), Blocks = new Dictionary() }} : - new FreeSql.Generator.TemplateEngin.TemplateReturnInfo {{ Sb = tOuTpUt, Blocks = new Dictionary() }}; - Dictionary TPL__blocks = rTn.Blocks; - Stack TPL__blocks_stack = new Stack(); - int[] TPL__blocks_stack_peek; - List TPL__forc = new List(); - Func pRoCeSsOpTiOnS = new Func(delegate () {{ - IDictionary nEwoPtIoNs = new Hashtable(); - foreach (DictionaryEntry oPtIoNs_dE in oPtIoNs) - nEwoPtIoNs[oPtIoNs_dE.Key] = oPtIoNs_dE.Value; - foreach (IDictionary TPL__forc_dIc in TPL__forc) - foreach (DictionaryEntry TPL__forc_dIc_dE in TPL__forc_dIc) - nEwoPtIoNs[TPL__forc_dIc_dE.Key] = TPL__forc_dIc_dE.Value; - return nEwoPtIoNs; - }}); - FreeSql.Generator.TemplateEngin.TemplateIf tPlIf = delegate(object exp) {{ - if (exp is bool) return (bool)exp; - if (exp == null) return false; - if (exp is int && (int)exp == 0) return false; - if (exp is string && (string)exp == string.Empty) return false; - if (exp is long && (long)exp == 0) return false; - if (exp is short && (short)exp == 0) return false; - if (exp is byte && (byte)exp == 0) return false; - if (exp is double && (double)exp == 0) return false; - if (exp is float && (float)exp == 0) return false; - if (exp is decimal && (decimal)exp == 0) return false; - return true; - }}; - FreeSql.Generator.TemplateEngin.TemplatePrint print = delegate(object[] pArMs) {{ - if (pArMs == null || pArMs.Length == 0) return; - foreach (object pArMs_A in pArMs) if (pArMs_A != null) tOuTpUt.Append(pArMs_A); - }}; - FreeSql.Generator.TemplateEngin.TemplatePrint Print = print;", view, usings?.Any() == true ? $"\r\nusing {string.Join(";\r\nusing ", usings)};" : ""); - - #region {miss}...{/miss}块内容将不被解析 - string[] tmp_content_arr = _reg_miss.Split(tplcode); - if (tmp_content_arr.Length > 1) { - sb.AppendFormat(@" - string[] TPL__MISS = new string[{0}];", Math.Ceiling(1.0 * (tmp_content_arr.Length - 1) / 2)); - int miss_len = -1; - for (int a = 1; a < tmp_content_arr.Length; a += 2) { - sb.Append(string.Concat(@" - TPL__MISS[", ++miss_len, @"] = """, Utils.GetConstString(tmp_content_arr[a]), @""";")); - tmp_content_arr[a] = string.Concat("{#TPL__MISS[", miss_len, "]}"); - } - tplcode = string.Join("", tmp_content_arr); - } - #endregion - #region 扩展语法如
- tplcode = htmlSyntax(tplcode, 3); //
- //处理 {% %} 块 c#代码 - tmp_content_arr = _reg_code.Split(tplcode); - if (tmp_content_arr.Length == 1) { - tplcode = Utils.GetConstString(tplcode) - .Replace("{%", "{$TEMPLATE__CODE}") - .Replace("%}", "{/$TEMPLATE__CODE}"); - } else { - tmp_content_arr[0] = Utils.GetConstString(tmp_content_arr[0]); - for (int a = 1; a < tmp_content_arr.Length; a += 4) { - tmp_content_arr[a] = "{$TEMPLATE__CODE}"; - tmp_content_arr[a + 2] = "{/$TEMPLATE__CODE}"; - tmp_content_arr[a + 3] = Utils.GetConstString(tmp_content_arr[a + 3]); - } - tplcode = string.Join("", tmp_content_arr); - } - #endregion - sb.Append(@" - tOuTpUt.Append("""); - - string error = null; - int tpl_tmpid = 0; - int forc_i = 0; - string extends = null; - Stack codeTree = new Stack(); - Stack forEndRepl = new Stack(); - sb.Append(_reg.Replace(tplcode, delegate (Match m) { - string _0 = m.Groups[0].Value; - if (!string.IsNullOrEmpty(error)) return _0; - - string _1 = m.Groups[1].Value.Trim(' ', '\t'); - string _2 = m.Groups[2].Value - .Replace("\\\\", "\\") - .Replace("\\\"", "\""); - _2 = Utils.ReplaceSingleQuote(_2); - - switch (_1) { - #region $TEMPLATE__CODE-------------------------------------------------- - case "$TEMPLATE__CODE": - codeTree.Push(_1); - return @"""); -"; - case "/$TEMPLATE__CODE": - string pop = codeTree.Pop(); - if (pop != "$TEMPLATE__CODE") { - codeTree.Push(pop); - error = "编译出错,{% 与 %} 并没有配对"; - return _0; - } - return @" - tOuTpUt.Append("""; - #endregion - case "include": - return string.Format(@"""); -tEmPlAtEsEnDeR.RenderFile2(tOuTpUt, pRoCeSsOpTiOnS(), ""{0}"", rEfErErFiLeNaMe); - tOuTpUt.Append(""", _2); - case "import": - return _0; - case "module": - return _0; - case "/module": - return _0; - case "extends": - //{extends ../inc/layout.html} - if (string.IsNullOrEmpty(extends) == false) return _0; - extends = _2; - return string.Empty; - case "block": - codeTree.Push("block"); - return string.Format(@"""); -TPL__blocks_stack_peek = new int[] {{ tOuTpUt.Length, 0 }}; -TPL__blocks_stack.Push(TPL__blocks_stack_peek); -TPL__blocks.Add(""{0}"", TPL__blocks_stack_peek); -tOuTpUt.Append(""", _2.Trim(' ', '\t')); - case "/block": - codeTreeEnd(codeTree, "block"); - return @"""); -TPL__blocks_stack_peek = TPL__blocks_stack.Pop(); -TPL__blocks_stack_peek[1] = tOuTpUt.Length - TPL__blocks_stack_peek[0]; -tOuTpUt.Append("""; - - #region ##--------------------------------------------------------- - case "#": - if (_2[0] == '#') - return string.Format(@"""); - try {{ Print({0}); }} catch {{ }} - tOuTpUt.Append(""", _2.Substring(1)); - return string.Format(@"""); - Print({0}); - tOuTpUt.Append(""", _2); - #endregion - #region for-------------------------------------------------------- - case "for": - forc_i++; - int cur_tpl_tmpid = tpl_tmpid; - string sb_endRepl = string.Empty; - StringBuilder sbfor = new StringBuilder(); - sbfor.Append(@""");"); - Match mfor = _reg_forin.Match(_2); - if (mfor.Success) { - string mfor1 = mfor.Groups[1].Value.Trim(' ', '\t'); - string mfor2 = mfor.Groups[2].Value.Trim(' ', '\t'); - sbfor.AppendFormat(@" -//new Action(delegate () {{ - IDictionary TPL__tmp{0} = new Hashtable(); - TPL__forc.Add(TPL__tmp{0}); - var TPL__tmp{1} = {3}; - var TPL__tmp{2} = {4};", ++tpl_tmpid, ++tpl_tmpid, ++tpl_tmpid, mfor.Groups[3].Value, mfor1); - sb_endRepl = string.Concat(sb_endRepl, string.Format(@" - {0} = TPL__tmp{1};", mfor1, cur_tpl_tmpid + 3)); - if (options_copy.Contains(mfor1) == false) options_copy[mfor1] = null; - if (!string.IsNullOrEmpty(mfor2)) { - sbfor.AppendFormat(@" - var TPL__tmp{1} = {0}; - {0} = 0;", mfor2, ++tpl_tmpid); - sb_endRepl = string.Concat(sb_endRepl, string.Format(@" - {0} = TPL__tmp{1};", mfor2, tpl_tmpid)); - if (options_copy.Contains(mfor2) == false) options_copy[mfor2] = null; - } - sbfor.AppendFormat(@" - if (TPL__tmp{1} != null) - foreach (var TPL__tmp{0} in TPL__tmp{1}) {{", ++tpl_tmpid, cur_tpl_tmpid + 2); - if (!string.IsNullOrEmpty(mfor2)) - sbfor.AppendFormat(@" - TPL__tmp{1}[""{0}""] = ++ {0};", mfor2, cur_tpl_tmpid + 1); - sbfor.AppendFormat(@" - TPL__tmp{1}[""{0}""] = TPL__tmp{2}; - {0} = TPL__tmp{2}; - tOuTpUt.Append(""", mfor1, cur_tpl_tmpid + 1, tpl_tmpid); - codeTree.Push("for"); - forEndRepl.Push(sb_endRepl); - return sbfor.ToString(); - } - mfor = _reg_foron.Match(_2); - if (mfor.Success) { - string mfor1 = mfor.Groups[1].Value.Trim(' ', '\t'); - string mfor2 = mfor.Groups[2].Value.Trim(' ', '\t'); - string mfor3 = mfor.Groups[3].Value.Trim(' ', '\t'); - sbfor.AppendFormat(@" -//new Action(delegate () {{ - IDictionary TPL__tmp{0} = new Hashtable(); - TPL__forc.Add(TPL__tmp{0}); - var TPL__tmp{1} = {3}; - var TPL__tmp{2} = {4};", ++tpl_tmpid, ++tpl_tmpid, ++tpl_tmpid, mfor.Groups[4].Value, mfor1); - sb_endRepl = string.Concat(sb_endRepl, string.Format(@" - {0} = TPL__tmp{1};", mfor1, cur_tpl_tmpid + 3)); - if (options_copy.Contains(mfor1) == false) options_copy[mfor1] = null; - if (!string.IsNullOrEmpty(mfor2)) { - sbfor.AppendFormat(@" - var TPL__tmp{1} = {0};", mfor2, ++tpl_tmpid); - sb_endRepl = string.Concat(sb_endRepl, string.Format(@" - {0} = TPL__tmp{1};", mfor2, tpl_tmpid)); - if (options_copy.Contains(mfor2) == false) options_copy[mfor2] = null; - } - if (!string.IsNullOrEmpty(mfor3)) { - sbfor.AppendFormat(@" - var TPL__tmp{1} = {0}; - {0} = 0;", mfor3, ++tpl_tmpid); - sb_endRepl = string.Concat(sb_endRepl, string.Format(@" - {0} = TPL__tmp{1};", mfor3, tpl_tmpid)); - if (options_copy.Contains(mfor3) == false) options_copy[mfor3] = null; - } - sbfor.AppendFormat(@" - if (TPL__tmp{2} != null) - foreach (DictionaryEntry TPL__tmp{1} in TPL__tmp{2}) {{ - {0} = TPL__tmp{1}.Key; - TPL__tmp{3}[""{0}""] = {0};", mfor1, ++tpl_tmpid, cur_tpl_tmpid + 2, cur_tpl_tmpid + 1); - if (!string.IsNullOrEmpty(mfor2)) - sbfor.AppendFormat(@" - {0} = TPL__tmp{1}.Value; - TPL__tmp{2}[""{0}""] = {0};", mfor2, tpl_tmpid, cur_tpl_tmpid + 1); - if (!string.IsNullOrEmpty(mfor3)) - sbfor.AppendFormat(@" - TPL__tmp{1}[""{0}""] = ++ {0};", mfor3, cur_tpl_tmpid + 1); - sbfor.AppendFormat(@" - tOuTpUt.Append("""); - codeTree.Push("for"); - forEndRepl.Push(sb_endRepl); - return sbfor.ToString(); - } - mfor = _reg_forab.Match(_2); - if (mfor.Success) { - string mfor1 = mfor.Groups[1].Value.Trim(' ', '\t'); - sbfor.AppendFormat(@" -//new Action(delegate () {{ - IDictionary TPL__tmp{0} = new Hashtable(); - TPL__forc.Add(TPL__tmp{0}); - var TPL__tmp{1} = {5}; - {5} = {3} - 1; - if ({5} == null) {5} = 0; - var TPL__tmp{2} = {4} + 1; - while (++{5} < TPL__tmp{2}) {{ - TPL__tmp{0}[""{5}""] = {5}; - tOuTpUt.Append(""", ++tpl_tmpid, ++tpl_tmpid, ++tpl_tmpid, mfor.Groups[2].Value, mfor.Groups[3].Value, mfor1); - sb_endRepl = string.Concat(sb_endRepl, string.Format(@" - {0} = TPL__tmp{1};", mfor1, cur_tpl_tmpid + 1)); - if (options_copy.Contains(mfor1) == false) options_copy[mfor1] = null; - codeTree.Push("for"); - forEndRepl.Push(sb_endRepl); - return sbfor.ToString(); - } - return _0; - case "/for": - if (--forc_i < 0) return _0; - codeTreeEnd(codeTree, "for"); - return string.Format(@"""); - }}{0} - TPL__forc.RemoveAt(TPL__forc.Count - 1); -//}})(); - tOuTpUt.Append(""", forEndRepl.Pop()); - #endregion - #region if--------------------------------------------------------- - case "if": - codeTree.Push("if"); - return string.Format(@"""); - if ({1}tPlIf({0})) {{ - tOuTpUt.Append(""", _2[0] == '!' ? _2.Substring(1) : _2, _2[0] == '!' ? '!' : ' '); - case "elseif": - codeTreeEnd(codeTree, "if"); - codeTree.Push("if"); - return string.Format(@"""); - }} else if ({1}tPlIf({0})) {{ - tOuTpUt.Append(""", _2[0] == '!' ? _2.Substring(1) : _2, _2[0] == '!' ? '!' : ' '); - case "else": - codeTreeEnd(codeTree, "if"); - codeTree.Push("if"); - return @"""); - } else { - tOuTpUt.Append("""; - case "/if": - codeTreeEnd(codeTree, "if"); - return @"""); - } - tOuTpUt.Append("""; - #endregion - } - return _0; - })); - - sb.Append(@""");"); - if (string.IsNullOrEmpty(extends) == false) { - sb.AppendFormat(@" -FreeSql.Generator.TemplateEngin.TemplateReturnInfo eXtEnDs_ReT = tEmPlAtEsEnDeR.RenderFile2(null, pRoCeSsOpTiOnS(), ""{0}"", rEfErErFiLeNaMe); -string rTn_Sb_string = rTn.Sb.ToString(); -foreach(string eXtEnDs_ReT_blocks_key in eXtEnDs_ReT.Blocks.Keys) {{ - if (rTn.Blocks.ContainsKey(eXtEnDs_ReT_blocks_key)) {{ - int[] eXtEnDs_ReT_blocks_value = eXtEnDs_ReT.Blocks[eXtEnDs_ReT_blocks_key]; - eXtEnDs_ReT.Sb.Remove(eXtEnDs_ReT_blocks_value[0], eXtEnDs_ReT_blocks_value[1]); - int[] rTn_blocks_value = rTn.Blocks[eXtEnDs_ReT_blocks_key]; - eXtEnDs_ReT.Sb.Insert(eXtEnDs_ReT_blocks_value[0], rTn_Sb_string.Substring(rTn_blocks_value[0], rTn_blocks_value[1])); - foreach(string eXtEnDs_ReT_blocks_keyb in eXtEnDs_ReT.Blocks.Keys) {{ - if (eXtEnDs_ReT_blocks_keyb == eXtEnDs_ReT_blocks_key) continue; - int[] eXtEnDs_ReT_blocks_valueb = eXtEnDs_ReT.Blocks[eXtEnDs_ReT_blocks_keyb]; - if (eXtEnDs_ReT_blocks_valueb[0] >= eXtEnDs_ReT_blocks_value[0]) - eXtEnDs_ReT_blocks_valueb[0] = eXtEnDs_ReT_blocks_valueb[0] - eXtEnDs_ReT_blocks_value[1] + rTn_blocks_value[1]; - }} - eXtEnDs_ReT_blocks_value[1] = rTn_blocks_value[1]; - }} -}} -return eXtEnDs_ReT; -", extends); - } else { - sb.Append(@" -return rTn;"); - } - sb.Append(@" - } - } -//} -"); - var str = "FreeSql.Generator.TemplateEngin.TemplatePrint Print = print;"; - int dim_idx = sb.ToString().IndexOf(str) + str.Length; - foreach (string dic_name in options_copy.Keys) { - sb.Insert(dim_idx, string.Format(@" - dynamic {0} = oPtIoNs[""{0}""];", dic_name)); - } - //Console.WriteLine(sb.ToString()); - return Complie(sb.ToString(), @"TplDynamicCodeGenerate_view" + view); - } - private static string codeTreeEnd(Stack codeTree, string tag) { - string ret = string.Empty; - Stack pop = new Stack(); - foreach (string ct in codeTree) { - if (ct == "import" || - ct == "include") { - pop.Push(1); - } else if (ct == tag) { - pop.Push(2); - break; - } else { - if (string.IsNullOrEmpty(tag) == false) pop.Clear(); - break; - } - } - if (pop.Count == 0 && string.IsNullOrEmpty(tag) == false) - return string.Concat("语法错误,{", tag, "} {/", tag, "} 并没配对"); - while (pop.Count > 0 && pop.Pop() > 0) codeTree.Pop(); - return ret; - } - #region htmlSyntax - private static string htmlSyntax(string tplcode, int num) { - - while (num-- > 0) { - string[] arr = _reg_syntax.Split(tplcode); - - if (arr.Length == 1) break; - for (int a = 1; a < arr.Length; a += 4) { - string tag = string.Concat('<', arr[a]); - string end = string.Concat("'); - int fc = 1; - for (int b = a; fc > 0 && b < arr.Length; b += 4) { - if (b > a && arr[a].ToLower() == arr[b].ToLower()) fc++; - int bpos = 0; - while (true) { - int fa = arr[b + 3].IndexOf(tag, bpos); - int fb = arr[b + 3].IndexOf(end, bpos); - if (b == a) { - var z = arr[b + 3].IndexOf("/>"); - if ((fb == -1 || z < fb) && z != -1) { - var y = arr[b + 3].Substring(0, z + 2); - if (_reg_htmltag.IsMatch(y) == false) - fb = z - end.Length + 2; - } - } - if (fa == -1 && fb == -1) break; - if (fa != -1 && (fa < fb || fb == -1)) { - fc++; - bpos = fa + tag.Length; - continue; - } - if (fb != -1) fc--; - if (fc <= 0) { - var a1 = arr[a + 1]; - var end3 = string.Concat("{/", a1, "}"); - if (a1.ToLower() == "else") { - if (_reg_blank.Replace(arr[a - 4 + 3], "").EndsWith("{/if}", StringComparison.CurrentCultureIgnoreCase) == true) { - var idx = arr[a - 4 + 3].IndexOf("{/if}"); - arr[a - 4 + 3] = string.Concat(arr[a - 4 + 3].Substring(0, idx), arr[a - 4 + 3].Substring(idx + 5)); - //如果 @else="有条件内容",则变换成 elseif 条件内容 - if (_reg_blank.Replace(arr[a + 2], "").Length > 0) a1 = "elseif"; - end3 = "{/if}"; - } else { - arr[a] = string.Concat("指令 @", arr[a + 1], "='", arr[a + 2], "' 没紧接着 if/else 指令之后,无效. <", arr[a]); - arr[a + 1] = arr[a + 2] = string.Empty; - } - } - if (arr[a + 1].Length > 0) { - if (_reg_blank.Replace(arr[a + 2], "").Length > 0 || a1.ToLower() == "else") { - arr[b + 3] = string.Concat(arr[b + 3].Substring(0, fb + end.Length), end3, arr[b + 3].Substring(fb + end.Length)); - arr[a] = string.Concat("{", a1, " ", arr[a + 2], "}<", arr[a]); - arr[a + 1] = arr[a + 2] = string.Empty; - } else { - arr[a] = string.Concat('<', arr[a]); - arr[a + 1] = arr[a + 2] = string.Empty; - } - } - break; - } - bpos = fb + end.Length; - } - } - if (fc > 0) { - arr[a] = string.Concat("不严谨的html格式,请检查 ", arr[a], " 的结束标签, @", arr[a + 1], "='", arr[a + 2], "' 指令无效. <", arr[a]); - arr[a + 1] = arr[a + 2] = string.Empty; - } - } - if (arr.Length > 0) tplcode = string.Join(string.Empty, arr); - } - return tplcode; - } - #endregion - #region Complie - private static ITemplateOutput Complie(string cscode, string typename) { - var assemly = _compiler.Value.CompileCode(cscode); - var type = assemly.DefinedTypes.Where(a => a.FullName.EndsWith(typename)).FirstOrDefault(); - return Activator.CreateInstance(type) as ITemplateOutput; - } - internal static Lazy _compiler = new Lazy(() => { - //var dlls = Directory.GetFiles(Directory.GetParent(Type.GetType("IFreeSql, FreeSql").Assembly.Location).FullName, "*.dll"); - var compiler = new CSScriptLib.RoslynEvaluator(); - compiler.DisableReferencingFromCode = false; - //compiler.DebugBuild = true; - //foreach (var dll in dlls) { - // Console.WriteLine(dll); - // var ass = Assembly.LoadFile(dll); - // compiler.ReferenceAssembly(ass); - //} - compiler - .ReferenceAssemblyOf() - .ReferenceDomainAssemblies(); - return compiler; - }); - - #endregion - - #region Utils - public class Utils { - public static string ReplaceSingleQuote(object exp) { - //将 ' 转换成 " - string exp2 = string.Concat(exp); - int quote_pos = -1; - while (true) { - int first_pos = quote_pos = exp2.IndexOf('\'', quote_pos + 1); - if (quote_pos == -1) break; - while (true) { - quote_pos = exp2.IndexOf('\'', quote_pos + 1); - if (quote_pos == -1) break; - int r_cout = 0; - for (int p = 1; true; p++) { - if (exp2[quote_pos - p] == '\\') r_cout++; - else break; - } - if (r_cout % 2 == 0/* && quote_pos - first_pos > 2*/) { - string str1 = exp2.Substring(0, first_pos); - string str2 = exp2.Substring(first_pos + 1, quote_pos - first_pos - 1); - string str3 = exp2.Substring(quote_pos + 1); - string str4 = str2.Replace("\"", "\\\""); - quote_pos += str4.Length - str2.Length; - exp2 = string.Concat(str1, "\"", str4, "\"", str3); - break; - } - } - if (quote_pos == -1) break; - } - return exp2; - } - public static string GetConstString(object obj) { - return string.Concat(obj) - .Replace("\\", "\\\\") - .Replace("\"", "\\\"") - .Replace("\r", "\\r") - .Replace("\n", "\\n"); - } - - public static string ReadTextFile(string path) { - byte[] bytes = ReadFile(path); - return Encoding.UTF8.GetString(bytes).TrimStart((char)65279); - } - public static byte[] ReadFile(string path) { - if (File.Exists(path)) { - string destFileName = Path.GetTempFileName(); - File.Copy(path, destFileName, true); - int read = 0; - byte[] data = new byte[1024]; - using (MemoryStream ms = new MemoryStream()) { - using (FileStream fs = new FileStream(destFileName, FileMode.OpenOrCreate, FileAccess.Read)) { - do { - read = fs.Read(data, 0, data.Length); - if (read <= 0) break; - ms.Write(data, 0, read); - } while (true); - } - File.Delete(destFileName); - data = ms.ToArray(); - } - return data; - } - return new byte[] { }; - } - public static string TranslateUrl(string url) { - return TranslateUrl(url, null); - } - public static string TranslateUrl(string url, string baseDir) { - if (string.IsNullOrEmpty(baseDir)) baseDir = AppContext.BaseDirectory + "/"; - if (string.IsNullOrEmpty(url)) return Path.GetDirectoryName(baseDir); - if (url.StartsWith("~/")) url = url.Substring(1); - if (url.StartsWith("/")) return Path.GetFullPath(Path.Combine(Path.GetDirectoryName(baseDir), url.TrimStart('/'))); - if (url.StartsWith("\\")) return Path.GetFullPath(Path.Combine(Path.GetDirectoryName(baseDir), url.TrimStart('\\'))); - if (url.IndexOf(":\\") != -1) return url; - return Path.GetFullPath(Path.Combine(Path.GetDirectoryName(baseDir), url)); - } - } - #endregion - } -} diff --git a/FreeSql/Generator/TemplateGenerator.cs b/FreeSql/Generator/TemplateGenerator.cs deleted file mode 100644 index d97c255e..00000000 --- a/FreeSql/Generator/TemplateGenerator.cs +++ /dev/null @@ -1,72 +0,0 @@ -using FreeSql.DatabaseModel; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; - -namespace FreeSql.Generator { - public class TemplateGenerator { - - public void Build(IDbFirst dbfirst, string templateDirectory, string outputDirectory, params string[] database) { - if (dbfirst == null) throw new ArgumentException("dbfirst 参数不能为 null"); - if (string.IsNullOrEmpty(templateDirectory) || Directory.Exists(templateDirectory) == false) throw new ArgumentException("templateDirectory 目录不存在"); - if (string.IsNullOrEmpty(templateDirectory)) throw new ArgumentException("outputDirectory 不能为 null"); - if (database == null || database.Any() == false) throw new ArgumentException("database 参数不能为空"); - if (Directory.Exists(outputDirectory) == false) Directory.CreateDirectory(outputDirectory); - templateDirectory = new DirectoryInfo(templateDirectory).FullName; - outputDirectory = new DirectoryInfo(outputDirectory).FullName; - if (templateDirectory.IndexOf(outputDirectory, StringComparison.CurrentCultureIgnoreCase) != -1) throw new ArgumentException("outputDirectory 目录不能设置在 templateDirectory 目录内"); - var tables = dbfirst.GetTablesByDatabase(database); - var tpl = new TemplateEngin(templateDirectory, "FreeSql", "FreeSql.DatabaseModel"); - BuildEachDirectory(templateDirectory, outputDirectory, tpl, dbfirst, tables); - tpl.Dispose(); - } - - void BuildEachDirectory(string templateDirectory, string outputDirectory, TemplateEngin tpl, IDbFirst dbfirst, List tables) { - if (Directory.Exists(outputDirectory) == false) Directory.CreateDirectory(outputDirectory); - var files = Directory.GetFiles(templateDirectory); - foreach (var file in files) { - var fi = new FileInfo(file); - if (string.Compare(fi.Extension, ".FreeSql", true) == 0) { - var outputExtension = "." + fi.Name.Split('.')[1]; - if (fi.Name.StartsWith("for-table.")) { - foreach (var table in tables) { - var result = tpl.RenderFile(file, new Dictionary() { { "table", table }, { "dbfirst", dbfirst } }); - if (result.EndsWith("return;")) continue; - var outputName = table.Name + outputExtension; - var mcls = Regex.Match(result, @"\s+class\s+(\w+)"); - if (mcls.Success) outputName = mcls.Groups[1].Value + outputExtension; - var outputStream = Encoding.UTF8.GetBytes(result); - var fullname = outputDirectory + "/" + outputName; - if (File.Exists(fullname)) File.Delete(fullname); - using (var outfs = File.Open(fullname, FileMode.OpenOrCreate, FileAccess.Write)) { - outfs.Write(outputStream, 0, outputStream.Length); - outfs.Close(); - } - } - continue; - } else { - var result = tpl.RenderFile(file, new Dictionary() { { "tables", tables }, { "dbfirst", dbfirst } }); - var outputName = fi.Name; - var mcls = Regex.Match(result, @"\s+class\s+(\w+)"); - if (mcls.Success) outputName = mcls.Groups[1].Value + outputExtension; - var outputStream = Encoding.UTF8.GetBytes(result); - var fullname = outputDirectory + "/" + outputName; - if (File.Exists(fullname)) File.Delete(fullname); - using (var outfs = File.Open(fullname, FileMode.OpenOrCreate, FileAccess.Write)) { - outfs.Write(outputStream, 0, outputStream.Length); - outfs.Close(); - } - } - } - File.Copy(file, outputDirectory + file.Replace(templateDirectory, ""), true); - } - var dirs = Directory.GetDirectories(templateDirectory); - foreach(var dir in dirs) { - BuildEachDirectory(dir, outputDirectory + dir.Replace(templateDirectory, ""), tpl, dbfirst, tables); - } - } - } -} diff --git a/FreeSql/Interface/Curd/ISelect/ISelect0.cs b/FreeSql/Interface/Curd/ISelect/ISelect0.cs index 562d26ed..636124c8 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect0.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect0.cs @@ -108,13 +108,6 @@ namespace FreeSql { ///
/// TSelect Master(); - /// - /// 缓存查询结果 - /// - /// 缓存秒数 - /// 缓存key - /// - TSelect Caching(int seconds, string key = null); /// /// 左联查询,使用导航属性自动生成SQL diff --git a/FreeSql/Interface/IAdo.cs b/FreeSql/Interface/IAdo.cs index 5f2263b1..2eb67472 100644 --- a/FreeSql/Interface/IAdo.cs +++ b/FreeSql/Interface/IAdo.cs @@ -46,11 +46,6 @@ namespace FreeSql { /// 当前线程的事务 /// DbTransaction TransactionCurrentThread { get; } - /// - /// 事务完成前预删除缓存 - /// - /// - void TransactionPreRemoveCache(params string[] keys); #endregion /// diff --git a/FreeSql/Interface/ICache.cs b/FreeSql/Interface/ICache.cs deleted file mode 100644 index 49bbbf0c..00000000 --- a/FreeSql/Interface/ICache.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System; -using System.Threading.Tasks; - -namespace FreeSql { - public interface ICache { - - /// - /// 缓存数据时序列化方法,若无设置则默认使用 Json.net - /// - Func Serialize { get; set; } - /// - /// 获取缓存数据时反序列化方法,若无设置则默认使用 Json.net - /// - Func Deserialize { get; set; } - - /// - /// 缓存可序列化数据 - /// - /// - /// 缓存键 - /// 可序列化数据 - /// 缓存秒数,<=0时永久缓存 - void Set(string key, T data, int timeoutSeconds = 0); - /// - /// 循环或批量获取缓存数据 - /// - /// - /// - /// - T Get(string key); - /// - /// 循环或批量获取缓存数据 - /// - /// - /// - string Get(string key); - /// - /// 循环或批量删除缓存键 - /// - /// 缓存键[数组] - void Remove(params string[] keys); - /// - /// 缓存壳 - /// - /// 缓存类型 - /// 缓存键 - /// 缓存秒数 - /// 获取源数据的函数 - /// - T Shell(string key, int timeoutSeconds, Func getData); - /// - /// 缓存壳(哈希表) - /// - /// 缓存类型 - /// 缓存键 - /// 字段 - /// 缓存秒数 - /// 获取源数据的函数 - /// - T Shell(string key, string field, int timeoutSeconds, Func getData); - - /// - /// 缓存可序列化数据 - /// - /// - /// 缓存键 - /// 可序列化数据 - /// 缓存秒数,<=0时永久缓存 - Task SetAsync(string key, T data, int timeoutSeconds = 0); - /// - /// 循环或批量获取缓存数据 - /// - /// - /// - /// - Task GetAsync(string key); - /// - /// 循环或批量获取缓存数据 - /// - /// - /// - Task GetAsync(string key); - /// - /// 循环或批量删除缓存键 - /// - /// 缓存键[数组] - Task RemoveAsync(params string[] keys); - /// - /// 缓存壳 - /// - /// 缓存类型 - /// 缓存键 - /// 缓存秒数 - /// 获取源数据的函数 - /// - Task ShellAsync(string key, int timeoutSeconds, Func> getDataAsync); - /// - /// 缓存壳(哈希表) - /// - /// 缓存类型 - /// 缓存键 - /// 字段 - /// 缓存秒数 - /// 获取源数据的函数 - /// - Task ShellAsync(string key, string field, int timeoutSeconds, Func> getDataAsync); - } -} diff --git a/FreeSql/Interface/IFreeSql.cs b/FreeSql/Interface/IFreeSql.cs index 0350a8f3..5b489424 100644 --- a/FreeSql/Interface/IFreeSql.cs +++ b/FreeSql/Interface/IFreeSql.cs @@ -87,10 +87,6 @@ public interface IFreeSql : IDisposable { /// 超时,未执行完将自动提交 void Transaction(Action handler, TimeSpan timeout); - /// - /// 缓存 - /// - ICache Cache { get; } /// /// 数据库访问对象 /// diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 3895180f..69b4fd57 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -10,17 +10,17 @@ using System.Reflection; using System.Text; namespace FreeSql.Internal { - internal abstract class CommonExpression { + public abstract class CommonExpression { - internal CommonUtils _common; - internal CommonProvider.AdoProvider _ado => _adoPriv ?? (_adoPriv = _common._orm.Ado as CommonProvider.AdoProvider); + public CommonUtils _common; + public CommonProvider.AdoProvider _ado => _adoPriv ?? (_adoPriv = _common._orm.Ado as CommonProvider.AdoProvider); CommonProvider.AdoProvider _adoPriv; - internal CommonExpression(CommonUtils common) { + public CommonExpression(CommonUtils common) { _common = common; } static ConcurrentDictionary _dicReadAnonymousFieldDtoPropertys = new ConcurrentDictionary(); - internal bool ReadAnonymousField(List _tables, StringBuilder field, ReadAnonymousTypeInfo parent, ref int index, Expression exp, Func getSelectGroupingMapString) { + public bool ReadAnonymousField(List _tables, StringBuilder field, ReadAnonymousTypeInfo parent, ref int index, Expression exp, Func getSelectGroupingMapString) { Func getTSC = () => new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where }; switch (exp.NodeType) { case ExpressionType.Quote: return ReadAnonymousField(_tables, field, parent, ref index, (exp as UnaryExpression)?.Operand, getSelectGroupingMapString); @@ -180,7 +180,7 @@ namespace FreeSql.Internal { if (index >= 0) field.Append(" as").Append(++index); return false; } - internal object ReadAnonymous(ReadAnonymousTypeInfo parent, DbDataReader dr, ref int index, bool notRead) { + public object ReadAnonymous(ReadAnonymousTypeInfo parent, DbDataReader dr, ref int index, bool notRead) { if (parent.Childs.Any() == false) { if (notRead) { ++index; @@ -215,7 +215,7 @@ namespace FreeSql.Internal { return null; } - internal ColumnInfo SearchColumnByField(List _tables, TableInfo currentTable, string field) { + public ColumnInfo SearchColumnByField(List _tables, TableInfo currentTable, string field) { if (_tables != null) { var testCol = _common.TrimQuoteSqlName(field).Split(new[] { '.' }, 2); if (testCol.Length == 2) { @@ -232,11 +232,11 @@ namespace FreeSql.Internal { return null; } - internal string ExpressionSelectColumn_MemberAccess(List _tables, List _selectColumnMap, SelectTableInfoType tbtype, Expression exp, bool isQuoteName, Func getSelectGroupingMapString) { + public string ExpressionSelectColumn_MemberAccess(List _tables, List _selectColumnMap, SelectTableInfoType tbtype, Expression exp, bool isQuoteName, Func getSelectGroupingMapString) { return ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, _selectColumnMap = _selectColumnMap, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = tbtype, isQuoteName = isQuoteName, isDisableDiyParse = false, style = ExpressionStyle.SelectColumns }); } - internal string[] ExpressionSelectColumns_MemberAccess_New_NewArrayInit(List _tables, Expression exp, bool isQuoteName, Func getSelectGroupingMapString) { + public string[] ExpressionSelectColumns_MemberAccess_New_NewArrayInit(List _tables, Expression exp, bool isQuoteName, Func getSelectGroupingMapString) { switch (exp?.NodeType) { case ExpressionType.Quote: return ExpressionSelectColumns_MemberAccess_New_NewArrayInit(_tables, (exp as UnaryExpression)?.Operand, isQuoteName, getSelectGroupingMapString); case ExpressionType.Lambda: return ExpressionSelectColumns_MemberAccess_New_NewArrayInit(_tables, (exp as LambdaExpression)?.Body, isQuoteName, getSelectGroupingMapString); @@ -276,7 +276,7 @@ namespace FreeSql.Internal { { ExpressionType.Modulo, "%" }, { ExpressionType.Equal, "=" }, }; - internal string ExpressionWhereLambdaNoneForeignObject(List _tables, TableInfo table, List _selectColumnMap, Expression exp, Func getSelectGroupingMapString) { + public string ExpressionWhereLambdaNoneForeignObject(List _tables, TableInfo table, List _selectColumnMap, Expression exp, Func getSelectGroupingMapString) { var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, _selectColumnMap = _selectColumnMap, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, currentTable = table }); if (exp.NodeType == ExpressionType.MemberAccess && exp.Type == typeof(bool)) return $"{sql} = {formatSql(true, null)}"; @@ -289,7 +289,7 @@ namespace FreeSql.Internal { } } - internal string ExpressionWhereLambda(List _tables, Expression exp, Func getSelectGroupingMapString) { + public string ExpressionWhereLambda(List _tables, Expression exp, Func getSelectGroupingMapString) { var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where }); if (exp.NodeType == ExpressionType.MemberAccess && exp.Type == typeof(bool)) return $"{sql} = {formatSql(true, null)}"; @@ -301,7 +301,7 @@ namespace FreeSql.Internal { default: return sql; } } - internal void ExpressionJoinLambda(List _tables, SelectTableInfoType tbtype, Expression exp, Func getSelectGroupingMapString) { + public void ExpressionJoinLambda(List _tables, SelectTableInfoType tbtype, Expression exp, Func getSelectGroupingMapString) { var tbidx = _tables.Count; var filter = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = tbtype, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where }); if (exp.NodeType == ExpressionType.MemberAccess && exp.Type == typeof(bool)) @@ -333,7 +333,7 @@ namespace FreeSql.Internal { internal static ConcurrentDictionary _dicNullableValueProperty = new ConcurrentDictionary(); static ConcurrentDictionary _dicFreeSqlGlobalExtensionsAsSelectExpression = new ConcurrentDictionary(); - internal string ExpressionBinary(string oper, Expression leftExp, Expression rightExp, ExpTSC tsc) { + public string ExpressionBinary(string oper, Expression leftExp, Expression rightExp, ExpTSC tsc) { switch (oper) { case "OR": case "|": @@ -399,7 +399,7 @@ namespace FreeSql.Internal { tsc.mapType = null; return $"{left} {oper} {right}"; } - internal string ExpressionLambdaToSql(Expression exp, ExpTSC tsc) { + public string ExpressionLambdaToSql(Expression exp, ExpTSC tsc) { if (exp == null) return ""; if (tsc.isDisableDiyParse == false && _common._orm.Aop.ParseExpression != null) { var args = new Aop.ParseExpressionEventArgs(exp, ukexp => ExpressionLambdaToSql(exp, tsc.CloneDisableDiyParse())); @@ -882,20 +882,20 @@ namespace FreeSql.Internal { return ExpressionBinary(tryoper, expBinary.Left, expBinary.Right, tsc); } - internal abstract string ExpressionLambdaToSqlMemberAccessString(MemberExpression exp, ExpTSC tsc); - internal abstract string ExpressionLambdaToSqlMemberAccessDateTime(MemberExpression exp, ExpTSC tsc); - internal abstract string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc); - internal abstract string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc); - internal abstract string ExpressionLambdaToSqlCallMath(MethodCallExpression exp, ExpTSC tsc); - internal abstract string ExpressionLambdaToSqlCallDateTime(MethodCallExpression exp, ExpTSC tsc); - internal abstract string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc); - internal abstract string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc); - internal abstract string ExpressionLambdaToSqlOther(Expression exp, ExpTSC tsc); + public abstract string ExpressionLambdaToSqlMemberAccessString(MemberExpression exp, ExpTSC tsc); + public abstract string ExpressionLambdaToSqlMemberAccessDateTime(MemberExpression exp, ExpTSC tsc); + public abstract string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc); + public abstract string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc); + public abstract string ExpressionLambdaToSqlCallMath(MethodCallExpression exp, ExpTSC tsc); + public abstract string ExpressionLambdaToSqlCallDateTime(MethodCallExpression exp, ExpTSC tsc); + public abstract string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc); + public abstract string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc); + public abstract string ExpressionLambdaToSqlOther(Expression exp, ExpTSC tsc); - internal enum ExpressionStyle { + public enum ExpressionStyle { Where, AsSelect, SelectColumns } - internal class ExpTSC { + public class ExpTSC { public List _tables { get; set; } public List _selectColumnMap { get; set; } public Func getSelectGroupingMapString { get; set; } @@ -932,7 +932,7 @@ namespace FreeSql.Internal { } } - internal string formatSql(object obj, Type mapType) { + public string formatSql(object obj, Type mapType) { return string.Concat(_ado.AddslashesProcessParam(obj, mapType)); } } diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs index 4412b573..1f0d5236 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs @@ -1,5 +1,4 @@ -using Microsoft.Extensions.Logging; -using SafeObjectPool; +using SafeObjectPool; using System; using System.Collections.Generic; using System.Collections.Concurrent; @@ -11,7 +10,7 @@ using System.Text; using System.Reflection; namespace FreeSql.Internal.CommonProvider { - abstract partial class AdoProvider : IAdo, IDisposable { + public abstract partial class AdoProvider : IAdo, IDisposable { protected abstract void ReturnConnection(ObjectPool pool, Object conn, Exception ex); protected abstract DbCommand CreateCommand(); @@ -24,16 +23,12 @@ namespace FreeSql.Internal.CommonProvider { public ObjectPool MasterPool { get; protected set; } public List> SlavePools { get; } = new List>(); public DataType DataType { get; } - protected ICache _cache { get; set; } - protected ILogger _log { get; set; } protected CommonUtils _util { get; set; } protected int slaveUnavailables = 0; private object slaveLock = new object(); private Random slaveRandom = new Random(); - public AdoProvider(ICache cache, ILogger log, DataType dataType) { - this._cache = cache; - this._log = log; + public AdoProvider(DataType dataType) { this.DataType = dataType; } @@ -43,7 +38,7 @@ namespace FreeSql.Internal.CommonProvider { if (IsTracePerformance) { TimeSpan ts = DateTime.Now.Subtract(dt); if (e == null && ts.TotalMilliseconds > 100) - _log.LogWarning(logtxt.Insert(0, $"{pool?.Policy.Name}(执行SQL)语句耗时过长{ts.TotalMilliseconds}ms\r\n{cmd.CommandText}\r\n").ToString()); + Trace.WriteLine(logtxt.Insert(0, $"{pool?.Policy.Name}(执行SQL)语句耗时过长{ts.TotalMilliseconds}ms\r\n{cmd.CommandText}\r\n").ToString()); else logtxt.Insert(0, $"{pool?.Policy.Name}(执行SQL)耗时{ts.TotalMilliseconds}ms\r\n{cmd.CommandText}\r\n").ToString(); } @@ -59,7 +54,7 @@ namespace FreeSql.Internal.CommonProvider { log.Append(parm.ParameterName.PadRight(20, ' ')).Append(" = ").Append((parm.Value ?? DBNull.Value) == DBNull.Value ? "NULL" : parm.Value).Append("\r\n"); log.Append(e.Message); - _log.LogError(log.ToString()); + Trace.WriteLine(log.ToString()); if (cmd.Transaction != null) { var curTran = TransactionCurrentThread; diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderTransaction.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderTransaction.cs index 7a24c016..a6082fa9 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderTransaction.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderTransaction.cs @@ -1,9 +1,8 @@ -using Microsoft.Extensions.Logging; -using Newtonsoft.Json; -using SafeObjectPool; +using SafeObjectPool; using System; using System.Collections.Generic; using System.Data.Common; +using System.Diagnostics; using System.Linq; using System.Threading; @@ -29,24 +28,6 @@ namespace FreeSql.Internal.CommonProvider { public DbTransaction TransactionCurrentThread => _trans.TryGetValue(Thread.CurrentThread.ManagedThreadId, out var conn) && conn.Transaction?.Connection != null ? conn.Transaction : null; - private Dictionary> _preRemoveKeys = new Dictionary>(); - private object _preRemoveKeys_lock = new object(); - public string[] PreRemove(params string[] key) { - var tid = Thread.CurrentThread.ManagedThreadId; - List keys = null; - if (key == null || key.Any() == false) return _preRemoveKeys.TryGetValue(tid, out keys) ? keys.ToArray() : new string[0]; - _log.LogDebug($"线程{tid}事务预删除 {JsonConvert.SerializeObject(key)}"); - if (_preRemoveKeys.TryGetValue(tid, out keys) == false) - lock (_preRemoveKeys_lock) - if (_preRemoveKeys.TryGetValue(tid, out keys) == false) { - _preRemoveKeys.Add(tid, keys = new List(key)); - return key; - } - keys.AddRange(key); - return keys.ToArray(); - } - public void TransactionPreRemoveCache(params string[] key) => PreRemove(key); - public void BeginTransaction(TimeSpan timeout) { if (TransactionCurrentThread != null) return; @@ -58,7 +39,7 @@ namespace FreeSql.Internal.CommonProvider { conn = MasterPool.Get(); tran = new Transaction2(conn, conn.Value.BeginTransaction(), timeout); } catch(Exception ex) { - _log.LogError($"数据库出错(开启事务){ex.Message} \r\n{ex.StackTrace}"); + Trace.WriteLine($"数据库出错(开启事务){ex.Message} \r\n{ex.StackTrace}"); MasterPool.Return(conn); throw ex; } @@ -84,22 +65,15 @@ namespace FreeSql.Internal.CommonProvider { if (_trans.ContainsKey(tran.Conn.LastGetThreadId)) _trans.Remove(tran.Conn.LastGetThreadId); - var removeKeys = PreRemove(); - if (_preRemoveKeys.ContainsKey(tran.Conn.LastGetThreadId)) - lock (_preRemoveKeys_lock) - if (_preRemoveKeys.ContainsKey(tran.Conn.LastGetThreadId)) - _preRemoveKeys.Remove(tran.Conn.LastGetThreadId); - Exception ex = null; var f001 = isCommit ? "提交" : "回滚"; try { - _log.LogDebug($"线程{tran.Conn.LastGetThreadId}事务{f001},批量删除缓存key {Newtonsoft.Json.JsonConvert.SerializeObject(removeKeys)}"); - _cache.Remove(removeKeys); + Trace.WriteLine($"线程{tran.Conn.LastGetThreadId}事务{f001}"); if (isCommit) tran.Transaction.Commit(); else tran.Transaction.Rollback(); } catch (Exception ex2) { ex = ex2; - _log.LogError($"数据库出错({f001}事务):{ex.Message} {ex.StackTrace}"); + Trace.WriteLine($"数据库出错({f001}事务):{ex.Message} {ex.StackTrace}"); } finally { ReturnConnection(MasterPool, tran.Conn, ex); //MasterPool.Return(tran.Conn, ex); } diff --git a/FreeSql/Internal/CommonProvider/AopProvider.cs b/FreeSql/Internal/CommonProvider/AopProvider.cs index f7a8faf7..bf49f3ba 100644 --- a/FreeSql/Internal/CommonProvider/AopProvider.cs +++ b/FreeSql/Internal/CommonProvider/AopProvider.cs @@ -5,7 +5,7 @@ using System.Linq.Expressions; using System.Text; namespace FreeSql.Internal.CommonProvider { - class AopProvider : IAop { + public class AopProvider : IAop { public EventHandler ToList { get; set; } public EventHandler Where { get; set; } public EventHandler ParseExpression { get; set; } diff --git a/FreeSql/Internal/CommonProvider/CacheProvider.cs b/FreeSql/Internal/CommonProvider/CacheProvider.cs deleted file mode 100644 index 4bbda7da..00000000 --- a/FreeSql/Internal/CommonProvider/CacheProvider.cs +++ /dev/null @@ -1,186 +0,0 @@ -using Microsoft.Extensions.Caching.Distributed; -using Microsoft.Extensions.Caching.Memory; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Options; -using Newtonsoft.Json; -using System; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace FreeSql.Internal.CommonProvider { - class CacheProvider : ICache, IDisposable { - - public IDistributedCache Cache { get; private set; } - private bool CacheSupportMultiRemove = false; - private static DateTime dt1970 = new DateTime(1970, 1, 1); - - public CacheProvider(IDistributedCache cache, ILogger log) { - if (cache == null) cache = new MemoryDistributedCache(Options.Create(new MemoryDistributedCacheOptions { })); - Cache = cache; - var key1 = $"testCacheSupportMultiRemoveFreeSql{Guid.NewGuid().ToString("N")}"; - var key2 = $"testCacheSupportMultiRemoveFreeSql{Guid.NewGuid().ToString("N")}"; - Cache.Set(key1, new byte[] { 65 }); - Cache.Set(key2, new byte[] { 65 }); - try { Cache.Remove($"{key1}|{key2}"); } catch { } // redis-cluster 不允许执行 multi keys 命令 - CacheSupportMultiRemove = Cache.Get(key1) == null && cache.Get(key2) == null; - if (CacheSupportMultiRemove == false) { - //log.LogWarning("FreeSql Warning: 低性能, IDistributedCache 没实现批量删除缓存 Cache.Remove(\"key1|key2\")."); - Remove(key1, key2); - } - } - - ~CacheProvider() { - this.Dispose(); - } - bool _isdisposed = false; - public void Dispose() { - if (_isdisposed) return; - - Cache = null; - } - - public Func Serialize { get; set; } - public Func Deserialize { get; set; } - - Func JsonSerializerSettings = () => { - var st = new JsonSerializerSettings(); - st.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()); - st.DateFormatHandling = DateFormatHandling.IsoDateFormat; - st.DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind; - return st; - }; - string SerializeObject(object value) { - if (Serialize != null) return Serialize(value); - return JsonConvert.SerializeObject(value, this.JsonSerializerSettings()); - } - T DeserializeObject(string value) { - if (Deserialize != null) return (T) Deserialize(value, typeof(T)); - return JsonConvert.DeserializeObject(value, this.JsonSerializerSettings()); - } - - public void Set(string key, T data, int timeoutSeconds = 0) { - if (string.IsNullOrEmpty(key)) return; - Cache.Set(key, Encoding.UTF8.GetBytes(this.SerializeObject(data)), new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(timeoutSeconds) }); - } - public T Get(string key) { - if (string.IsNullOrEmpty(key)) return default(T); - var value = Cache.Get(key); - if (value == null) return default(T); - return this.DeserializeObject(Encoding.UTF8.GetString(value)); - } - public string Get(string key) { - if (string.IsNullOrEmpty(key)) return null; - var value = Cache.Get(key); - if (value == null) return null; - return Encoding.UTF8.GetString(value); - } - - async public Task SetAsync(string key, T data, int timeoutSeconds = 0) { - if (string.IsNullOrEmpty(key)) return; - await Cache.SetAsync(key, Encoding.UTF8.GetBytes(this.SerializeObject(data)), new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(timeoutSeconds) }); - } - async public Task GetAsync(string key) { - if (string.IsNullOrEmpty(key)) return default(T); - var value = await Cache.GetAsync(key); - if (value == null) return default(T); - return this.DeserializeObject(Encoding.UTF8.GetString(value)); - } - async public Task GetAsync(string key) { - if (string.IsNullOrEmpty(key)) return null; - var value = await Cache.GetAsync(key); - if (value == null) return null; - return Encoding.UTF8.GetString(value); - } - - public void Remove(params string[] keys) { - if (keys == null || keys.Length == 0) return; - var keysDistinct = keys.Distinct(); - if (CacheSupportMultiRemove) Cache.Remove(string.Join("|", keysDistinct)); - else foreach (var key in keysDistinct) Cache.Remove(key); - } - - async public Task RemoveAsync(params string[] keys) { - if (keys == null || keys.Length == 0) return; - var keysDistinct = keys.Distinct(); - if (CacheSupportMultiRemove) await Cache.RemoveAsync(string.Join("|", keysDistinct)); - else foreach (var key in keysDistinct) await Cache.RemoveAsync(key); - } - - public T Shell(string key, int timeoutSeconds, Func getData) { - if (timeoutSeconds <= 0) return getData(); - if (Cache == null) throw new Exception("缓存实现 IDistributedCache 为 null"); - var cacheValue = Cache.Get(key); - if (cacheValue != null) { - try { - var txt = Encoding.UTF8.GetString(cacheValue); - return DeserializeObject(txt); - } catch { - Cache.Remove(key); - throw; - } - } - var ret = getData(); - Cache.Set(key, Encoding.UTF8.GetBytes(SerializeObject(ret)), new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(timeoutSeconds) }); - return ret; - } - - public T Shell(string key, string field, int timeoutSeconds, Func getData) { - if (timeoutSeconds <= 0) return getData(); - if (Cache == null) throw new Exception("缓存实现 IDistributedCache 为 null"); - var hashkey = $"{key}:{field}"; - var cacheValue = Cache.Get(hashkey); - if (cacheValue != null) { - try { - var txt = Encoding.UTF8.GetString(cacheValue); - var value = DeserializeObject<(T, long)>(txt); - if (DateTime.Now.Subtract(dt1970.AddSeconds(value.Item2)).TotalSeconds <= timeoutSeconds) return value.Item1; - } catch { - Cache.Remove(hashkey); - throw; - } - } - var ret = (getData(), (long) DateTime.Now.Subtract(dt1970).TotalSeconds); - Cache.Set(hashkey, Encoding.UTF8.GetBytes(SerializeObject(ret))); - return ret.Item1; - } - - async public Task ShellAsync(string key, int timeoutSeconds, Func> getDataAsync) { - if (timeoutSeconds <= 0) return await getDataAsync(); - if (Cache == null) throw new Exception("缓存实现 IDistributedCache 为 null"); - var cacheValue = await Cache.GetAsync(key); - if (cacheValue != null) { - try { - var txt = Encoding.UTF8.GetString(cacheValue); - return DeserializeObject(txt); - } catch { - await Cache.RemoveAsync(key); - throw; - } - } - var ret = await getDataAsync(); - await Cache.SetAsync(key, Encoding.UTF8.GetBytes(SerializeObject(ret)), new DistributedCacheEntryOptions { AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(timeoutSeconds) }); - return ret; - } - - async public Task ShellAsync(string key, string field, int timeoutSeconds, Func> getDataAsync) { - if (timeoutSeconds <= 0) return await getDataAsync(); - if (Cache == null) throw new Exception("缓存实现 IDistributedCache 为 null"); - var hashkey = $"{key}:{field}"; - var cacheValue = await Cache.GetAsync(hashkey); - if (cacheValue != null) { - try { - var txt = Encoding.UTF8.GetString(cacheValue); - var value = DeserializeObject<(T, long)>(txt); - if (DateTime.Now.Subtract(dt1970.AddSeconds(value.Item2)).TotalSeconds <= timeoutSeconds) return value.Item1; - } catch { - await Cache.RemoveAsync(hashkey); - throw; - } - } - var ret = (await getDataAsync(), (long) DateTime.Now.Subtract(dt1970).TotalSeconds); - await Cache.SetAsync(hashkey, Encoding.UTF8.GetBytes(SerializeObject(ret))); - return ret.Item1; - } - } -} diff --git a/FreeSql/Internal/CommonProvider/DeleteProvider.cs b/FreeSql/Internal/CommonProvider/DeleteProvider.cs index dfd38adb..43753aa4 100644 --- a/FreeSql/Internal/CommonProvider/DeleteProvider.cs +++ b/FreeSql/Internal/CommonProvider/DeleteProvider.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { - abstract partial class DeleteProvider : IDelete where T1 : class { + public abstract partial class DeleteProvider : IDelete where T1 : class { protected IFreeSql _orm; protected CommonUtils _commonUtils; protected CommonExpression _commonExpression; diff --git a/FreeSql/Internal/CommonProvider/InsertProvider.cs b/FreeSql/Internal/CommonProvider/InsertProvider.cs index e93277b5..b9095eb0 100644 --- a/FreeSql/Internal/CommonProvider/InsertProvider.cs +++ b/FreeSql/Internal/CommonProvider/InsertProvider.cs @@ -11,7 +11,7 @@ using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { - abstract partial class InsertProvider : IInsert where T1 : class { + public abstract partial class InsertProvider : IInsert where T1 : class { protected IFreeSql _orm; protected CommonUtils _commonUtils; protected CommonExpression _commonExpression; @@ -69,7 +69,7 @@ namespace FreeSql.Internal.CommonProvider { } #region 参数化数据限制,或values数量限制 - internal List[] SplitSource(int valuesLimit, int parameterLimit) { + protected List[] SplitSource(int valuesLimit, int parameterLimit) { valuesLimit = valuesLimit - 1; parameterLimit = parameterLimit - 1; if (_source == null || _source.Any() == false) return new List[0]; @@ -101,7 +101,7 @@ namespace FreeSql.Internal.CommonProvider { return ret; } } - internal int SplitExecuteAffrows(int valuesLimit, int parameterLimit) { + protected int SplitExecuteAffrows(int valuesLimit, int parameterLimit) { var ss = SplitSource(valuesLimit, parameterLimit); var ret = 0; if (ss.Any() == false) { @@ -137,7 +137,7 @@ namespace FreeSql.Internal.CommonProvider { ClearData(); return ret; } - async internal Task SplitExecuteAffrowsAsync(int valuesLimit, int parameterLimit) { + async protected Task SplitExecuteAffrowsAsync(int valuesLimit, int parameterLimit) { var ss = SplitSource(valuesLimit, parameterLimit); var ret = 0; if (ss.Any() == false) { @@ -173,7 +173,7 @@ namespace FreeSql.Internal.CommonProvider { ClearData(); return ret; } - internal long SplitExecuteIdentity(int valuesLimit, int parameterLimit) { + protected long SplitExecuteIdentity(int valuesLimit, int parameterLimit) { var ss = SplitSource(valuesLimit, parameterLimit); long ret = 0; if (ss.Any() == false) { @@ -211,7 +211,7 @@ namespace FreeSql.Internal.CommonProvider { ClearData(); return ret; } - async internal Task SplitExecuteIdentityAsync(int valuesLimit, int parameterLimit) { + async protected Task SplitExecuteIdentityAsync(int valuesLimit, int parameterLimit) { var ss = SplitSource(valuesLimit, parameterLimit); long ret = 0; if (ss.Any() == false) { @@ -249,7 +249,7 @@ namespace FreeSql.Internal.CommonProvider { ClearData(); return ret; } - internal List SplitExecuteInserted(int valuesLimit, int parameterLimit) { + protected List SplitExecuteInserted(int valuesLimit, int parameterLimit) { var ss = SplitSource(valuesLimit, parameterLimit); var ret = new List(); if (ss.Any() == false) { @@ -285,7 +285,7 @@ namespace FreeSql.Internal.CommonProvider { ClearData(); return ret; } - async internal Task> SplitExecuteInsertedAsync(int valuesLimit, int parameterLimit) { + async protected Task> SplitExecuteInsertedAsync(int valuesLimit, int parameterLimit) { var ss = SplitSource(valuesLimit, parameterLimit); var ret = new List(); if (ss.Any() == false) { @@ -323,7 +323,7 @@ namespace FreeSql.Internal.CommonProvider { } #endregion - internal int RawExecuteAffrows() { + protected int RawExecuteAffrows() { var sql = ToSql(); var before = new Aop.CurdBeforeEventArgs(_table.Type, Aop.CurdType.Insert, sql, _params); _orm.Aop.CurdBefore?.Invoke(this, before); @@ -341,7 +341,7 @@ namespace FreeSql.Internal.CommonProvider { this.ClearData(); return affrows; } - async internal Task RawExecuteAffrowsAsync() { + async protected Task RawExecuteAffrowsAsync() { var sql = ToSql(); var before = new Aop.CurdBeforeEventArgs(_table.Type, Aop.CurdType.Insert, sql, _params); _orm.Aop.CurdBefore?.Invoke(this, before); @@ -359,10 +359,10 @@ namespace FreeSql.Internal.CommonProvider { this.ClearData(); return affrows; } - internal abstract long RawExecuteIdentity(); - internal abstract Task RawExecuteIdentityAsync(); - internal abstract List RawExecuteInserted(); - internal abstract Task> RawExecuteInsertedAsync(); + protected abstract long RawExecuteIdentity(); + protected abstract Task RawExecuteIdentityAsync(); + protected abstract List RawExecuteInserted(); + protected abstract Task> RawExecuteInsertedAsync(); public abstract int ExecuteAffrows(); public abstract Task ExecuteAffrowsAsync(); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 53463150..1e8159f5 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -14,16 +14,15 @@ using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { - abstract class Select0Provider : ISelect0 where TSelect : class where T1 : class { + public abstract class Select0Provider : ISelect0 where TSelect : class where T1 : class { protected int _limit, _skip; protected string _select = "SELECT ", _orderby, _groupby, _having; protected StringBuilder _where = new StringBuilder(); protected List _params = new List(); - internal List _tables = new List(); + protected List _tables = new List(); protected List> _tableRules = new List>(); protected StringBuilder _join = new StringBuilder(); - protected (int seconds, string key) _cache = (0, null); protected IFreeSql _orm; protected CommonUtils _commonUtils; protected CommonExpression _commonExpression; @@ -34,7 +33,7 @@ namespace FreeSql.Internal.CommonProvider { protected bool _distinct; protected Expression _selectExpression; - internal static void CopyData(Select0Provider from, object to, ReadOnlyCollection lambParms) { + public static void CopyData(Select0Provider from, object to, ReadOnlyCollection lambParms) { var toType = to?.GetType(); if (toType == null) return; toType.GetField("_limit", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._limit); @@ -63,7 +62,6 @@ namespace FreeSql.Internal.CommonProvider { } toType.GetField("_tableRules", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._tableRules); toType.GetField("_join", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, new StringBuilder().Append(from._join.ToString())); - toType.GetField("_cache", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._cache); //toType.GetField("_orm", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._orm); //toType.GetField("_commonUtils", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._commonUtils); //toType.GetField("_commonExpression", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._commonExpression); @@ -109,10 +107,6 @@ namespace FreeSql.Internal.CommonProvider { return (await this.ToListAsync("1")).FirstOrDefault() == 1; } - public TSelect Caching(int seconds, string key = null) { - _cache = (seconds, key); - return this as TSelect; - } public long Count() => this.ToList("count(1)").FirstOrDefault(); async public Task CountAsync() => (await this.ToListAsync("count(1)")).FirstOrDefault(); @@ -220,166 +214,142 @@ namespace FreeSql.Internal.CommonProvider { public DataTable ToDataTable(string field = null) { var sql = this.ToSql(field); - if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = sql; - - return _orm.Cache.Shell(_cache.key, _cache.seconds, () => { - var dbParms = _params.ToArray(); - var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms); - _orm.Aop.CurdBefore?.Invoke(this, before); - DataTable ret = null; - Exception exception = null; - try { - ret = _orm.Ado.ExecuteDataTable(_connection, _transaction, CommandType.Text, sql, dbParms); - } catch (Exception ex) { - exception = ex; - throw ex; - } finally { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - return ret; - }); + var dbParms = _params.ToArray(); + var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms); + _orm.Aop.CurdBefore?.Invoke(this, before); + DataTable ret = null; + Exception exception = null; + try { + ret = _orm.Ado.ExecuteDataTable(_connection, _transaction, CommandType.Text, sql, dbParms); + } catch (Exception ex) { + exception = ex; + throw ex; + } finally { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + return ret; } - public Task ToDataTableAsync(string field = null) { + async public Task ToDataTableAsync(string field = null) { var sql = this.ToSql(field); - if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = sql; - - return _orm.Cache.ShellAsync(_cache.key, _cache.seconds, async () => { - var dbParms = _params.ToArray(); - var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms); - _orm.Aop.CurdBefore?.Invoke(this, before); - DataTable ret = null; - Exception exception = null; - try { - ret = await _orm.Ado.ExecuteDataTableAsync(_connection, _transaction, CommandType.Text, sql, dbParms); - } catch (Exception ex) { - exception = ex; - throw ex; - } finally { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - return ret; - }); + var dbParms = _params.ToArray(); + var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms); + _orm.Aop.CurdBefore?.Invoke(this, before); + DataTable ret = null; + Exception exception = null; + try { + ret = await _orm.Ado.ExecuteDataTableAsync(_connection, _transaction, CommandType.Text, sql, dbParms); + } catch (Exception ex) { + exception = ex; + throw ex; + } finally { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + return ret; } public List ToList(string field) { var sql = this.ToSql(field); - if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = sql; - - return _orm.Cache.Shell(_cache.key, _cache.seconds, () => { - var type = typeof(TTuple); - var dbParms = _params.ToArray(); - var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms); - _orm.Aop.CurdBefore?.Invoke(this, before); - var ret = new List(); - var flagStr = $"ToListField:{field}"; - Exception exception = null; - try { - _orm.Ado.ExecuteReader(_connection, _transaction, dr => { - var read = Utils.ExecuteArrayRowReadClassOrTuple(flagStr, type, null, dr, 0, _commonUtils); - ret.Add((TTuple)read.Value); - }, CommandType.Text, sql, dbParms); - } catch (Exception ex) { - exception = ex; - throw ex; - } finally { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - return ret; - }); + var type = typeof(TTuple); + var dbParms = _params.ToArray(); + var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms); + _orm.Aop.CurdBefore?.Invoke(this, before); + var ret = new List(); + var flagStr = $"ToListField:{field}"; + Exception exception = null; + try { + _orm.Ado.ExecuteReader(_connection, _transaction, dr => { + var read = Utils.ExecuteArrayRowReadClassOrTuple(flagStr, type, null, dr, 0, _commonUtils); + ret.Add((TTuple)read.Value); + }, CommandType.Text, sql, dbParms); + } catch (Exception ex) { + exception = ex; + throw ex; + } finally { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + return ret; } - public Task> ToListAsync(string field) { + async public Task> ToListAsync(string field) { var sql = this.ToSql(field); - if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = sql; - - return _orm.Cache.ShellAsync(_cache.key, _cache.seconds, async () => { - var type = typeof(TTuple); - var dbParms = _params.ToArray(); - var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms); - _orm.Aop.CurdBefore?.Invoke(this, before); - var ret = new List(); - var flagStr = $"ToListField:{field}"; - Exception exception = null; - try { - await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => { - var read = Utils.ExecuteArrayRowReadClassOrTuple(flagStr, type, null, dr, 0, _commonUtils); - ret.Add((TTuple)read.Value); - return Task.CompletedTask; - }, CommandType.Text, sql, dbParms); - } catch (Exception ex) { - exception = ex; - throw ex; - } finally { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - return ret; - }); + var type = typeof(TTuple); + var dbParms = _params.ToArray(); + var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms); + _orm.Aop.CurdBefore?.Invoke(this, before); + var ret = new List(); + var flagStr = $"ToListField:{field}"; + Exception exception = null; + try { + await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => { + var read = Utils.ExecuteArrayRowReadClassOrTuple(flagStr, type, null, dr, 0, _commonUtils); + ret.Add((TTuple)read.Value); + return Task.CompletedTask; + }, CommandType.Text, sql, dbParms); + } catch (Exception ex) { + exception = ex; + throw ex; + } finally { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + return ret; } internal List ToListAfPrivate(string sql, GetAllFieldExpressionTreeInfo af, (string field, ReadAnonymousTypeInfo read, List retlist)[] otherData) { - if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = $"{sql}{string.Join("|", _params.Select(a => a.Value))}"; - - return _orm.Cache.Shell(_cache.key, _cache.seconds, () => { - var dbParms = _params.ToArray(); - var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms); - _orm.Aop.CurdBefore?.Invoke(this, before); - var ret = new List(); - Exception exception = null; - try { - _orm.Ado.ExecuteReader(_connection, _transaction, dr => { - ret.Add(af.Read(_orm, dr)); - if (otherData != null) { - var idx = af.FieldCount - 1; - foreach (var other in otherData) - other.retlist.Add(_commonExpression.ReadAnonymous(other.read, dr, ref idx, false)); - } - }, CommandType.Text, sql, dbParms); - } catch (Exception ex) { - exception = ex; - throw ex; - } finally { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - while (_includeToList.Any()) _includeToList.Dequeue()?.Invoke(ret); - _orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret)); - _trackToList?.Invoke(ret); - return ret; - }); + var dbParms = _params.ToArray(); + var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms); + _orm.Aop.CurdBefore?.Invoke(this, before); + var ret = new List(); + Exception exception = null; + try { + _orm.Ado.ExecuteReader(_connection, _transaction, dr => { + ret.Add(af.Read(_orm, dr)); + if (otherData != null) { + var idx = af.FieldCount - 1; + foreach (var other in otherData) + other.retlist.Add(_commonExpression.ReadAnonymous(other.read, dr, ref idx, false)); + } + }, CommandType.Text, sql, dbParms); + } catch (Exception ex) { + exception = ex; + throw ex; + } finally { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + while (_includeToList.Any()) _includeToList.Dequeue()?.Invoke(ret); + _orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret)); + _trackToList?.Invoke(ret); + return ret; } async internal Task> ToListAfPrivateAsync(string sql, GetAllFieldExpressionTreeInfo af, (string field, ReadAnonymousTypeInfo read, List retlist)[] otherData) { - if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = $"{sql}{string.Join("|", _params.Select(a => a.Value))}"; - - return await _orm.Cache.ShellAsync(_cache.key, _cache.seconds, async () => { - var dbParms = _params.ToArray(); - var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms); - _orm.Aop.CurdBefore?.Invoke(this, before); - var ret = new List(); - Exception exception = null; - try { - await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => { - ret.Add(af.Read(_orm, dr)); - if (otherData != null) { - var idx = af.FieldCount - 1; - foreach (var other in otherData) - other.retlist.Add(_commonExpression.ReadAnonymous(other.read, dr, ref idx, false)); - } - return Task.CompletedTask; - }, CommandType.Text, sql, dbParms); - } catch (Exception ex) { - exception = ex; - throw ex; - } finally { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - while (_includeToList.Any()) _includeToList.Dequeue()?.Invoke(ret); - _orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret)); - _trackToList?.Invoke(ret); - return ret; - }); + var dbParms = _params.ToArray(); + var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms); + _orm.Aop.CurdBefore?.Invoke(this, before); + var ret = new List(); + Exception exception = null; + try { + await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => { + ret.Add(af.Read(_orm, dr)); + if (otherData != null) { + var idx = af.FieldCount - 1; + foreach (var other in otherData) + other.retlist.Add(_commonExpression.ReadAnonymous(other.read, dr, ref idx, false)); + } + return Task.CompletedTask; + }, CommandType.Text, sql, dbParms); + } catch (Exception ex) { + exception = ex; + throw ex; + } finally { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + while (_includeToList.Any()) _includeToList.Dequeue()?.Invoke(ret); + _orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret)); + _trackToList?.Invoke(ret); + return ret; } internal List ToListPrivate(GetAllFieldExpressionTreeInfo af, (string field, ReadAnonymousTypeInfo read, List retlist)[] otherData) { string sql = null; @@ -427,60 +397,52 @@ namespace FreeSql.Internal.CommonProvider { protected List ToListMapReader((ReadAnonymousTypeInfo map, string field) af) { var sql = this.ToSql(af.field); - if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = $"{sql}{string.Join("|", _params.Select(a => a.Value))}"; - - return _orm.Cache.Shell(_cache.key, _cache.seconds, () => { - var type = typeof(TReturn); - var dbParms = _params.ToArray(); - var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms); - _orm.Aop.CurdBefore?.Invoke(this, before); - var ret = new List(); - Exception exception = null; - try { - _orm.Ado.ExecuteReader(_connection, _transaction, dr => { - var index = -1; - ret.Add((TReturn)_commonExpression.ReadAnonymous(af.map, dr, ref index, false)); - }, CommandType.Text, sql, dbParms); - } catch (Exception ex) { - exception = ex; - throw ex; - } finally { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - _orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret)); - _trackToList?.Invoke(ret); - return ret; - }); + var type = typeof(TReturn); + var dbParms = _params.ToArray(); + var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms); + _orm.Aop.CurdBefore?.Invoke(this, before); + var ret = new List(); + Exception exception = null; + try { + _orm.Ado.ExecuteReader(_connection, _transaction, dr => { + var index = -1; + ret.Add((TReturn)_commonExpression.ReadAnonymous(af.map, dr, ref index, false)); + }, CommandType.Text, sql, dbParms); + } catch (Exception ex) { + exception = ex; + throw ex; + } finally { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + _orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret)); + _trackToList?.Invoke(ret); + return ret; } async protected Task> ToListMapReaderAsync((ReadAnonymousTypeInfo map, string field) af) { var sql = this.ToSql(af.field); - if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = $"{sql}{string.Join("|", _params.Select(a => a.Value))}"; - - return await _orm.Cache.ShellAsync(_cache.key, _cache.seconds, async () => { - var type = typeof(TReturn); - var dbParms = _params.ToArray(); - var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms); - _orm.Aop.CurdBefore?.Invoke(this, before); - var ret = new List(); - Exception exception = null; - try { - await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => { - var index = -1; - ret.Add((TReturn)_commonExpression.ReadAnonymous(af.map, dr, ref index, false)); - return Task.CompletedTask; - }, CommandType.Text, sql, dbParms); - } catch (Exception ex) { - exception = ex; - throw ex; - } finally { - var after = new Aop.CurdAfterEventArgs(before, exception, ret); - _orm.Aop.CurdAfter?.Invoke(this, after); - } - _orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret)); - _trackToList?.Invoke(ret); - return ret; - }); + var type = typeof(TReturn); + var dbParms = _params.ToArray(); + var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms); + _orm.Aop.CurdBefore?.Invoke(this, before); + var ret = new List(); + Exception exception = null; + try { + await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => { + var index = -1; + ret.Add((TReturn)_commonExpression.ReadAnonymous(af.map, dr, ref index, false)); + return Task.CompletedTask; + }, CommandType.Text, sql, dbParms); + } catch (Exception ex) { + exception = ex; + throw ex; + } finally { + var after = new Aop.CurdAfterEventArgs(before, exception, ret); + _orm.Aop.CurdAfter?.Invoke(this, after); + } + _orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret)); + _trackToList?.Invoke(ret); + return ret; } protected (ReadAnonymousTypeInfo map, string field) GetExpressionField(Expression newexp) { var map = new ReadAnonymousTypeInfo(); diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs index 0e2f6950..efb1af06 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select10Provider.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { - abstract class Select10Provider : Select0Provider, T1>, ISelect + public abstract class Select10Provider : Select0Provider, T1>, ISelect where T1 : class where T2 : class where T3 : class diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs index bddf725c..15009f2e 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs @@ -16,7 +16,7 @@ using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { - abstract class Select1Provider : Select0Provider, T1>, ISelect + public abstract class Select1Provider : Select0Provider, T1>, ISelect where T1 : class { public Select1Provider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select2Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select2Provider.cs index 1dc5e90a..bcb5a1fd 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select2Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select2Provider.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { - abstract class Select2Provider : Select0Provider, T1>, ISelect + public abstract class Select2Provider : Select0Provider, T1>, ISelect where T1 : class where T2 : class { diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs index fb04aefa..74fcf00a 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select3Provider.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { - abstract class Select3Provider : Select0Provider, T1>, ISelect + public abstract class Select3Provider : Select0Provider, T1>, ISelect where T1 : class where T2 : class where T3 : class { diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs index 410d0a7c..e32cf2b0 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select4Provider.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { - abstract class Select4Provider : Select0Provider, T1>, ISelect + public abstract class Select4Provider : Select0Provider, T1>, ISelect where T1 : class where T2 : class where T3 : class diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs index f65d5dad..f7658f27 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select5Provider.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { - abstract class Select5Provider : Select0Provider, T1>, ISelect + public abstract class Select5Provider : Select0Provider, T1>, ISelect where T1 : class where T2 : class where T3 : class diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs index e565a625..129f85db 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select6Provider.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { - abstract class Select6Provider : Select0Provider, T1>, ISelect + public abstract class Select6Provider : Select0Provider, T1>, ISelect where T1 : class where T2 : class where T3 : class diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs index 1442cc2d..12989751 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select7Provider.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { - abstract class Select7Provider : Select0Provider, T1>, ISelect + public abstract class Select7Provider : Select0Provider, T1>, ISelect where T1 : class where T2 : class where T3 : class diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs index d86f08e9..3815c2d5 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select8Provider.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { - abstract class Select8Provider : Select0Provider, T1>, ISelect + public abstract class Select8Provider : Select0Provider, T1>, ISelect where T1 : class where T2 : class where T3 : class diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs index 58cfe03a..f9223ee3 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select9Provider.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { - abstract class Select9Provider : Select0Provider, T1>, ISelect + public abstract class Select9Provider : Select0Provider, T1>, ISelect where T1 : class where T2 : class where T3 : class diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs index 075235b7..397e987f 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs @@ -8,7 +8,7 @@ using System.Text; using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { - class SelectGroupingProvider : ISelectGrouping { + public class SelectGroupingProvider : ISelectGrouping { internal object _select; internal ReadAnonymousTypeInfo _map; diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 57bea6cb..68ced821 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -11,7 +11,7 @@ using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider { - abstract partial class UpdateProvider : IUpdate where T1 : class { + public abstract partial class UpdateProvider : IUpdate where T1 : class { protected IFreeSql _orm; protected CommonUtils _commonUtils; protected CommonExpression _commonExpression; @@ -106,7 +106,7 @@ namespace FreeSql.Internal.CommonProvider { return ret; } } - internal int SplitExecuteAffrows(int valuesLimit, int parameterLimit) { + protected int SplitExecuteAffrows(int valuesLimit, int parameterLimit) { var ss = SplitSource(valuesLimit, parameterLimit); var ret = 0; if (ss.Length <= 1) { @@ -138,7 +138,7 @@ namespace FreeSql.Internal.CommonProvider { ClearData(); return ret; } - async internal Task SplitExecuteAffrowsAsync(int valuesLimit, int parameterLimit) { + async protected Task SplitExecuteAffrowsAsync(int valuesLimit, int parameterLimit) { var ss = SplitSource(valuesLimit, parameterLimit); var ret = 0; if (ss.Length <= 1) { @@ -170,7 +170,7 @@ namespace FreeSql.Internal.CommonProvider { ClearData(); return ret; } - internal List SplitExecuteUpdated(int valuesLimit, int parameterLimit) { + protected List SplitExecuteUpdated(int valuesLimit, int parameterLimit) { var ss = SplitSource(valuesLimit, parameterLimit); var ret = new List(); if (ss.Length <= 1) { @@ -202,7 +202,7 @@ namespace FreeSql.Internal.CommonProvider { ClearData(); return ret; } - async internal Task> SplitExecuteUpdatedAsync(int valuesLimit, int parameterLimit) { + async protected Task> SplitExecuteUpdatedAsync(int valuesLimit, int parameterLimit) { var ss = SplitSource(valuesLimit, parameterLimit); var ret = new List(); if (ss.Length <= 1) { @@ -236,7 +236,7 @@ namespace FreeSql.Internal.CommonProvider { } #endregion - internal int RawExecuteAffrows() { + protected int RawExecuteAffrows() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; var dbParms = _params.Concat(_paramsSource).ToArray(); @@ -257,7 +257,7 @@ namespace FreeSql.Internal.CommonProvider { this.ClearData(); return affrows; } - async internal Task RawExecuteAffrowsAsync() { + async protected Task RawExecuteAffrowsAsync() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; var dbParms = _params.Concat(_paramsSource).ToArray(); @@ -278,8 +278,8 @@ namespace FreeSql.Internal.CommonProvider { this.ClearData(); return affrows; } - internal abstract List RawExecuteUpdated(); - internal abstract Task> RawExecuteUpdatedAsync(); + protected abstract List RawExecuteUpdated(); + protected abstract Task> RawExecuteUpdatedAsync(); public abstract int ExecuteAffrows(); public abstract Task ExecuteAffrowsAsync(); diff --git a/FreeSql/Internal/CommonUtils.cs b/FreeSql/Internal/CommonUtils.cs index 540f7c19..3c23e48d 100644 --- a/FreeSql/Internal/CommonUtils.cs +++ b/FreeSql/Internal/CommonUtils.cs @@ -2,43 +2,46 @@ using FreeSql.DatabaseModel; using FreeSql.Extensions.EntityUtil; using FreeSql.Internal.Model; +using SafeObjectPool; using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Data.Common; using System.Linq; +using System.Linq.Expressions; using System.Reflection; using System.Text; +using System.Threading.Tasks; namespace FreeSql.Internal { - internal abstract class CommonUtils { + public abstract class CommonUtils { - internal abstract string GetNoneParamaterSqlValue(List specialParams, Type type, object value); - internal abstract DbParameter AppendParamter(List _params, string parameterName, Type type, object value); - internal abstract DbParameter[] GetDbParamtersByObject(string sql, object obj); - internal abstract string FormatSql(string sql, params object[] args); - internal abstract string QuoteSqlName(string name); - internal abstract string TrimQuoteSqlName(string name); - internal abstract string QuoteParamterName(string name); - internal abstract string IsNull(string sql, object value); - internal abstract string StringConcat(string[] objs, Type[] types); - internal abstract string Mod(string left, string right, Type leftType, Type rightType); - internal abstract string QuoteWriteParamter(Type type, string paramterName); - internal abstract string QuoteReadColumn(Type type, string columnName); + public abstract string GetNoneParamaterSqlValue(List specialParams, Type type, object value); + public abstract DbParameter AppendParamter(List _params, string parameterName, Type type, object value); + public abstract DbParameter[] GetDbParamtersByObject(string sql, object obj); + public abstract string FormatSql(string sql, params object[] args); + public abstract string QuoteSqlName(string name); + public abstract string TrimQuoteSqlName(string name); + public abstract string QuoteParamterName(string name); + public abstract string IsNull(string sql, object value); + public abstract string StringConcat(string[] objs, Type[] types); + public abstract string Mod(string left, string right, Type leftType, Type rightType); + public abstract string QuoteWriteParamter(Type type, string paramterName); + public abstract string QuoteReadColumn(Type type, string columnName); - internal IFreeSql _orm { get; set; } - internal ICodeFirst CodeFirst => _orm.CodeFirst; - internal TableInfo GetTableByEntity(Type entity) => Utils.GetTableByEntity(entity, this); - internal List dbTables { get; set; } - internal object dbTablesLock = new object(); + public IFreeSql _orm { get; set; } + public ICodeFirst CodeFirst => _orm.CodeFirst; + public TableInfo GetTableByEntity(Type entity) => Utils.GetTableByEntity(entity, this); + public List dbTables { get; set; } + public object dbTablesLock = new object(); public CommonUtils(IFreeSql orm) { _orm = orm; } ConcurrentDictionary dicConfigEntity = new ConcurrentDictionary(); - internal ICodeFirst ConfigEntity(Action> entity) { + public ICodeFirst ConfigEntity(Action> entity) { if (entity == null) return _orm.CodeFirst; var type = typeof(T); var table = dicConfigEntity.GetOrAdd(type, new TableAttribute()); @@ -47,7 +50,7 @@ namespace FreeSql.Internal { Utils.RemoveTableByEntity(type, this); //remove cache return _orm.CodeFirst; } - internal ICodeFirst ConfigEntity(Type type, Action entity) { + public ICodeFirst ConfigEntity(Type type, Action entity) { if (entity == null) return _orm.CodeFirst; var table = dicConfigEntity.GetOrAdd(type, new TableAttribute()); var fluent = new TableFluent(type, table); @@ -55,10 +58,10 @@ namespace FreeSql.Internal { Utils.RemoveTableByEntity(type, this); //remove cache return _orm.CodeFirst; } - internal TableAttribute GetConfigEntity(Type type) { + public TableAttribute GetConfigEntity(Type type) { return dicConfigEntity.TryGetValue(type, out var trytb) ? trytb : null; } - internal TableAttribute GetEntityTableAttribute(Type type) { + public TableAttribute GetEntityTableAttribute(Type type) { TableAttribute attr = null; if (_orm.Aop.ConfigEntity != null) { var aope = new Aop.ConfigEntityEventArgs(type); @@ -84,7 +87,7 @@ namespace FreeSql.Internal { if (!string.IsNullOrEmpty(attr.SelectFilter)) return attr; return null; } - internal ColumnAttribute GetEntityColumnAttribute(Type type, PropertyInfo proto) { + public ColumnAttribute GetEntityColumnAttribute(Type type, PropertyInfo proto) { ColumnAttribute attr = null; if (_orm.Aop.ConfigEntityProperty != null) { var aope = new Aop.ConfigEntityPropertyEventArgs(type, proto); @@ -137,7 +140,7 @@ namespace FreeSql.Internal { return ret; } - internal string WhereObject(TableInfo table, string aliasAndDot, object dywhere) { + public string WhereObject(TableInfo table, string aliasAndDot, object dywhere) { if (dywhere == null) return ""; var type = dywhere.GetType(); var primarys = table.Primarys; @@ -182,7 +185,7 @@ namespace FreeSql.Internal { } } - internal string WhereItems(TableInfo table, string aliasAndDot, IEnumerable items) { + public string WhereItems(TableInfo table, string aliasAndDot, IEnumerable items) { if (items == null || items.Any() == false) return null; if (table.Primarys.Any() == false) return null; var its = items.Where(a => a != null).ToArray(); @@ -231,5 +234,39 @@ namespace FreeSql.Internal { } return iidx == 1 ? sb.Remove(0, 5).Remove(sb.Length - 1, 1).ToString() : sb.Remove(0, 4).ToString(); } + + public static void PrevReheatConnectionPool(ObjectPool pool, int minPoolSize) { + if (minPoolSize <= 0) minPoolSize = Math.Min(5, pool.Policy.PoolSize); + if (minPoolSize > pool.Policy.PoolSize) minPoolSize = pool.Policy.PoolSize; + var initTestOk = true; + var initStartTime = DateTime.Now; + var initConns = new ConcurrentBag>(); + + try { + var conn = pool.Get(); + initConns.Add(conn); + pool.Policy.OnCheckAvailable(conn); + } catch { + initTestOk = false; //预热一次失败,后面将不进行 + } + for (var a = 1; initTestOk && a < minPoolSize; a += 10) { + if (initStartTime.Subtract(DateTime.Now).TotalSeconds > 3) break; //预热耗时超过3秒,退出 + var b = Math.Min(minPoolSize - a, 10); //每10个预热 + var initTasks = new Task[b]; + for (var c = 0; c < b; c++) { + initTasks[c] = Task.Run(() => { + try { + var conn = pool.Get(); + initConns.Add(conn); + pool.Policy.OnCheckAvailable(conn); + } catch { + initTestOk = false; //有失败,下一组退出预热 + } + }); + } + Task.WaitAll(initTasks); + } + while (initConns.TryTake(out var conn)) pool.Return(conn); + } } } diff --git a/FreeSql/Internal/Model/ReadAnonymousTypeInfo.cs b/FreeSql/Internal/Model/ReadAnonymousTypeInfo.cs index 2f1c2aeb..722fc1b1 100644 --- a/FreeSql/Internal/Model/ReadAnonymousTypeInfo.cs +++ b/FreeSql/Internal/Model/ReadAnonymousTypeInfo.cs @@ -4,7 +4,7 @@ using System.Reflection; using System.Text; namespace FreeSql.Internal.Model { - class ReadAnonymousTypeInfo { + public class ReadAnonymousTypeInfo { public PropertyInfo Property { get; set; } public string CsName { get; set; } public Type CsType { get; set; } @@ -15,5 +15,5 @@ namespace FreeSql.Internal.Model { public List Childs = new List(); public TableInfo Table { get; set; } } - enum ReadAnonymousTypeInfoConsturctorType { Arguments, Properties } + public enum ReadAnonymousTypeInfoConsturctorType { Arguments, Properties } } diff --git a/FreeSql/Internal/Model/SelectColumnInfo.cs b/FreeSql/Internal/Model/SelectColumnInfo.cs index 689fb319..a92947a2 100644 --- a/FreeSql/Internal/Model/SelectColumnInfo.cs +++ b/FreeSql/Internal/Model/SelectColumnInfo.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Text; namespace FreeSql.Internal.Model { - class SelectColumnInfo { + public class SelectColumnInfo { public ColumnInfo Column { get; set; } public SelectTableInfo Table { get; set; } } diff --git a/FreeSql/Internal/Model/SelectTableInfo.cs b/FreeSql/Internal/Model/SelectTableInfo.cs index 9e880f9d..0c1d4172 100644 --- a/FreeSql/Internal/Model/SelectTableInfo.cs +++ b/FreeSql/Internal/Model/SelectTableInfo.cs @@ -1,7 +1,7 @@ using System.Linq.Expressions; namespace FreeSql.Internal.Model { - class SelectTableInfo { + public class SelectTableInfo { public TableInfo Table { get; set; } private string _alias; @@ -18,5 +18,5 @@ namespace FreeSql.Internal.Model { public ParameterExpression Parameter { get; set; } public SelectTableInfoType Type { get; set; } } - enum SelectTableInfoType { From, LeftJoin, InnerJoin, RightJoin, Parent } + public enum SelectTableInfoType { From, LeftJoin, InnerJoin, RightJoin, Parent } } diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index 6b71f42b..6de5c976 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -1,6 +1,5 @@ using FreeSql.DataAnnotations; using FreeSql.Internal.Model; -using Newtonsoft.Json.Linq; using System; using System.Collections; using System.Collections.Concurrent; @@ -637,8 +636,9 @@ namespace FreeSql.Internal { if (overrieds > 0) { cscode.AppendLine("}"); Assembly assembly = null; + if (MethodLazyLoadingComplier.Value == null) throw new Exception("【延时加载】功能需要安装 FreeSql.Extensions.LazyLoading.dll,可前往 nuget 下载"); try { - assembly = Generator.TemplateEngin._compiler.Value.CompileCode(cscode.ToString()); + assembly = MethodLazyLoadingComplier.Value.Invoke(null, new object[] { cscode.ToString() }) as Assembly; } catch (Exception ex) { throw new Exception($"【延时加载】{trytbTypeName} 编译错误:{ex.Message}\r\n\r\n{cscode}"); } @@ -651,8 +651,12 @@ namespace FreeSql.Internal { return tbc.TryGetValue(entity, out var trytb2) ? trytb2 : trytb; } + static Lazy MethodLazyLoadingComplier = new Lazy(() => { + var type = Type.GetType("FreeSql.Extensions.LazyLoading.LazyLoadingComplier,FreeSql.Extensions.LazyLoading"); + return type.GetMethod("CompileCode"); + }); - internal static T[] GetDbParamtersByObject(string sql, object obj, string paramPrefix, Func constructorParamter) { + public static T[] GetDbParamtersByObject(string sql, object obj, string paramPrefix, Func constructorParamter) { if (string.IsNullOrEmpty(sql) || obj == null) return new T[0]; var ttype = typeof(T); var type = obj.GetType(); @@ -668,7 +672,7 @@ namespace FreeSql.Internal { return ret.ToArray(); } - internal static Dictionary dicExecuteArrayRowReadClassOrTuple = new Dictionary { + public static Dictionary dicExecuteArrayRowReadClassOrTuple = new Dictionary { [typeof(bool)] = true, [typeof(sbyte)] = true, [typeof(short)] = true, @@ -837,12 +841,14 @@ namespace FreeSql.Internal { if (type == typeof(object) && indexes != null) { Func dynamicFunc = (type2, indexes2, row2, dataindex2, commonUtils2) => { - dynamic expando = new System.Dynamic.ExpandoObject(); //动态类型字段 可读可写 - var expandodic = (IDictionary)expando; + //dynamic expando = new DynamicDictionary(); //动态类型字段 可读可写 + var expandodic = new Dictionary();// (IDictionary)expando; var fc = row2.FieldCount; for (var a = 0; a < fc; a++) + //expando[row2.GetName(a)] = row2.GetValue(a); expandodic.Add(row2.GetName(a), row2.GetValue(a)); - return new RowInfo(expando, fc); + //expando = expandodic; + return new RowInfo(expandodic, fc); }; return dynamicFunc;// Expression.Lambda>(null); } @@ -1092,14 +1098,10 @@ namespace FreeSql.Internal { static ConcurrentDictionary>> _dicGetDataReaderValue = new ConcurrentDictionary>>(); static MethodInfo MethodArrayGetValue = typeof(Array).GetMethod("GetValue", new[] { typeof(int) }); static MethodInfo MethodArrayGetLength = typeof(Array).GetMethod("GetLength", new[] { typeof(int) }); - static MethodInfo MethodMygisGeometryParse = typeof(MygisGeometry).GetMethod("Parse", new[] { typeof(string) }); static MethodInfo MethodGuidTryParse = typeof(Guid).GetMethod("TryParse", new[] { typeof(string), typeof(Guid).MakeByRefType() }); static MethodInfo MethodEnumParse = typeof(Enum).GetMethod("Parse", new[] { typeof(Type), typeof(string), typeof(bool) }); static MethodInfo MethodConvertChangeType = typeof(Convert).GetMethod("ChangeType", new[] { typeof(object), typeof(Type) }); static MethodInfo MethodTimeSpanFromSeconds = typeof(TimeSpan).GetMethod("FromSeconds"); - static MethodInfo MethodJTokenParse = typeof(JToken).GetMethod("Parse", new[] { typeof(string) }); - static MethodInfo MethodJObjectParse = typeof(JObject).GetMethod("Parse", new[] { typeof(string) }); - static MethodInfo MethodJArrayParse = typeof(JArray).GetMethod("Parse", new[] { typeof(string) }); static MethodInfo MethodSByteTryParse = typeof(sbyte).GetMethod("TryParse", new[] { typeof(string), typeof(sbyte).MakeByRefType() }); static MethodInfo MethodShortTryParse = typeof(short).GetMethod("TryParse", new[] { typeof(string), typeof(short).MakeByRefType() }); static MethodInfo MethodIntTryParse = typeof(int).GetMethod("TryParse", new[] { typeof(string), typeof(int).MakeByRefType() }); @@ -1116,6 +1118,8 @@ namespace FreeSql.Internal { static MethodInfo MethodDateTimeOffsetTryParse = typeof(DateTimeOffset).GetMethod("TryParse", new[] { typeof(string), typeof(DateTimeOffset).MakeByRefType() }); static MethodInfo MethodToString = typeof(Utils).GetMethod("ToStringConcat", BindingFlags.NonPublic | BindingFlags.Static, null, new[] { typeof(object) }, null); static MethodInfo MethodBigIntegerParse = typeof(Utils).GetMethod("ToBigInteger", BindingFlags.NonPublic | BindingFlags.Static, null, new[] { typeof(string) }, null); + + public static ConcurrentBag> GetDataReaderValueBlockExpressionSwitchTypeFullName = new ConcurrentBag>(); public static Expression GetDataReaderValueBlockExpression(Type type, Expression value) { var returnTarget = Expression.Label(typeof(object)); var valueExp = Expression.Variable(typeof(object), "locvalue"); @@ -1177,16 +1181,6 @@ namespace FreeSql.Internal { } ); break; - case "MygisPoint": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisPoint))); - case "MygisLineString": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisLineString))); - case "MygisPolygon": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisPolygon))); - case "MygisMultiPoint": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisMultiPoint))); - case "MygisMultiLineString": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisMultiLineString))); - case "MygisMultiPolygon": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisMultiPolygon))); - case "Newtonsoft.Json.Linq.JToken": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJTokenParse, Expression.Convert(valueExp, typeof(string))), typeof(JToken))); - case "Newtonsoft.Json.Linq.JObject": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJObjectParse, Expression.Convert(valueExp, typeof(string))), typeof(JObject))); - case "Newtonsoft.Json.Linq.JArray": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJArrayParse, Expression.Convert(valueExp, typeof(string))), typeof(JArray))); - case "Npgsql.LegacyPostgis.PostgisGeometry": return Expression.Return(returnTarget, valueExp); case "System.Numerics.BigInteger": return Expression.Return(returnTarget, Expression.Convert(Expression.Call(MethodBigIntegerParse, Expression.Call(MethodToString, valueExp)), typeof(object))); case "System.TimeSpan": ParameterExpression tryparseVarTsExp, valueStrExp; @@ -1373,6 +1367,12 @@ namespace FreeSql.Internal { typeof(object)) ); break; + default: + foreach (var switchFunc in GetDataReaderValueBlockExpressionSwitchTypeFullName) { + var switchFuncRet = switchFunc(returnTarget, valueExp, type.FullName); + if (switchFuncRet != null) return switchFuncRet; + } + break; } Expression switchExp = null; if (tryparseExp != null) @@ -1437,45 +1437,7 @@ namespace FreeSql.Internal { }); return func(value); } - internal static object GetDataReaderValue22(Type type, object value) { - if (value == null || value == DBNull.Value) return Activator.CreateInstance(type); - if (type.FullName == "System.Byte[]") return value; - if (type.IsArray) { - var elementType = type.GetElementType(); - var valueArr = value as Array; - if (elementType == valueArr.GetType().GetElementType()) return value; - var len = valueArr.GetLength(0); - var ret = Array.CreateInstance(elementType, len); - for (var a = 0; a < len; a++) { - var item = valueArr.GetValue(a); - ret.SetValue(GetDataReaderValue22(elementType, item), a); - } - return ret; - } - if (type.IsNullableType()) type = type.GenericTypeArguments.First(); - if (type.IsEnum) return Enum.Parse(type, string.Concat(value), true); - switch (type.FullName) { - case "System.Guid": - if (value.GetType() != type) return Guid.TryParse(string.Concat(value), out var tryguid) ? tryguid : Guid.Empty; - return value; - case "MygisPoint": return MygisPoint.Parse(string.Concat(value)) as MygisPoint; - case "MygisLineString": return MygisLineString.Parse(string.Concat(value)) as MygisLineString; - case "MygisPolygon": return MygisPolygon.Parse(string.Concat(value)) as MygisPolygon; - case "MygisMultiPoint": return MygisMultiPoint.Parse(string.Concat(value)) as MygisMultiPoint; - case "MygisMultiLineString": return MygisMultiLineString.Parse(string.Concat(value)) as MygisMultiLineString; - case "MygisMultiPolygon": return MygisMultiPolygon.Parse(string.Concat(value)) as MygisMultiPolygon; - case "Newtonsoft.Json.Linq.JToken": return JToken.Parse(string.Concat(value)); - case "Newtonsoft.Json.Linq.JObject": return JObject.Parse(string.Concat(value)); - case "Newtonsoft.Json.Linq.JArray": return JArray.Parse(string.Concat(value)); - case "Npgsql.LegacyPostgis.PostgisGeometry": return value; - } - if (type != value.GetType()) { - if (type.FullName == "System.TimeSpan") return TimeSpan.FromSeconds(double.Parse(value.ToString())); - return Convert.ChangeType(value, type); - } - return value; - } - internal static string GetCsName(string name) { + public static string GetCsName(string name) { name = Regex.Replace(name.TrimStart('@'), @"[^\w]", "_"); return char.IsLetter(name, 0) ? name : string.Concat("_", name); } diff --git a/FreeSql/MySql/Curd/MySqlDelete.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlDelete.cs similarity index 100% rename from FreeSql/MySql/Curd/MySqlDelete.cs rename to Providers/FreeSql.Provider.MySql/Curd/MySqlDelete.cs diff --git a/FreeSql/MySql/Curd/MySqlInsert.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs similarity index 94% rename from FreeSql/MySql/Curd/MySqlInsert.cs rename to Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs index 3eeb3c9a..0371246f 100644 --- a/FreeSql/MySql/Curd/MySqlInsert.cs +++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs @@ -20,7 +20,7 @@ namespace FreeSql.MySql.Curd { public override Task> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(5000, 3000); - internal override long RawExecuteIdentity() { + protected override long RawExecuteIdentity() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; @@ -41,7 +41,7 @@ namespace FreeSql.MySql.Curd { this.ClearData(); return ret; } - async internal override Task RawExecuteIdentityAsync() { + async protected override Task RawExecuteIdentityAsync() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; @@ -62,7 +62,7 @@ namespace FreeSql.MySql.Curd { this.ClearData(); return ret; } - internal override List RawExecuteInserted() { + protected override List RawExecuteInserted() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return new List(); @@ -92,7 +92,7 @@ namespace FreeSql.MySql.Curd { this.ClearData(); return ret; } - async internal override Task> RawExecuteInsertedAsync() { + async protected override Task> RawExecuteInsertedAsync() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return new List(); diff --git a/FreeSql/MySql/Curd/MySqlSelect.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlSelect.cs similarity index 100% rename from FreeSql/MySql/Curd/MySqlSelect.cs rename to Providers/FreeSql.Provider.MySql/Curd/MySqlSelect.cs diff --git a/FreeSql/MySql/Curd/MySqlUpdate.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlUpdate.cs similarity index 97% rename from FreeSql/MySql/Curd/MySqlUpdate.cs rename to Providers/FreeSql.Provider.MySql/Curd/MySqlUpdate.cs index b319276a..2b227538 100644 --- a/FreeSql/MySql/Curd/MySqlUpdate.cs +++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlUpdate.cs @@ -21,7 +21,7 @@ namespace FreeSql.MySql.Curd { public override Task> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(500, 3000); - internal override List RawExecuteUpdated() { + protected override List RawExecuteUpdated() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return new List(); @@ -53,7 +53,7 @@ namespace FreeSql.MySql.Curd { this.ClearData(); return ret; } - async internal override Task> RawExecuteUpdatedAsync() { + async protected override Task> RawExecuteUpdatedAsync() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return new List(); diff --git a/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj new file mode 100644 index 00000000..224fc15a --- /dev/null +++ b/Providers/FreeSql.Provider.MySql/FreeSql.Provider.MySql.csproj @@ -0,0 +1,28 @@ + + + + netstandard2.0 + 0.6.1 + true + YeXiangQin + FreeSql 数据库实现,基于 MySql 5.6 + https://github.com/2881099/FreeSql + https://github.com/2881099/FreeSql + git + MIT + FreeSql;ORM + $(AssemblyName) + $(AssemblyName) + true + true + + + + + + + + + + + diff --git a/FreeSql/MySql/MySqlAdo/MySqlAdo.cs b/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlAdo.cs similarity index 90% rename from FreeSql/MySql/MySqlAdo/MySqlAdo.cs rename to Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlAdo.cs index 388aaeb0..c04aa5ca 100644 --- a/FreeSql/MySql/MySqlAdo/MySqlAdo.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlAdo.cs @@ -1,5 +1,4 @@ using FreeSql.Internal; -using Microsoft.Extensions.Logging; using MySql.Data.MySqlClient; using SafeObjectPool; using System; @@ -11,8 +10,8 @@ using System.Threading; namespace FreeSql.MySql { class MySqlAdo : FreeSql.Internal.CommonProvider.AdoProvider { - public MySqlAdo() : base(null, null, DataType.MySql) { } - public MySqlAdo(CommonUtils util, ICache cache, ILogger log, string masterConnectionString, string[] slaveConnectionStrings) : base(cache, log, DataType.MySql) { + public MySqlAdo() : base(DataType.MySql) { } + public MySqlAdo(CommonUtils util, string masterConnectionString, string[] slaveConnectionStrings) : base(DataType.MySql) { base._util = util; if (!string.IsNullOrEmpty(masterConnectionString)) MasterPool = new MySqlConnectionPool("主库", masterConnectionString, null, null); diff --git a/FreeSql/MySql/MySqlAdo/MySqlConnectionPool.cs b/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlConnectionPool.cs similarity index 98% rename from FreeSql/MySql/MySqlAdo/MySqlConnectionPool.cs rename to Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlConnectionPool.cs index 4c244e70..548ff1aa 100644 --- a/FreeSql/MySql/MySqlAdo/MySqlConnectionPool.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlConnectionPool.cs @@ -77,7 +77,7 @@ namespace FreeSql.MySql { _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - FreeUtil.PrevReheatConnectionPool(_pool, minPoolSize); + FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); } } diff --git a/FreeSql/MySql/MySqlAdo/MygisTypes.cs b/Providers/FreeSql.Provider.MySql/MySqlAdo/MygisTypes.cs similarity index 100% rename from FreeSql/MySql/MySqlAdo/MygisTypes.cs rename to Providers/FreeSql.Provider.MySql/MySqlAdo/MygisTypes.cs diff --git a/FreeSql/MySql/MySqlAdo/MygisTypesExtensions.cs b/Providers/FreeSql.Provider.MySql/MySqlAdo/MygisTypesExtensions.cs similarity index 100% rename from FreeSql/MySql/MySqlAdo/MygisTypesExtensions.cs rename to Providers/FreeSql.Provider.MySql/MySqlAdo/MygisTypesExtensions.cs diff --git a/FreeSql/MySql/MySqlCodeFirst.cs b/Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs similarity index 100% rename from FreeSql/MySql/MySqlCodeFirst.cs rename to Providers/FreeSql.Provider.MySql/MySqlCodeFirst.cs diff --git a/FreeSql/MySql/MySqlDbFirst.cs b/Providers/FreeSql.Provider.MySql/MySqlDbFirst.cs similarity index 100% rename from FreeSql/MySql/MySqlDbFirst.cs rename to Providers/FreeSql.Provider.MySql/MySqlDbFirst.cs diff --git a/FreeSql/MySql/MySqlExpression.cs b/Providers/FreeSql.Provider.MySql/MySqlExpression.cs similarity index 95% rename from FreeSql/MySql/MySqlExpression.cs rename to Providers/FreeSql.Provider.MySql/MySqlExpression.cs index f6634806..1f67704f 100644 --- a/FreeSql/MySql/MySqlExpression.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlExpression.cs @@ -12,7 +12,7 @@ namespace FreeSql.MySql { public MySqlExpression(CommonUtils common) : base(common) { } - internal override string ExpressionLambdaToSqlOther(Expression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlOther(Expression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); switch (exp.NodeType) { case ExpressionType.Convert: @@ -132,7 +132,7 @@ namespace FreeSql.MySql { return null; } - internal override string ExpressionLambdaToSqlMemberAccessString(MemberExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlMemberAccessString(MemberExpression exp, ExpTSC tsc) { if (exp.Expression == null) { switch (exp.Member.Name) { case "Empty": return "''"; @@ -145,7 +145,7 @@ namespace FreeSql.MySql { } return null; } - internal override string ExpressionLambdaToSqlMemberAccessDateTime(MemberExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlMemberAccessDateTime(MemberExpression exp, ExpTSC tsc) { if (exp.Expression == null) { switch (exp.Member.Name) { case "Now": return "now()"; @@ -173,7 +173,7 @@ namespace FreeSql.MySql { } return null; } - internal override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) { if (exp.Expression == null) { switch (exp.Member.Name) { case "Zero": return "0"; @@ -199,7 +199,7 @@ namespace FreeSql.MySql { return null; } - internal override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); if (exp.Object == null) { switch (exp.Method.Name) { @@ -272,7 +272,7 @@ namespace FreeSql.MySql { } throw new Exception($"MySqlExpression 未实现函数表达式 {exp} 解析"); } - internal override string ExpressionLambdaToSqlCallMath(MethodCallExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlCallMath(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); switch (exp.Method.Name) { case "Abs": return $"abs({getExp(exp.Arguments[0])})"; @@ -298,7 +298,7 @@ namespace FreeSql.MySql { } throw new Exception($"MySqlExpression 未实现函数表达式 {exp} 解析"); } - internal override string ExpressionLambdaToSqlCallDateTime(MethodCallExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlCallDateTime(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); if (exp.Object == null) { switch (exp.Method.Name) { @@ -341,7 +341,7 @@ namespace FreeSql.MySql { } throw new Exception($"MySqlExpression 未实现函数表达式 {exp} 解析"); } - internal override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); if (exp.Object == null) { switch (exp.Method.Name) { @@ -371,7 +371,7 @@ namespace FreeSql.MySql { } throw new Exception($"MySqlExpression 未实现函数表达式 {exp} 解析"); } - internal override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); if (exp.Object == null) { switch (exp.Method.Name) { diff --git a/FreeSql/MySql/MySqlExtensions.cs b/Providers/FreeSql.Provider.MySql/MySqlExtensions.cs similarity index 100% rename from FreeSql/MySql/MySqlExtensions.cs rename to Providers/FreeSql.Provider.MySql/MySqlExtensions.cs diff --git a/FreeSql/MySql/MySqlProvider.cs b/Providers/FreeSql.Provider.MySql/MySqlProvider.cs similarity index 62% rename from FreeSql/MySql/MySqlProvider.cs rename to Providers/FreeSql.Provider.MySql/MySqlProvider.cs index 2387c54a..2e032f27 100644 --- a/FreeSql/MySql/MySqlProvider.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlProvider.cs @@ -1,16 +1,14 @@ using FreeSql.Internal; using FreeSql.Internal.CommonProvider; using FreeSql.MySql.Curd; -using Microsoft.Extensions.Caching.Distributed; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Data.Common; +using System.Linq.Expressions; namespace FreeSql.MySql { - class MySqlProvider : IFreeSql { + public class MySqlProvider : IFreeSql { static MySqlProvider() { Utils.dicExecuteArrayRowReadClassOrTuple[typeof(MygisPoint)] = true; @@ -19,6 +17,19 @@ namespace FreeSql.MySql { Utils.dicExecuteArrayRowReadClassOrTuple[typeof(MygisMultiPoint)] = true; Utils.dicExecuteArrayRowReadClassOrTuple[typeof(MygisMultiLineString)] = true; Utils.dicExecuteArrayRowReadClassOrTuple[typeof(MygisMultiPolygon)] = true; + + var MethodMygisGeometryParse = typeof(MygisGeometry).GetMethod("Parse", new[] { typeof(string) }); + Utils.GetDataReaderValueBlockExpressionSwitchTypeFullName.Add((LabelTarget returnTarget, Expression valueExp, string typeFullName) => { + switch (typeFullName) { + case "MygisPoint": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisPoint))); + case "MygisLineString": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisLineString))); + case "MygisPolygon": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisPolygon))); + case "MygisMultiPoint": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisMultiPoint))); + case "MygisMultiLineString": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisMultiLineString))); + case "MygisMultiPolygon": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodMygisGeometryParse, Expression.Convert(valueExp, typeof(string))), typeof(MygisMultiPolygon))); + } + return null; + }); } public ISelect Select() where T1 : class => new MySqlSelect(this, this.InternalCommonUtils, this.InternalCommonExpression, null); @@ -34,17 +45,13 @@ namespace FreeSql.MySql { public IAdo Ado { get; } public IAop Aop { get; } - public ICache Cache { get; } public ICodeFirst CodeFirst { get; } public IDbFirst DbFirst { get; } - public MySqlProvider(IDistributedCache cache, ILogger log, string masterConnectionString, string[] slaveConnectionString) { - if (log == null) log = new LoggerFactory(new[] { new Microsoft.Extensions.Logging.Debug.DebugLoggerProvider() }).CreateLogger("FreeSql.MySql"); - + public MySqlProvider(string masterConnectionString, string[] slaveConnectionString) { this.InternalCommonUtils = new MySqlUtils(this); this.InternalCommonExpression = new MySqlExpression(this.InternalCommonUtils); - this.Cache = new CacheProvider(cache, log); - this.Ado = new MySqlAdo(this.InternalCommonUtils, this.Cache, log, masterConnectionString, slaveConnectionString); + this.Ado = new MySqlAdo(this.InternalCommonUtils, masterConnectionString, slaveConnectionString); this.Aop = new AopProvider(); this.DbFirst = new MySqlDbFirst(this, this.InternalCommonUtils, this.InternalCommonExpression); @@ -65,7 +72,6 @@ namespace FreeSql.MySql { public void Dispose() { if (_isdisposed) return; (this.Ado as AdoProvider).Dispose(); - (this.Cache as CacheProvider)?.Dispose(); } } } diff --git a/FreeSql/MySql/MySqlUtils.cs b/Providers/FreeSql.Provider.MySql/MySqlUtils.cs similarity index 70% rename from FreeSql/MySql/MySqlUtils.cs rename to Providers/FreeSql.Provider.MySql/MySqlUtils.cs index 73015d03..3b6eb16b 100644 --- a/FreeSql/MySql/MySqlUtils.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlUtils.cs @@ -5,6 +5,8 @@ using System; using System.Collections.Generic; using System.Data.Common; using System.Linq; +using System.Linq.Expressions; +using System.Reflection; using System.Text; namespace FreeSql.MySql { @@ -13,7 +15,7 @@ namespace FreeSql.MySql { public MySqlUtils(IFreeSql orm) : base(orm) { } - internal override DbParameter AppendParamter(List _params, string parameterName, Type type, object value) { + public override DbParameter AppendParamter(List _params, string parameterName, Type type, object value) { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; var ret = new MySqlParameter { ParameterName = QuoteParamterName(parameterName), Value = value }; var tp = _orm.CodeFirst.GetDbInfo(type)?.type; @@ -28,7 +30,7 @@ namespace FreeSql.MySql { return ret; } - internal override DbParameter[] GetDbParamtersByObject(string sql, object obj) => + public override DbParameter[] GetDbParamtersByObject(string sql, object obj) => Utils.GetDbParamtersByObject(sql, obj, "?", (name, type, value) => { var ret = new MySqlParameter { ParameterName = $"?{name}", Value = value }; var tp = _orm.CodeFirst.GetDbInfo(type)?.type; @@ -42,24 +44,24 @@ namespace FreeSql.MySql { return ret; }); - internal override string FormatSql(string sql, params object[] args) => sql?.FormatMySql(args); - internal override string QuoteSqlName(string name) { + public override string FormatSql(string sql, params object[] args) => sql?.FormatMySql(args); + public override string QuoteSqlName(string name) { var nametrim = name.Trim(); if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) return nametrim; //原生SQL return $"`{nametrim.Trim('`').Replace(".", "`.`")}`"; } - internal override string TrimQuoteSqlName(string name) { + public override string TrimQuoteSqlName(string name) { var nametrim = name.Trim(); if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) return nametrim; //原生SQL return $"{nametrim.Trim('`').Replace("`.`", ".").Replace(".`", ".")}"; } - internal override string QuoteParamterName(string name) => $"?{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; - internal override string IsNull(string sql, object value) => $"ifnull({sql}, {value})"; - internal override string StringConcat(string[] objs, Type[] types) => $"concat({string.Join(", ", objs)})"; - internal override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}"; - internal override string QuoteWriteParamter(Type type, string paramterName) { + public override string QuoteParamterName(string name) => $"?{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; + public override string IsNull(string sql, object value) => $"ifnull({sql}, {value})"; + public override string StringConcat(string[] objs, Type[] types) => $"concat({string.Join(", ", objs)})"; + public override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}"; + public override string QuoteWriteParamter(Type type, string paramterName) { switch (type.FullName) { case "MygisPoint": case "MygisLineString": @@ -71,7 +73,7 @@ namespace FreeSql.MySql { return paramterName; } - internal override string QuoteReadColumn(Type type, string columnName) { + public override string QuoteReadColumn(Type type, string columnName) { switch (type.FullName) { case "MygisPoint": case "MygisLineString": @@ -83,7 +85,7 @@ namespace FreeSql.MySql { return columnName; } - internal override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) { + public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) { if (value == null) return "NULL"; if (type == typeof(byte[])) { var bytes = value as byte[]; diff --git a/FreeSql/Oracle/Curd/OracleDelete.cs b/Providers/FreeSql.Provider.Oracle/Curd/OracleDelete.cs similarity index 100% rename from FreeSql/Oracle/Curd/OracleDelete.cs rename to Providers/FreeSql.Provider.Oracle/Curd/OracleDelete.cs diff --git a/FreeSql/Oracle/Curd/OracleInsert.cs b/Providers/FreeSql.Provider.Oracle/Curd/OracleInsert.cs similarity index 96% rename from FreeSql/Oracle/Curd/OracleInsert.cs rename to Providers/FreeSql.Provider.Oracle/Curd/OracleInsert.cs index 2eb55b77..a8b1e480 100644 --- a/FreeSql/Oracle/Curd/OracleInsert.cs +++ b/Providers/FreeSql.Provider.Oracle/Curd/OracleInsert.cs @@ -80,7 +80,7 @@ namespace FreeSql.Oracle.Curd { } ColumnInfo _identCol; - internal override long RawExecuteIdentity() { + protected override long RawExecuteIdentity() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; @@ -123,7 +123,7 @@ namespace FreeSql.Oracle.Curd { this.ClearData(); return ret; } - async internal override Task RawExecuteIdentityAsync() { + async protected override Task RawExecuteIdentityAsync() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; @@ -167,14 +167,14 @@ namespace FreeSql.Oracle.Curd { return ret; } - internal override List RawExecuteInserted() { + protected override List RawExecuteInserted() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return new List(); this.RawExecuteAffrows(); return _source; } - async internal override Task> RawExecuteInsertedAsync() { + async protected override Task> RawExecuteInsertedAsync() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return new List(); diff --git a/FreeSql/Oracle/Curd/OracleSelect.cs b/Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs similarity index 100% rename from FreeSql/Oracle/Curd/OracleSelect.cs rename to Providers/FreeSql.Provider.Oracle/Curd/OracleSelect.cs diff --git a/FreeSql/Oracle/Curd/OracleUpdate.cs b/Providers/FreeSql.Provider.Oracle/Curd/OracleUpdate.cs similarity index 94% rename from FreeSql/Oracle/Curd/OracleUpdate.cs rename to Providers/FreeSql.Provider.Oracle/Curd/OracleUpdate.cs index 0529d122..0347b8ca 100644 --- a/FreeSql/Oracle/Curd/OracleUpdate.cs +++ b/Providers/FreeSql.Provider.Oracle/Curd/OracleUpdate.cs @@ -21,10 +21,10 @@ namespace FreeSql.Oracle.Curd { public override Task> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(200, 999); - internal override List RawExecuteUpdated() { + protected override List RawExecuteUpdated() { throw new NotImplementedException(); } - internal override Task> RawExecuteUpdatedAsync() { + protected override Task> RawExecuteUpdatedAsync() { throw new NotImplementedException(); } diff --git a/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj new file mode 100644 index 00000000..a839d7ce --- /dev/null +++ b/Providers/FreeSql.Provider.Oracle/FreeSql.Provider.Oracle.csproj @@ -0,0 +1,29 @@ + + + + netstandard2.0 + 0.6.1 + true + YeXiangQin + FreeSql 数据库实现,基于 Oracle 11 + https://github.com/2881099/FreeSql + https://github.com/2881099/FreeSql + git + MIT + FreeSql;ORM + $(AssemblyName) + $(AssemblyName) + true + true + + + + + + + + + + + + diff --git a/FreeSql/Oracle/OracleAdo/OracleAdo.cs b/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleAdo.cs similarity index 90% rename from FreeSql/Oracle/OracleAdo/OracleAdo.cs rename to Providers/FreeSql.Provider.Oracle/OracleAdo/OracleAdo.cs index 0991e36a..249be02a 100644 --- a/FreeSql/Oracle/OracleAdo/OracleAdo.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleAdo.cs @@ -1,5 +1,4 @@ using FreeSql.Internal; -using Microsoft.Extensions.Logging; using Oracle.ManagedDataAccess.Client; using SafeObjectPool; using System; @@ -10,8 +9,8 @@ using System.Threading; namespace FreeSql.Oracle { class OracleAdo : FreeSql.Internal.CommonProvider.AdoProvider { - public OracleAdo() : base(null, null, DataType.Oracle) { } - public OracleAdo(CommonUtils util, ICache cache, ILogger log, string masterConnectionString, string[] slaveConnectionStrings) : base(cache, log, DataType.Oracle) { + public OracleAdo() : base(DataType.Oracle) { } + public OracleAdo(CommonUtils util, string masterConnectionString, string[] slaveConnectionStrings) : base(DataType.Oracle) { base._util = util; if (!string.IsNullOrEmpty(masterConnectionString)) MasterPool = new OracleConnectionPool("主库", masterConnectionString, null, null); diff --git a/FreeSql/Oracle/OracleAdo/OracleConnectionPool.cs b/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleConnectionPool.cs similarity index 98% rename from FreeSql/Oracle/OracleAdo/OracleConnectionPool.cs rename to Providers/FreeSql.Provider.Oracle/OracleAdo/OracleConnectionPool.cs index d8b8d806..61b60d55 100644 --- a/FreeSql/Oracle/OracleAdo/OracleConnectionPool.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleConnectionPool.cs @@ -91,7 +91,7 @@ namespace FreeSql.Oracle { _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - FreeUtil.PrevReheatConnectionPool(_pool, minPoolSize); + FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); } } diff --git a/FreeSql/Oracle/OracleCodeFirst.cs b/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs similarity index 100% rename from FreeSql/Oracle/OracleCodeFirst.cs rename to Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs diff --git a/FreeSql/Oracle/OracleDbFirst.cs b/Providers/FreeSql.Provider.Oracle/OracleDbFirst.cs similarity index 100% rename from FreeSql/Oracle/OracleDbFirst.cs rename to Providers/FreeSql.Provider.Oracle/OracleDbFirst.cs diff --git a/FreeSql/Oracle/OracleExpression.cs b/Providers/FreeSql.Provider.Oracle/OracleExpression.cs similarity index 95% rename from FreeSql/Oracle/OracleExpression.cs rename to Providers/FreeSql.Provider.Oracle/OracleExpression.cs index 8003f125..f5f333c6 100644 --- a/FreeSql/Oracle/OracleExpression.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleExpression.cs @@ -12,7 +12,7 @@ namespace FreeSql.Oracle { public OracleExpression(CommonUtils common) : base(common) { } - internal override string ExpressionLambdaToSqlOther(Expression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlOther(Expression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); switch (exp.NodeType) { case ExpressionType.Convert: @@ -132,7 +132,7 @@ namespace FreeSql.Oracle { return null; } - internal override string ExpressionLambdaToSqlMemberAccessString(MemberExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlMemberAccessString(MemberExpression exp, ExpTSC tsc) { if (exp.Expression == null) { switch (exp.Member.Name) { case "Empty": return "''"; @@ -145,7 +145,7 @@ namespace FreeSql.Oracle { } return null; } - internal override string ExpressionLambdaToSqlMemberAccessDateTime(MemberExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlMemberAccessDateTime(MemberExpression exp, ExpTSC tsc) { if (exp.Expression == null) { switch (exp.Member.Name) { case "Now": return "systimestamp"; @@ -173,7 +173,7 @@ namespace FreeSql.Oracle { } return null; } - internal override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) { if (exp.Expression == null) { switch (exp.Member.Name) { case "Zero": return "numtodsinterval(0,'second')"; @@ -199,7 +199,7 @@ namespace FreeSql.Oracle { return null; } - internal override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); if (exp.Object == null) { switch (exp.Method.Name) { @@ -272,7 +272,7 @@ namespace FreeSql.Oracle { } throw new Exception($"OracleExpression 未实现函数表达式 {exp} 解析"); } - internal override string ExpressionLambdaToSqlCallMath(MethodCallExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlCallMath(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); switch (exp.Method.Name) { case "Abs": return $"abs({getExp(exp.Arguments[0])})"; @@ -299,7 +299,7 @@ namespace FreeSql.Oracle { } throw new Exception($"OracleExpression 未实现函数表达式 {exp} 解析"); } - internal override string ExpressionLambdaToSqlCallDateTime(MethodCallExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlCallDateTime(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); if (exp.Object == null) { switch (exp.Method.Name) { @@ -342,7 +342,7 @@ namespace FreeSql.Oracle { } throw new Exception($"OracleExpression 未实现函数表达式 {exp} 解析"); } - internal override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); if (exp.Object == null) { switch (exp.Method.Name) { @@ -372,7 +372,7 @@ namespace FreeSql.Oracle { } throw new Exception($"OracleExpression 未实现函数表达式 {exp} 解析"); } - internal override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); if (exp.Object == null) { switch (exp.Method.Name) { diff --git a/FreeSql/Oracle/OracleExtensions.cs b/Providers/FreeSql.Provider.Oracle/OracleExtensions.cs similarity index 100% rename from FreeSql/Oracle/OracleExtensions.cs rename to Providers/FreeSql.Provider.Oracle/OracleExtensions.cs diff --git a/FreeSql/Oracle/OracleProvider.cs b/Providers/FreeSql.Provider.Oracle/OracleProvider.cs similarity index 78% rename from FreeSql/Oracle/OracleProvider.cs rename to Providers/FreeSql.Provider.Oracle/OracleProvider.cs index b595f2a1..2f2e7f44 100644 --- a/FreeSql/Oracle/OracleProvider.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleProvider.cs @@ -1,16 +1,13 @@ using FreeSql.Internal; using FreeSql.Internal.CommonProvider; using FreeSql.Oracle.Curd; -using Microsoft.Extensions.Caching.Distributed; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Data.Common; namespace FreeSql.Oracle { - class OracleProvider : IFreeSql { + public class OracleProvider : IFreeSql { public ISelect Select() where T1 : class => new OracleSelect(this, this.InternalCommonUtils, this.InternalCommonExpression, null); public ISelect Select(object dywhere) where T1 : class => new OracleSelect(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere); @@ -25,17 +22,13 @@ namespace FreeSql.Oracle { public IAdo Ado { get; } public IAop Aop { get; } - public ICache Cache { get; } public ICodeFirst CodeFirst { get; } public IDbFirst DbFirst { get; } - public OracleProvider(IDistributedCache cache, ILogger log, string masterConnectionString, string[] slaveConnectionString) { - if (log == null) log = new LoggerFactory(new[] { new Microsoft.Extensions.Logging.Debug.DebugLoggerProvider() }).CreateLogger("FreeSql.Oracle"); - + public OracleProvider(string masterConnectionString, string[] slaveConnectionString) { this.InternalCommonUtils = new OracleUtils(this); this.InternalCommonExpression = new OracleExpression(this.InternalCommonUtils); - this.Cache = new CacheProvider(cache, log); - this.Ado = new OracleAdo(this.InternalCommonUtils, this.Cache, log, masterConnectionString, slaveConnectionString); + this.Ado = new OracleAdo(this.InternalCommonUtils, masterConnectionString, slaveConnectionString); this.Aop = new AopProvider(); this.DbFirst = new OracleDbFirst(this, this.InternalCommonUtils, this.InternalCommonExpression); @@ -56,7 +49,6 @@ namespace FreeSql.Oracle { public void Dispose() { if (_isdisposed) return; (this.Ado as AdoProvider).Dispose(); - (this.Cache as CacheProvider)?.Dispose(); } } } diff --git a/FreeSql/Oracle/OracleUtils.cs b/Providers/FreeSql.Provider.Oracle/OracleUtils.cs similarity index 63% rename from FreeSql/Oracle/OracleUtils.cs rename to Providers/FreeSql.Provider.Oracle/OracleUtils.cs index 4666a797..60b73a7c 100644 --- a/FreeSql/Oracle/OracleUtils.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleUtils.cs @@ -4,6 +4,7 @@ using Oracle.ManagedDataAccess.Client; using System; using System.Collections.Generic; using System.Data.Common; +using System.Linq.Expressions; using System.Text; namespace FreeSql.Oracle { @@ -12,7 +13,7 @@ namespace FreeSql.Oracle { public OracleUtils(IFreeSql orm) : base(orm) { } - internal override DbParameter AppendParamter(List _params, string parameterName, Type type, object value) { + public override DbParameter AppendParamter(List _params, string parameterName, Type type, object value) { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; var dbtype = (OracleDbType)_orm.CodeFirst.GetDbInfo(type)?.type; if (dbtype == OracleDbType.Boolean) { @@ -25,7 +26,7 @@ namespace FreeSql.Oracle { return ret; } - internal override DbParameter[] GetDbParamtersByObject(string sql, object obj) => + public override DbParameter[] GetDbParamtersByObject(string sql, object obj) => Utils.GetDbParamtersByObject(sql, obj, ":", (name, type, value) => { var dbtype = (OracleDbType)_orm.CodeFirst.GetDbInfo(type)?.type; if (dbtype == OracleDbType.Boolean) { @@ -37,28 +38,28 @@ namespace FreeSql.Oracle { return ret; }); - internal override string FormatSql(string sql, params object[] args) => sql?.FormatOracleSQL(args); - internal override string QuoteSqlName(string name) { + public override string FormatSql(string sql, params object[] args) => sql?.FormatOracleSQL(args); + public override string QuoteSqlName(string name) { var nametrim = name.Trim(); if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) return nametrim; //原生SQL return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\""; } - internal override string TrimQuoteSqlName(string name) { + public override string TrimQuoteSqlName(string name) { var nametrim = name.Trim(); if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) return nametrim; //原生SQL return $"{nametrim.Trim('"').Replace("\".\"", ".").Replace(".\"", ".")}"; } - internal override string QuoteParamterName(string name) => $":{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; - internal override string IsNull(string sql, object value) => $"nvl({sql}, {value})"; - internal override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}"; - internal override string Mod(string left, string right, Type leftType, Type rightType) => $"mod({left}, {right})"; + public override string QuoteParamterName(string name) => $":{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; + public override string IsNull(string sql, object value) => $"nvl({sql}, {value})"; + public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}"; + public override string Mod(string left, string right, Type leftType, Type rightType) => $"mod({left}, {right})"; - internal override string QuoteWriteParamter(Type type, string paramterName) => paramterName; - internal override string QuoteReadColumn(Type type, string columnName) => columnName; + public override string QuoteWriteParamter(Type type, string paramterName) => paramterName; + public override string QuoteReadColumn(Type type, string columnName) => columnName; - internal override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) { + public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) { if (value == null) return "NULL"; if (type == typeof(byte[])) { var bytes = value as byte[]; diff --git a/FreeSql/PostgreSQL/Curd/PostgreSQLDelete.cs b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLDelete.cs similarity index 100% rename from FreeSql/PostgreSQL/Curd/PostgreSQLDelete.cs rename to Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLDelete.cs diff --git a/FreeSql/PostgreSQL/Curd/PostgreSQLInsert.cs b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsert.cs similarity index 96% rename from FreeSql/PostgreSQL/Curd/PostgreSQLInsert.cs rename to Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsert.cs index 549c7ace..40e48e7c 100644 --- a/FreeSql/PostgreSQL/Curd/PostgreSQLInsert.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLInsert.cs @@ -21,7 +21,7 @@ namespace FreeSql.PostgreSQL.Curd { public override Task> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(5000, 3000); - internal override long RawExecuteIdentity() { + protected override long RawExecuteIdentity() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; @@ -60,7 +60,7 @@ namespace FreeSql.PostgreSQL.Curd { this.ClearData(); return ret; } - async internal override Task RawExecuteIdentityAsync() { + async protected override Task RawExecuteIdentityAsync() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; @@ -100,7 +100,7 @@ namespace FreeSql.PostgreSQL.Curd { return ret; } - internal override List RawExecuteInserted() { + protected override List RawExecuteInserted() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return new List(); @@ -130,7 +130,7 @@ namespace FreeSql.PostgreSQL.Curd { this.ClearData(); return ret; } - async internal override Task> RawExecuteInsertedAsync() { + async protected override Task> RawExecuteInsertedAsync() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return new List(); diff --git a/FreeSql/PostgreSQL/Curd/PostgreSQLSelect.cs b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLSelect.cs similarity index 100% rename from FreeSql/PostgreSQL/Curd/PostgreSQLSelect.cs rename to Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLSelect.cs diff --git a/FreeSql/PostgreSQL/Curd/PostgreSQLUpdate.cs b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLUpdate.cs similarity index 97% rename from FreeSql/PostgreSQL/Curd/PostgreSQLUpdate.cs rename to Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLUpdate.cs index 87c66a05..985faca3 100644 --- a/FreeSql/PostgreSQL/Curd/PostgreSQLUpdate.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/Curd/PostgreSQLUpdate.cs @@ -21,7 +21,7 @@ namespace FreeSql.PostgreSQL.Curd { public override Task> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(500, 3000); - internal override List RawExecuteUpdated() { + protected override List RawExecuteUpdated() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return new List(); @@ -53,7 +53,7 @@ namespace FreeSql.PostgreSQL.Curd { this.ClearData(); return ret; } - async internal override Task> RawExecuteUpdatedAsync() { + async protected override Task> RawExecuteUpdatedAsync() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return new List(); diff --git a/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj new file mode 100644 index 00000000..e99f8ff0 --- /dev/null +++ b/Providers/FreeSql.Provider.PostgreSQL/FreeSql.Provider.PostgreSQL.csproj @@ -0,0 +1,29 @@ + + + + netstandard2.0 + 0.6.1 + true + YeXiangQin + FreeSql 数据库实现,基于 PostgreSQL 9.5 + https://github.com/2881099/FreeSql + https://github.com/2881099/FreeSql + git + MIT + FreeSql;ORM + $(AssemblyName) + $(AssemblyName) + true + true + + + + + + + + + + + + diff --git a/FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs similarity index 92% rename from FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs rename to Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs index ed62824f..b3940097 100644 --- a/FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs @@ -1,5 +1,4 @@ using FreeSql.Internal; -using Microsoft.Extensions.Logging; using Newtonsoft.Json.Linq; using Npgsql; using SafeObjectPool; @@ -12,8 +11,8 @@ using System.Threading; namespace FreeSql.PostgreSQL { class PostgreSQLAdo : FreeSql.Internal.CommonProvider.AdoProvider { - public PostgreSQLAdo() : base(null, null, DataType.PostgreSQL) { } - public PostgreSQLAdo(CommonUtils util, ICache cache, ILogger log, string masterConnectionString, string[] slaveConnectionStrings) : base(cache, log, DataType.PostgreSQL) { + public PostgreSQLAdo() : base(DataType.PostgreSQL) { } + public PostgreSQLAdo(CommonUtils util, string masterConnectionString, string[] slaveConnectionStrings) : base(DataType.PostgreSQL) { base._util = util; if (!string.IsNullOrEmpty(masterConnectionString)) MasterPool = new PostgreSQLConnectionPool("主库", masterConnectionString, null, null); diff --git a/FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs similarity index 98% rename from FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs rename to Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs index 405bb956..3eba3ebf 100644 --- a/FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLConnectionPool.cs @@ -86,7 +86,7 @@ namespace FreeSql.PostgreSQL { _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - FreeUtil.PrevReheatConnectionPool(_pool, minPoolSize); + FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); } } diff --git a/FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLTypesConverter.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLTypesConverter.cs similarity index 100% rename from FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLTypesConverter.cs rename to Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLTypesConverter.cs diff --git a/FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLTypesExtensions.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLTypesExtensions.cs similarity index 100% rename from FreeSql/PostgreSQL/PostgreSQLAdo/PostgreSQLTypesExtensions.cs rename to Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLTypesExtensions.cs diff --git a/FreeSql/PostgreSQL/PostgreSQLCodeFirst.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLCodeFirst.cs similarity index 100% rename from FreeSql/PostgreSQL/PostgreSQLCodeFirst.cs rename to Providers/FreeSql.Provider.PostgreSQL/PostgreSQLCodeFirst.cs diff --git a/FreeSql/PostgreSQL/PostgreSQLDbFirst.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLDbFirst.cs similarity index 100% rename from FreeSql/PostgreSQL/PostgreSQLDbFirst.cs rename to Providers/FreeSql.Provider.PostgreSQL/PostgreSQLDbFirst.cs diff --git a/FreeSql/PostgreSQL/PostgreSQLExpression.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs similarity index 96% rename from FreeSql/PostgreSQL/PostgreSQLExpression.cs rename to Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs index 2fe5abc5..cc3af126 100644 --- a/FreeSql/PostgreSQL/PostgreSQLExpression.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs @@ -13,7 +13,7 @@ namespace FreeSql.PostgreSQL { public PostgreSQLExpression(CommonUtils common) : base(common) { } - internal override string ExpressionLambdaToSqlOther(Expression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlOther(Expression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); switch (exp.NodeType) { case ExpressionType.Convert: @@ -230,7 +230,7 @@ namespace FreeSql.PostgreSQL { return null; } - internal override string ExpressionLambdaToSqlMemberAccessString(MemberExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlMemberAccessString(MemberExpression exp, ExpTSC tsc) { if (exp.Expression == null) { switch (exp.Member.Name) { case "Empty": return "''"; @@ -243,7 +243,7 @@ namespace FreeSql.PostgreSQL { } return null; } - internal override string ExpressionLambdaToSqlMemberAccessDateTime(MemberExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlMemberAccessDateTime(MemberExpression exp, ExpTSC tsc) { if (exp.Expression == null) { switch (exp.Member.Name) { case "Now": return "current_timestamp"; @@ -271,7 +271,7 @@ namespace FreeSql.PostgreSQL { } return null; } - internal override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) { if (exp.Expression == null) { switch (exp.Member.Name) { case "Zero": return "0"; @@ -297,7 +297,7 @@ namespace FreeSql.PostgreSQL { return null; } - internal override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); if (exp.Object == null) { switch (exp.Method.Name) { @@ -372,7 +372,7 @@ namespace FreeSql.PostgreSQL { } throw new Exception($"PostgreSQLExpression 未实现函数表达式 {exp} 解析"); } - internal override string ExpressionLambdaToSqlCallMath(MethodCallExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlCallMath(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); switch (exp.Method.Name) { case "Abs": return $"abs({getExp(exp.Arguments[0])})"; @@ -398,7 +398,7 @@ namespace FreeSql.PostgreSQL { } throw new Exception($"PostgreSQLExpression 未实现函数表达式 {exp} 解析"); } - internal override string ExpressionLambdaToSqlCallDateTime(MethodCallExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlCallDateTime(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); if (exp.Object == null) { switch (exp.Method.Name) { @@ -441,7 +441,7 @@ namespace FreeSql.PostgreSQL { } throw new Exception($"PostgreSQLExpression 未实现函数表达式 {exp} 解析"); } - internal override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); if (exp.Object == null) { switch (exp.Method.Name) { @@ -471,7 +471,7 @@ namespace FreeSql.PostgreSQL { } throw new Exception($"PostgreSQLExpression 未实现函数表达式 {exp} 解析"); } - internal override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); if (exp.Object == null) { switch (exp.Method.Name) { diff --git a/FreeSql/PostgreSQL/PostgreSQLExtensions.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExtensions.cs similarity index 100% rename from FreeSql/PostgreSQL/PostgreSQLExtensions.cs rename to Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExtensions.cs diff --git a/FreeSql/PostgreSQL/PostgreSQLProvider.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs similarity index 77% rename from FreeSql/PostgreSQL/PostgreSQLProvider.cs rename to Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs index bbc28288..bca60aa3 100644 --- a/FreeSql/PostgreSQL/PostgreSQLProvider.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLProvider.cs @@ -1,9 +1,6 @@ using FreeSql.Internal; using FreeSql.Internal.CommonProvider; using FreeSql.PostgreSQL.Curd; -using Microsoft.Extensions.Caching.Distributed; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging; using Newtonsoft.Json.Linq; using Npgsql.LegacyPostgis; using NpgsqlTypes; @@ -11,12 +8,13 @@ using System; using System.Collections; using System.Collections.Generic; using System.Data.Common; +using System.Linq.Expressions; using System.Net; using System.Net.NetworkInformation; namespace FreeSql.PostgreSQL { - class PostgreSQLProvider : IFreeSql { + public class PostgreSQLProvider : IFreeSql { static PostgreSQLProvider() { Utils.dicExecuteArrayRowReadClassOrTuple[typeof(BitArray)] = true; @@ -46,6 +44,19 @@ namespace FreeSql.PostgreSQL { Utils.dicExecuteArrayRowReadClassOrTuple[typeof(JToken)] = true; Utils.dicExecuteArrayRowReadClassOrTuple[typeof(JObject)] = true; Utils.dicExecuteArrayRowReadClassOrTuple[typeof(JArray)] = true; + + var MethodJTokenParse = typeof(JToken).GetMethod("Parse", new[] { typeof(string) }); + var MethodJObjectParse = typeof(JObject).GetMethod("Parse", new[] { typeof(string) }); + var MethodJArrayParse = typeof(JArray).GetMethod("Parse", new[] { typeof(string) }); + Utils.GetDataReaderValueBlockExpressionSwitchTypeFullName.Add((LabelTarget returnTarget, Expression valueExp, string typeFullName) => { + switch (typeFullName) { + case "Newtonsoft.Json.Linq.JToken": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJTokenParse, Expression.Convert(valueExp, typeof(string))), typeof(JToken))); + case "Newtonsoft.Json.Linq.JObject": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJObjectParse, Expression.Convert(valueExp, typeof(string))), typeof(JObject))); + case "Newtonsoft.Json.Linq.JArray": return Expression.Return(returnTarget, Expression.TypeAs(Expression.Call(MethodJArrayParse, Expression.Convert(valueExp, typeof(string))), typeof(JArray))); + case "Npgsql.LegacyPostgis.PostgisGeometry": return Expression.Return(returnTarget, valueExp); + } + return null; + }); } public ISelect Select() where T1 : class => new PostgreSQLSelect(this, this.InternalCommonUtils, this.InternalCommonExpression, null); @@ -61,17 +72,13 @@ namespace FreeSql.PostgreSQL { public IAdo Ado { get; } public IAop Aop { get; } - public ICache Cache { get; } public ICodeFirst CodeFirst { get; } public IDbFirst DbFirst { get; } - public PostgreSQLProvider(IDistributedCache cache, ILogger log, string masterConnectionString, string[] slaveConnectionString) { - if (log == null) log = new LoggerFactory(new[] { new Microsoft.Extensions.Logging.Debug.DebugLoggerProvider() }).CreateLogger("FreeSql.PostgreSQL"); - + public PostgreSQLProvider(string masterConnectionString, string[] slaveConnectionString) { this.InternalCommonUtils = new PostgreSQLUtils(this); this.InternalCommonExpression = new PostgreSQLExpression(this.InternalCommonUtils); - this.Cache = new CacheProvider(cache, log); - this.Ado = new PostgreSQLAdo(this.InternalCommonUtils, this.Cache, log, masterConnectionString, slaveConnectionString); + this.Ado = new PostgreSQLAdo(this.InternalCommonUtils, masterConnectionString, slaveConnectionString); this.Aop = new AopProvider(); this.DbFirst = new PostgreSQLDbFirst(this, this.InternalCommonUtils, this.InternalCommonExpression); @@ -92,7 +99,6 @@ namespace FreeSql.PostgreSQL { public void Dispose() { if (_isdisposed) return; (this.Ado as AdoProvider).Dispose(); - (this.Cache as CacheProvider)?.Dispose(); } } } diff --git a/FreeSql/PostgreSQL/PostgreSQLUtils.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs similarity index 87% rename from FreeSql/PostgreSQL/PostgreSQLUtils.cs rename to Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs index 3fd7c9a4..89817e27 100644 --- a/FreeSql/PostgreSQL/PostgreSQLUtils.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLUtils.cs @@ -11,6 +11,8 @@ using System.Data.Common; using System.Linq; using System.Net; using System.Text; +using System.Linq.Expressions; +using System.Reflection; namespace FreeSql.PostgreSQL { @@ -69,7 +71,7 @@ namespace FreeSql.PostgreSQL { return value; } - internal override DbParameter AppendParamter(List _params, string parameterName, Type type, object value) { + public override DbParameter AppendParamter(List _params, string parameterName, Type type, object value) { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; if (value != null) value = getParamterValue(type, value); var ret = new NpgsqlParameter { ParameterName = QuoteParamterName(parameterName), Value = value }; @@ -83,7 +85,7 @@ namespace FreeSql.PostgreSQL { return ret; } - internal override DbParameter[] GetDbParamtersByObject(string sql, object obj) => + public override DbParameter[] GetDbParamtersByObject(string sql, object obj) => Utils.GetDbParamtersByObject(sql, obj, "@", (name, type, value) => { if (value != null) value = getParamterValue(type, value); var ret = new NpgsqlParameter { ParameterName = $"@{name}", Value = value }; @@ -96,29 +98,29 @@ namespace FreeSql.PostgreSQL { return ret; }); - internal override string FormatSql(string sql, params object[] args) => sql?.FormatPostgreSQL(args); - internal override string QuoteSqlName(string name) { + public override string FormatSql(string sql, params object[] args) => sql?.FormatPostgreSQL(args); + public override string QuoteSqlName(string name) { var nametrim = name.Trim(); if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) return nametrim; //原生SQL return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\""; } - internal override string TrimQuoteSqlName(string name) { + public override string TrimQuoteSqlName(string name) { var nametrim = name.Trim(); if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) return nametrim; //原生SQL return $"{nametrim.Trim('"').Replace("\".\"", ".").Replace(".\"", ".")}"; } - internal override string QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; - internal override string IsNull(string sql, object value) => $"coalesce({sql}, {value})"; - internal override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}"; - internal override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}"; + public override string QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; + public override string IsNull(string sql, object value) => $"coalesce({sql}, {value})"; + public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}"; + public override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}"; - internal override string QuoteWriteParamter(Type type, string paramterName) => paramterName; - internal override string QuoteReadColumn(Type type, string columnName) => columnName; + public override string QuoteWriteParamter(Type type, string paramterName) => paramterName; + public override string QuoteReadColumn(Type type, string columnName) => columnName; static ConcurrentDictionary _dicIsAssignableFromPostgisGeometry = new ConcurrentDictionary(); - internal override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) { + public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) { if (value == null) return "NULL"; if (_dicIsAssignableFromPostgisGeometry.GetOrAdd(type, t2 => typeof(PostgisGeometry).IsAssignableFrom(type.IsArray ? type.GetElementType() : type))) { var pam = AppendParamter(specialParams, null, type, value); diff --git a/FreeSql/SqlServer/Curd/SqlServerDelete.cs b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerDelete.cs similarity index 100% rename from FreeSql/SqlServer/Curd/SqlServerDelete.cs rename to Providers/FreeSql.Provider.SqlServer/Curd/SqlServerDelete.cs diff --git a/FreeSql/SqlServer/Curd/SqlServerInsert.cs b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsert.cs similarity index 95% rename from FreeSql/SqlServer/Curd/SqlServerInsert.cs rename to Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsert.cs index 71991e41..a0c71ca1 100644 --- a/FreeSql/SqlServer/Curd/SqlServerInsert.cs +++ b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerInsert.cs @@ -22,7 +22,7 @@ namespace FreeSql.SqlServer.Curd { public override Task> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(1000, 2100); - internal override long RawExecuteIdentity() { + protected override long RawExecuteIdentity() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; @@ -43,7 +43,7 @@ namespace FreeSql.SqlServer.Curd { this.ClearData(); return ret; } - async internal override Task RawExecuteIdentityAsync() { + async protected override Task RawExecuteIdentityAsync() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; @@ -65,7 +65,7 @@ namespace FreeSql.SqlServer.Curd { return ret; } - internal override List RawExecuteInserted() { + protected override List RawExecuteInserted() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return new List(); @@ -100,7 +100,7 @@ namespace FreeSql.SqlServer.Curd { this.ClearData(); return ret; } - async internal override Task> RawExecuteInsertedAsync() { + async protected override Task> RawExecuteInsertedAsync() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return new List(); diff --git a/FreeSql/SqlServer/Curd/SqlServerSelect.cs b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs similarity index 100% rename from FreeSql/SqlServer/Curd/SqlServerSelect.cs rename to Providers/FreeSql.Provider.SqlServer/Curd/SqlServerSelect.cs diff --git a/FreeSql/SqlServer/Curd/SqlServerUpdate.cs b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerUpdate.cs similarity index 97% rename from FreeSql/SqlServer/Curd/SqlServerUpdate.cs rename to Providers/FreeSql.Provider.SqlServer/Curd/SqlServerUpdate.cs index 9f3403f8..871ea913 100644 --- a/FreeSql/SqlServer/Curd/SqlServerUpdate.cs +++ b/Providers/FreeSql.Provider.SqlServer/Curd/SqlServerUpdate.cs @@ -21,7 +21,7 @@ namespace FreeSql.SqlServer.Curd { public override Task> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(500, 2100); - internal override List RawExecuteUpdated() { + protected override List RawExecuteUpdated() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return new List(); @@ -58,7 +58,7 @@ namespace FreeSql.SqlServer.Curd { this.ClearData(); return ret; } - async internal override Task> RawExecuteUpdatedAsync() { + async protected override Task> RawExecuteUpdatedAsync() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return new List(); diff --git a/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj new file mode 100644 index 00000000..a8e7a825 --- /dev/null +++ b/Providers/FreeSql.Provider.SqlServer/FreeSql.Provider.SqlServer.csproj @@ -0,0 +1,28 @@ + + + + netstandard2.0 + 0.6.1 + true + YeXiangQin + FreeSql 数据库实现,基于 SqlServer 2005+,并根据版本适配分页方法:row_number 或 offset fetch next + https://github.com/2881099/FreeSql + https://github.com/2881099/FreeSql + git + MIT + FreeSql;ORM + $(AssemblyName) + $(AssemblyName) + true + true + + + + + + + + + + + diff --git a/FreeSql/SqlServer/SqlServerAdo/SqlServerAdo.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerAdo.cs similarity index 91% rename from FreeSql/SqlServer/SqlServerAdo/SqlServerAdo.cs rename to Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerAdo.cs index e8703114..9168c070 100644 --- a/FreeSql/SqlServer/SqlServerAdo/SqlServerAdo.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerAdo.cs @@ -1,5 +1,4 @@ using FreeSql.Internal; -using Microsoft.Extensions.Logging; using SafeObjectPool; using System; using System.Collections; @@ -10,8 +9,8 @@ using System.Threading; namespace FreeSql.SqlServer { class SqlServerAdo : FreeSql.Internal.CommonProvider.AdoProvider { - public SqlServerAdo() : base(null, null, DataType.SqlServer) { } - public SqlServerAdo(CommonUtils util, ICache cache, ILogger log, string masterConnectionString, string[] slaveConnectionStrings) : base(cache, log, DataType.SqlServer) { + public SqlServerAdo() : base(DataType.SqlServer) { } + public SqlServerAdo(CommonUtils util, string masterConnectionString, string[] slaveConnectionStrings) : base(DataType.SqlServer) { base._util = util; if (!string.IsNullOrEmpty(masterConnectionString)) MasterPool = new SqlServerConnectionPool("主库", masterConnectionString, null, null); diff --git a/FreeSql/SqlServer/SqlServerAdo/SqlServerConnectionPool.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerConnectionPool.cs similarity index 98% rename from FreeSql/SqlServer/SqlServerAdo/SqlServerConnectionPool.cs rename to Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerConnectionPool.cs index ae216031..f3f6b6d1 100644 --- a/FreeSql/SqlServer/SqlServerAdo/SqlServerConnectionPool.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerConnectionPool.cs @@ -81,7 +81,7 @@ namespace FreeSql.SqlServer { _connectionString = Regex.Replace(_connectionString, pattern, "", RegexOptions.IgnoreCase); } - FreeUtil.PrevReheatConnectionPool(_pool, minPoolSize); + FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); } } diff --git a/FreeSql/SqlServer/SqlServerCodeFirst.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs similarity index 100% rename from FreeSql/SqlServer/SqlServerCodeFirst.cs rename to Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs diff --git a/FreeSql/SqlServer/SqlServerDbFirst.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerDbFirst.cs similarity index 100% rename from FreeSql/SqlServer/SqlServerDbFirst.cs rename to Providers/FreeSql.Provider.SqlServer/SqlServerDbFirst.cs diff --git a/FreeSql/SqlServer/SqlServerExpression.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs similarity index 95% rename from FreeSql/SqlServer/SqlServerExpression.cs rename to Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs index 0dc8e19b..d0d6b6f4 100644 --- a/FreeSql/SqlServer/SqlServerExpression.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs @@ -12,7 +12,7 @@ namespace FreeSql.SqlServer { public SqlServerExpression(CommonUtils common) : base(common) { } - internal override string ExpressionLambdaToSqlOther(Expression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlOther(Expression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); switch (exp.NodeType) { case ExpressionType.Convert: @@ -135,7 +135,7 @@ namespace FreeSql.SqlServer { return null; } - internal override string ExpressionLambdaToSqlMemberAccessString(MemberExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlMemberAccessString(MemberExpression exp, ExpTSC tsc) { if (exp.Expression == null) { switch (exp.Member.Name) { case "Empty": return "''"; @@ -148,7 +148,7 @@ namespace FreeSql.SqlServer { } return null; } - internal override string ExpressionLambdaToSqlMemberAccessDateTime(MemberExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlMemberAccessDateTime(MemberExpression exp, ExpTSC tsc) { if (exp.Expression == null) { switch (exp.Member.Name) { case "Now": return "getdate()"; @@ -176,7 +176,7 @@ namespace FreeSql.SqlServer { } return null; } - internal override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) { if (exp.Expression == null) { switch (exp.Member.Name) { case "Zero": return "0"; @@ -202,7 +202,7 @@ namespace FreeSql.SqlServer { return null; } - internal override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); if (exp.Object == null) { switch (exp.Method.Name) { @@ -257,7 +257,7 @@ namespace FreeSql.SqlServer { } throw new Exception($"SqlServerExpression 未实现函数表达式 {exp} 解析"); } - internal override string ExpressionLambdaToSqlCallMath(MethodCallExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlCallMath(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); switch (exp.Method.Name) { case "Abs": return $"abs({getExp(exp.Arguments[0])})"; @@ -283,7 +283,7 @@ namespace FreeSql.SqlServer { } throw new Exception($"SqlServerExpression 未实现函数表达式 {exp} 解析"); } - internal override string ExpressionLambdaToSqlCallDateTime(MethodCallExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlCallDateTime(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); if (exp.Object == null) { switch (exp.Method.Name) { @@ -326,7 +326,7 @@ namespace FreeSql.SqlServer { } throw new Exception($"SqlServerExpression 未实现函数表达式 {exp} 解析"); } - internal override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); if (exp.Object == null) { switch (exp.Method.Name) { @@ -356,7 +356,7 @@ namespace FreeSql.SqlServer { } throw new Exception($"SqlServerExpression 未实现函数表达式 {exp} 解析"); } - internal override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); if (exp.Object == null) { switch (exp.Method.Name) { diff --git a/FreeSql/SqlServer/SqlServerExtensions.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerExtensions.cs similarity index 100% rename from FreeSql/SqlServer/SqlServerExtensions.cs rename to Providers/FreeSql.Provider.SqlServer/SqlServerExtensions.cs diff --git a/FreeSql/SqlServer/SqlServerProvider.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerProvider.cs similarity index 79% rename from FreeSql/SqlServer/SqlServerProvider.cs rename to Providers/FreeSql.Provider.SqlServer/SqlServerProvider.cs index c81dc09a..a2d03c74 100644 --- a/FreeSql/SqlServer/SqlServerProvider.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerProvider.cs @@ -1,15 +1,12 @@ using FreeSql.Internal; using FreeSql.Internal.CommonProvider; using FreeSql.SqlServer.Curd; -using Microsoft.Extensions.Caching.Distributed; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; namespace FreeSql.SqlServer { - class SqlServerProvider : IFreeSql { + public class SqlServerProvider : IFreeSql { public ISelect Select() where T1 : class => new SqlServerSelect(this, this.InternalCommonUtils, this.InternalCommonExpression, null); public ISelect Select(object dywhere) where T1 : class => new SqlServerSelect(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere); @@ -24,17 +21,13 @@ namespace FreeSql.SqlServer { public IAdo Ado { get; } public IAop Aop { get; } - public ICache Cache { get; } public ICodeFirst CodeFirst { get; } public IDbFirst DbFirst { get; } - public SqlServerProvider(IDistributedCache cache, ILogger log, string masterConnectionString, string[] slaveConnectionString) { - if (log == null) log = new LoggerFactory(new[] { new Microsoft.Extensions.Logging.Debug.DebugLoggerProvider() }).CreateLogger("FreeSql.SqlServer"); - + public SqlServerProvider(string masterConnectionString, string[] slaveConnectionString) { this.InternalCommonUtils = new SqlServerUtils(this); this.InternalCommonExpression = new SqlServerExpression(this.InternalCommonUtils); - this.Cache = new CacheProvider(cache, log); - this.Ado = new SqlServerAdo(this.InternalCommonUtils, this.Cache, log, masterConnectionString, slaveConnectionString); + this.Ado = new SqlServerAdo(this.InternalCommonUtils, masterConnectionString, slaveConnectionString); this.Aop = new AopProvider(); this.DbFirst = new SqlServerDbFirst(this, this.InternalCommonUtils, this.InternalCommonExpression); @@ -63,7 +56,6 @@ namespace FreeSql.SqlServer { public void Dispose() { if (_isdisposed) return; (this.Ado as AdoProvider).Dispose(); - (this.Cache as CacheProvider)?.Dispose(); } } } diff --git a/FreeSql/SqlServer/SqlServerUtils.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerUtils.cs similarity index 66% rename from FreeSql/SqlServer/SqlServerUtils.cs rename to Providers/FreeSql.Provider.SqlServer/SqlServerUtils.cs index 74aef87e..5c0812e6 100644 --- a/FreeSql/SqlServer/SqlServerUtils.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerUtils.cs @@ -5,6 +5,7 @@ using System.Data; using System.Data.Common; using System.Data.SqlClient; using System.Linq; +using System.Linq.Expressions; using System.Text; namespace FreeSql.SqlServer { @@ -13,9 +14,9 @@ namespace FreeSql.SqlServer { public SqlServerUtils(IFreeSql orm) : base(orm) { } - internal bool IsSelectRowNumber = true; + public bool IsSelectRowNumber = true; - internal override DbParameter AppendParamter(List _params, string parameterName, Type type, object value) { + public override DbParameter AppendParamter(List _params, string parameterName, Type type, object value) { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; if (value?.Equals(DateTime.MinValue) == true) value = new DateTime(1970, 1, 1); var ret = new SqlParameter { ParameterName = QuoteParamterName(parameterName), Value = value }; @@ -25,7 +26,7 @@ namespace FreeSql.SqlServer { return ret; } - internal override DbParameter[] GetDbParamtersByObject(string sql, object obj) => + public override DbParameter[] GetDbParamtersByObject(string sql, object obj) => Utils.GetDbParamtersByObject(sql, obj, "@", (name, type, value) => { if (value?.Equals(DateTime.MinValue) == true) value = new DateTime(1970, 1, 1); var ret = new SqlParameter { ParameterName = $"@{name}", Value = value }; @@ -34,34 +35,34 @@ namespace FreeSql.SqlServer { return ret; }); - internal override string FormatSql(string sql, params object[] args) => sql?.FormatSqlServer(args); - internal override string QuoteSqlName(string name) { + public override string FormatSql(string sql, params object[] args) => sql?.FormatSqlServer(args); + public override string QuoteSqlName(string name) { var nametrim = name.Trim(); if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) return nametrim; //原生SQL return $"[{nametrim.TrimStart('[').TrimEnd(']').Replace(".", "].[")}]"; } - internal override string TrimQuoteSqlName(string name) { + public override string TrimQuoteSqlName(string name) { var nametrim = name.Trim(); if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) return nametrim; //原生SQL return $"{nametrim.TrimStart('[').TrimEnd(']').Replace("].[", ".").Replace(".[", ".")}"; } - internal override string QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; - internal override string IsNull(string sql, object value) => $"isnull({sql}, {value})"; - internal override string StringConcat(string[] objs, Type[] types) { + public override string QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; + public override string IsNull(string sql, object value) => $"isnull({sql}, {value})"; + public override string StringConcat(string[] objs, Type[] types) { var sb = new StringBuilder(); var news = new string[objs.Length]; for (var a = 0; a < objs.Length; a++) news[a] = types[a] == typeof(string) ? objs[a] : $"cast({objs[a]} as nvarchar)"; return string.Join(" + ", news); } - internal override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}"; + public override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}"; - internal override string QuoteWriteParamter(Type type, string paramterName) => paramterName; - internal override string QuoteReadColumn(Type type, string columnName) => columnName; + public override string QuoteWriteParamter(Type type, string paramterName) => paramterName; + public override string QuoteReadColumn(Type type, string columnName) => columnName; - internal override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) { + public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) { if (value == null) return "NULL"; if (type == typeof(byte[])) { var bytes = value as byte[]; diff --git a/FreeSql/Sqlite/Curd/SqliteDelete.cs b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteDelete.cs similarity index 100% rename from FreeSql/Sqlite/Curd/SqliteDelete.cs rename to Providers/FreeSql.Provider.Sqlite/Curd/SqliteDelete.cs diff --git a/FreeSql/Sqlite/Curd/SqliteInsert.cs b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteInsert.cs similarity index 91% rename from FreeSql/Sqlite/Curd/SqliteInsert.cs rename to Providers/FreeSql.Provider.Sqlite/Curd/SqliteInsert.cs index f10f1ff4..80ec45dc 100644 --- a/FreeSql/Sqlite/Curd/SqliteInsert.cs +++ b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteInsert.cs @@ -21,7 +21,7 @@ namespace FreeSql.Sqlite.Curd { public override Task> ExecuteInsertedAsync() => base.SplitExecuteInsertedAsync(5000, 999); - internal override long RawExecuteIdentity() { + protected override long RawExecuteIdentity() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; @@ -42,7 +42,7 @@ namespace FreeSql.Sqlite.Curd { this.ClearData(); return ret; } - async internal override Task RawExecuteIdentityAsync() { + async protected override Task RawExecuteIdentityAsync() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return 0; @@ -63,14 +63,14 @@ namespace FreeSql.Sqlite.Curd { this.ClearData(); return ret; } - internal override List RawExecuteInserted() { + protected override List RawExecuteInserted() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return new List(); this.RawExecuteAffrows(); return _source; } - async internal override Task> RawExecuteInsertedAsync() { + async protected override Task> RawExecuteInsertedAsync() { var sql = this.ToSql(); if (string.IsNullOrEmpty(sql)) return new List(); diff --git a/FreeSql/Sqlite/Curd/SqliteSelect.cs b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteSelect.cs similarity index 100% rename from FreeSql/Sqlite/Curd/SqliteSelect.cs rename to Providers/FreeSql.Provider.Sqlite/Curd/SqliteSelect.cs diff --git a/FreeSql/Sqlite/Curd/SqliteUpdate.cs b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteUpdate.cs similarity index 94% rename from FreeSql/Sqlite/Curd/SqliteUpdate.cs rename to Providers/FreeSql.Provider.Sqlite/Curd/SqliteUpdate.cs index 39543f8f..0915c757 100644 --- a/FreeSql/Sqlite/Curd/SqliteUpdate.cs +++ b/Providers/FreeSql.Provider.Sqlite/Curd/SqliteUpdate.cs @@ -21,10 +21,10 @@ namespace FreeSql.Sqlite.Curd { public override Task> ExecuteUpdatedAsync() => base.SplitExecuteUpdatedAsync(200, 999); - internal override List RawExecuteUpdated() { + protected override List RawExecuteUpdated() { throw new NotImplementedException(); } - internal override Task> RawExecuteUpdatedAsync() { + protected override Task> RawExecuteUpdatedAsync() { throw new NotImplementedException(); } diff --git a/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj new file mode 100644 index 00000000..66086d68 --- /dev/null +++ b/Providers/FreeSql.Provider.Sqlite/FreeSql.Provider.Sqlite.csproj @@ -0,0 +1,28 @@ + + + + netstandard2.0 + 0.6.1 + true + YeXiangQin + FreeSql 数据库实现,基于 Sqlite 3.0 + https://github.com/2881099/FreeSql + https://github.com/2881099/FreeSql + git + MIT + FreeSql;ORM + $(AssemblyName) + $(AssemblyName) + true + true + + + + + + + + + + + diff --git a/FreeSql/Sqlite/SqliteAdo/SqliteAdo.cs b/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteAdo.cs similarity index 90% rename from FreeSql/Sqlite/SqliteAdo/SqliteAdo.cs rename to Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteAdo.cs index 736002a4..1bc44c5f 100644 --- a/FreeSql/Sqlite/SqliteAdo/SqliteAdo.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteAdo.cs @@ -1,5 +1,4 @@ using FreeSql.Internal; -using Microsoft.Extensions.Logging; using SafeObjectPool; using System; using System.Collections; @@ -10,8 +9,8 @@ using System.Threading; namespace FreeSql.Sqlite { class SqliteAdo : FreeSql.Internal.CommonProvider.AdoProvider { - public SqliteAdo() : base(null, null, DataType.Sqlite) { } - public SqliteAdo(CommonUtils util, ICache cache, ILogger log, string masterConnectionString, string[] slaveConnectionStrings) : base(cache, log, DataType.Sqlite) { + public SqliteAdo() : base(DataType.Sqlite) { } + public SqliteAdo(CommonUtils util, string masterConnectionString, string[] slaveConnectionStrings) : base(DataType.Sqlite) { base._util = util; if (!string.IsNullOrEmpty(masterConnectionString)) MasterPool = new SqliteConnectionPool("主库", masterConnectionString, null, null); diff --git a/FreeSql/Sqlite/SqliteAdo/SqliteConnectionPool.cs b/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteConnectionPool.cs similarity index 98% rename from FreeSql/Sqlite/SqliteAdo/SqliteConnectionPool.cs rename to Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteConnectionPool.cs index 402b9a40..c65580f7 100644 --- a/FreeSql/Sqlite/SqliteAdo/SqliteConnectionPool.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteConnectionPool.cs @@ -88,7 +88,7 @@ namespace FreeSql.Sqlite { Attaches = (idx == -1 ? att[1] : att[1].Substring(0, idx)).Split(','); } - FreeUtil.PrevReheatConnectionPool(_pool, minPoolSize); + FreeSql.Internal.CommonUtils.PrevReheatConnectionPool(_pool, minPoolSize); } } diff --git a/FreeSql/Sqlite/SqliteCodeFirst.cs b/Providers/FreeSql.Provider.Sqlite/SqliteCodeFirst.cs similarity index 100% rename from FreeSql/Sqlite/SqliteCodeFirst.cs rename to Providers/FreeSql.Provider.Sqlite/SqliteCodeFirst.cs diff --git a/FreeSql/Sqlite/SqliteExpression.cs b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs similarity index 95% rename from FreeSql/Sqlite/SqliteExpression.cs rename to Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs index 4af0e9d1..d44576b9 100644 --- a/FreeSql/Sqlite/SqliteExpression.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs @@ -12,7 +12,7 @@ namespace FreeSql.Sqlite { public SqliteExpression(CommonUtils common) : base(common) { } - internal override string ExpressionLambdaToSqlOther(Expression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlOther(Expression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); switch (exp.NodeType) { case ExpressionType.Convert: @@ -132,7 +132,7 @@ namespace FreeSql.Sqlite { return null; } - internal override string ExpressionLambdaToSqlMemberAccessString(MemberExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlMemberAccessString(MemberExpression exp, ExpTSC tsc) { if (exp.Expression == null) { switch (exp.Member.Name) { case "Empty": return "''"; @@ -145,7 +145,7 @@ namespace FreeSql.Sqlite { } return null; } - internal override string ExpressionLambdaToSqlMemberAccessDateTime(MemberExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlMemberAccessDateTime(MemberExpression exp, ExpTSC tsc) { if (exp.Expression == null) { switch (exp.Member.Name) { case "Now": return "datetime(current_timestamp,'localtime')"; @@ -173,7 +173,7 @@ namespace FreeSql.Sqlite { } return null; } - internal override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) { if (exp.Expression == null) { switch (exp.Member.Name) { case "Zero": return "0"; @@ -199,7 +199,7 @@ namespace FreeSql.Sqlite { return null; } - internal override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); if (exp.Object == null) { switch (exp.Method.Name) { @@ -277,7 +277,7 @@ namespace FreeSql.Sqlite { } throw new Exception($"SqliteExpression 未实现函数表达式 {exp} 解析"); } - internal override string ExpressionLambdaToSqlCallMath(MethodCallExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlCallMath(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); switch (exp.Method.Name) { case "Abs": return $"abs({getExp(exp.Arguments[0])})"; @@ -303,7 +303,7 @@ namespace FreeSql.Sqlite { } throw new Exception($"SqliteExpression 未实现函数表达式 {exp} 解析"); } - internal override string ExpressionLambdaToSqlCallDateTime(MethodCallExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlCallDateTime(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); if (exp.Object == null) { switch (exp.Method.Name) { @@ -346,7 +346,7 @@ namespace FreeSql.Sqlite { } throw new Exception($"SqliteExpression 未实现函数表达式 {exp} 解析"); } - internal override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); if (exp.Object == null) { switch (exp.Method.Name) { @@ -376,7 +376,7 @@ namespace FreeSql.Sqlite { } throw new Exception($"SqliteExpression 未实现函数表达式 {exp} 解析"); } - internal override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { + public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); if (exp.Object == null) { switch (exp.Method.Name) { diff --git a/FreeSql/Sqlite/SqliteExtensions.cs b/Providers/FreeSql.Provider.Sqlite/SqliteExtensions.cs similarity index 100% rename from FreeSql/Sqlite/SqliteExtensions.cs rename to Providers/FreeSql.Provider.Sqlite/SqliteExtensions.cs diff --git a/FreeSql/Sqlite/SqliteProvider.cs b/Providers/FreeSql.Provider.Sqlite/SqliteProvider.cs similarity index 77% rename from FreeSql/Sqlite/SqliteProvider.cs rename to Providers/FreeSql.Provider.Sqlite/SqliteProvider.cs index be1bcf45..cfb02e77 100644 --- a/FreeSql/Sqlite/SqliteProvider.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteProvider.cs @@ -1,16 +1,13 @@ using FreeSql.Internal; using FreeSql.Internal.CommonProvider; using FreeSql.Sqlite.Curd; -using Microsoft.Extensions.Caching.Distributed; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Data.Common; namespace FreeSql.Sqlite { - class SqliteProvider : IFreeSql { + public class SqliteProvider : IFreeSql { public ISelect Select() where T1 : class => new SqliteSelect(this, this.InternalCommonUtils, this.InternalCommonExpression, null); public ISelect Select(object dywhere) where T1 : class => new SqliteSelect(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere); @@ -25,17 +22,13 @@ namespace FreeSql.Sqlite { public IAdo Ado { get; } public IAop Aop { get; } - public ICache Cache { get; } public ICodeFirst CodeFirst { get; } public IDbFirst DbFirst => null; - public SqliteProvider(IDistributedCache cache, ILogger log, string masterConnectionString, string[] slaveConnectionString) { - if (log == null) log = new LoggerFactory(new[] { new Microsoft.Extensions.Logging.Debug.DebugLoggerProvider() }).CreateLogger("FreeSql.Sqlite"); - + public SqliteProvider(string masterConnectionString, string[] slaveConnectionString) { this.InternalCommonUtils = new SqliteUtils(this); this.InternalCommonExpression = new SqliteExpression(this.InternalCommonUtils); - this.Cache = new CacheProvider(cache, log); - this.Ado = new SqliteAdo(this.InternalCommonUtils, this.Cache, log, masterConnectionString, slaveConnectionString); + this.Ado = new SqliteAdo(this.InternalCommonUtils, masterConnectionString, slaveConnectionString); this.Aop = new AopProvider(); this.CodeFirst = new SqliteCodeFirst(this, this.InternalCommonUtils, this.InternalCommonExpression); @@ -55,7 +48,6 @@ namespace FreeSql.Sqlite { public void Dispose() { if (_isdisposed) return; (this.Ado as AdoProvider).Dispose(); - (this.Cache as CacheProvider)?.Dispose(); } } } diff --git a/FreeSql/Sqlite/SqliteUtils.cs b/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs similarity index 64% rename from FreeSql/Sqlite/SqliteUtils.cs rename to Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs index 5d7c13e8..dc3e633c 100644 --- a/FreeSql/Sqlite/SqliteUtils.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteUtils.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Data; using System.Data.Common; using System.Data.SQLite; +using System.Linq.Expressions; using System.Text; namespace FreeSql.Sqlite { @@ -13,7 +14,7 @@ namespace FreeSql.Sqlite { public SqliteUtils(IFreeSql orm) : base(orm) { } - internal override DbParameter AppendParamter(List _params, string parameterName, Type type, object value) { + public override DbParameter AppendParamter(List _params, string parameterName, Type type, object value) { if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}"; var dbtype = (DbType)_orm.CodeFirst.GetDbInfo(type)?.type; switch (dbtype) { @@ -33,7 +34,7 @@ namespace FreeSql.Sqlite { return ret; } - internal override DbParameter[] GetDbParamtersByObject(string sql, object obj) => + public override DbParameter[] GetDbParamtersByObject(string sql, object obj) => Utils.GetDbParamtersByObject(sql, obj, "@", (name, type, value) => { var dbtype = (DbType)_orm.CodeFirst.GetDbInfo(type)?.type; switch (dbtype) { @@ -52,28 +53,28 @@ namespace FreeSql.Sqlite { return ret; }); - internal override string FormatSql(string sql, params object[] args) => sql?.FormatSqlite(args); - internal override string QuoteSqlName(string name) { + public override string FormatSql(string sql, params object[] args) => sql?.FormatSqlite(args); + public override string QuoteSqlName(string name) { var nametrim = name.Trim(); if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) return nametrim; //原生SQL return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\""; } - internal override string TrimQuoteSqlName(string name) { + public override string TrimQuoteSqlName(string name) { var nametrim = name.Trim(); if (nametrim.StartsWith("(") && nametrim.EndsWith(")")) return nametrim; //原生SQL return $"{nametrim.Trim('"').Replace("\".\"", ".").Replace(".\"", ".")}"; } - internal override string QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; - internal override string IsNull(string sql, object value) => $"ifnull({sql}, {value})"; - internal override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}"; - internal override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}"; + public override string QuoteParamterName(string name) => $"@{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}"; + public override string IsNull(string sql, object value) => $"ifnull({sql}, {value})"; + public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}"; + public override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}"; - internal override string QuoteWriteParamter(Type type, string paramterName) => paramterName; - internal override string QuoteReadColumn(Type type, string columnName) => columnName; + public override string QuoteWriteParamter(Type type, string paramterName) => paramterName; + public override string QuoteReadColumn(Type type, string columnName) => columnName; - internal override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) { + public override string GetNoneParamaterSqlValue(List specialParams, Type type, object value) { if (value == null) return "NULL"; if (type == typeof(byte[])) value = Encoding.UTF8.GetString(value as byte[]); return FormatSql("{0}", value, 1); diff --git a/Templates/MySql/include/enumtype.tpl b/Templates/MySql/include/enumtype.tpl deleted file mode 100644 index 81467c5c..00000000 --- a/Templates/MySql/include/enumtype.tpl +++ /dev/null @@ -1,71 +0,0 @@ -{% -var dbf = dbfirst as FreeSql.IDbFirst; -var fks = (table.Foreigns as List); - -Func UString = stra => stra.Substring(0, 1).ToUpper() + stra.Substring(1); -Func GetCsType = cola3 => { - if (cola3.DbType == (int)MySql.Data.MySqlClient.MySqlDbType.Enum || cola3.DbType == (int)MySql.Data.MySqlClient.MySqlDbType.Set) { - return $"{UString(cola3.Table.Name)}{cola3.Name.ToUpper()}{(cola3.IsNullable ? "?" : "")}"; - } - return dbf.GetCsType(cola3); -}; -Func GetFkObjectName = fkx => { - var eqfks = fks.Where(fk22a => fk22a.ReferencedTable.Name == fkx.ReferencedTable.Name); - if (eqfks.Count() == 1) return "Obj_" + fkx.ReferencedTable.Name; - var fkretname = fkx.Columns[0].Name; - if (fkretname.EndsWith(fkx.ReferencedColumns[0].Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(0, fkretname.Length - fkx.ReferencedColumns[0].Name.Length).TrimEnd('_'); - if (fkretname.EndsWith(fkx.ReferencedTable.Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(0, fkretname.Length - fkx.ReferencedTable.Name.Length).TrimEnd('_'); - if (fkretname.StartsWith(fkx.ReferencedTable.Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(fkx.ReferencedTable.Name.Length).TrimStart('_'); - return "Obj_" + fkx.ReferencedTable.Name + (string.IsNullOrEmpty(fkretname) ? "" : ("_" + fkretname)); -}; - - - foreach (var col11 in table.Columns) { - if (col11.DbType == (int)MySql.Data.MySqlClient.MySqlDbType.Enum || col11.DbType == (int)MySql.Data.MySqlClient.MySqlDbType.Set) { - if (col11.DbType == (int)MySql.Data.MySqlClient.MySqlDbType.Set) print("\r\n\t[Flags]"); - print($"\r\n\tpublic enum {UString(table.Name)}{col11.Name.ToUpper()}"); - if (col11.DbType == (int)MySql.Data.MySqlClient.MySqlDbType.Set) print(" : long"); - print (" {\r\n\t\t"); - - string slkdgjlksdjg = ""; - int field_idx = 0; - int unknow_idx = 0; - string exp2 = string.Concat(col11.DbTypeTextFull); - int quote_pos = -1; - while (true) { - int first_pos = quote_pos = exp2.IndexOf('\'', quote_pos + 1); - if (quote_pos == -1) break; - while (true) { - quote_pos = exp2.IndexOf('\'', quote_pos + 1); - if (quote_pos == -1) break; - int r_cout = 0; - //for (int p = 1; true; p++) { - // if (exp2[quote_pos - p] == '\\') r_cout++; - // else break; - //} - while(exp2[++quote_pos] == '\'') r_cout++; - if (r_cout % 2 == 0/* && quote_pos - first_pos > 2*/) { - string str2 = exp2.Substring(first_pos + 1, quote_pos - first_pos - 2).Replace("''", "'"); - if (Regex.IsMatch(str2, @"^[\u0391-\uFFE5a-zA-Z_\$][\u0391-\uFFE5a-zA-Z_\$\d]*$")) - slkdgjlksdjg += ", " + str2; - else - slkdgjlksdjg += string.Format(@", -/// -/// {0} -/// -[Description(""{0}"")] -Unknow{1}", str2.Replace("\"", "\\\""), ++unknow_idx); - if (col11.DbType == (int)MySql.Data.MySqlClient.MySqlDbType.Set) - slkdgjlksdjg += " = " + Math.Pow(2, field_idx++); - if (col11.DbType == (int)MySql.Data.MySqlClient.MySqlDbType.Enum && field_idx++ == 0) - slkdgjlksdjg += " = 1"; - break; - } - } - if (quote_pos == -1) break; - } - print(slkdgjlksdjg.Substring(2).TrimStart('\r', '\n', '\t')); - print("\r\n\t}"); - } - } -%} \ No newline at end of file diff --git a/Templates/MySql/rich-entity-navigation-object/Const.cs b/Templates/MySql/rich-entity-navigation-object/Const.cs deleted file mode 100644 index b959c3dc..00000000 --- a/Templates/MySql/rich-entity-navigation-object/Const.cs +++ /dev/null @@ -1,5 +0,0 @@ -public static class Const { - public static IFreeSql mysql = new FreeSql.FreeSqlBuilder() - .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10") - .Build(); -} diff --git a/Templates/MySql/rich-entity-navigation-object/Model/for-table.cs.freesql b/Templates/MySql/rich-entity-navigation-object/Model/for-table.cs.freesql deleted file mode 100644 index 41b88c1f..00000000 --- a/Templates/MySql/rich-entity-navigation-object/Model/for-table.cs.freesql +++ /dev/null @@ -1,240 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.ComponentModel; -using System.Linq; -using System.Reflection; -using System.Threading.Tasks; -using Newtonsoft.Json; -using FreeSql; -using FreeSql.DataAnnotations; -{% -var dbf = dbfirst as FreeSql.IDbFirst; -var cols = (table.Columns as List); -var pks = (table.Primarys as List); -var fks = (table.Foreigns as List); - -Func UString = stra => stra.Substring(0, 1).ToUpper() + stra.Substring(1); -Func GetCsType = cola3 => { - if (cola3.DbType == (int)MySql.Data.MySqlClient.MySqlDbType.Enum || cola3.DbType == (int)MySql.Data.MySqlClient.MySqlDbType.Set) { - return $"{UString(cola3.Table.Name)}{cola3.Name.ToUpper()}{(cola3.IsNullable ? "?" : "")}"; - } - return dbf.GetCsType(cola3); -}; -Func GetFkObjectName = fkx => { - var eqfks = fks.Where(fk22a => fk22a.ReferencedTable.Name == fkx.ReferencedTable.Name); - if (eqfks.Count() == 1) return "Obj_" + fkx.ReferencedTable.Name; - var fkretname = fkx.Columns[0].Name; - if (fkretname.EndsWith(fkx.ReferencedColumns[0].Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(0, fkretname.Length - fkx.ReferencedColumns[0].Name.Length).TrimEnd('_'); - if (fkretname.EndsWith(fkx.ReferencedTable.Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(0, fkretname.Length - fkx.ReferencedTable.Name.Length).TrimEnd('_'); - if (fkretname.StartsWith(fkx.ReferencedTable.Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(fkx.ReferencedTable.Name.Length).TrimStart('_'); - return "Obj_" + fkx.ReferencedTable.Name + (string.IsNullOrEmpty(fkretname) ? "" : ("_" + fkretname)); -}; - -%} -namespace test.Model { - - [JsonObject(MemberSerialization.OptIn), Table(Name = "{#!string.IsNullOrEmpty(table.Schema) ? table.Schema + "." : ""}{#table.Name}"{if cols.Where(cola003 => cola003.Name.ToLower() == "is_deleted" || cola003.Name.ToLower() == "isdeleted").Any()}, SelectFilter = "a.IsDeleted = 1"{/if})] - public partial class {#UString(table.Name)} {{for col,index in table.Columns}{% - var findfks = fks.Where(fkaa => fkaa.Columns.Where(fkaac1 => fkaac1.Name == col.Name).Any()); - %}{if findfks.Any() == false} - {if string.IsNullOrEmpty(col.Coment) == false}/// - /// {#col.Coment.Replace("\r\n", "\n").Replace("\n", "\r\n /// ")} - /// {/if} - [JsonProperty, Column(Name = "{#col.Name}", DbType = "{#col.DbTypeTextFull}"{if col.IsPrimary == true}, IsPrimary = true{/if}{if col.IsIdentity == true}, IsIdentity = true{/if}{if col.IsNullable == true}, IsNullable = true{/if})] - public {#GetCsType(col)} {#UString(col.Name)} { get; set; } - {else} - private {#GetCsType(col)} _{#UString(col.Name)}; - {if string.IsNullOrEmpty(col.Coment) == false}/// - /// {#col.Coment.Replace("\r\n", "\n").Replace("\n", "\r\n /// ")} - /// {/if} - [JsonProperty, Column(Name = "{#col.Name}", DbType = "{#col.DbTypeTextFull}"{if col.IsPrimary == true}, IsPrimary = true{/if}{if col.IsIdentity == true}, IsIdentity = true{/if}{if col.IsNullable == true}, IsNullable = true{/if})] - public {#GetCsType(col)} {#UString(col.Name)} { get => _{#UString(col.Name)}; set { - if (_{#UString(col.Name)} == value) return; - _{#UString(col.Name)} = value;{for fkcok2 in findfks} - {#GetFkObjectName(fkcok2)} = null;{/for} - } } - {/if}{/for}{for fk in fks} - public {#UString(fk.ReferencedTable.Name)} {#GetFkObjectName(fk)} { get; set; } - {/for} - internal static IFreeSql freesql => Const.mysql; - public static ISelect<{#UString(table.Name)}> Select => freesql.Select<{#UString(table.Name)}>(); -{if (table.Uniques.Count > 0)} - public static int ItemCacheTimeout = 180;{for uk001 in table.Uniques}{% - - string parms = string.Empty; - string parmsByWhereLambda = string.Empty; - string parmsBy = "By"; - string parmsNodeTypeUpdateCacheRemove = string.Empty; - foreach (var uk001col in uk001) { - string getcstype = GetCsType(uk001col); - parms += getcstype.Replace("?", "") + " " + UString(uk001col.Name) + ", "; - parmsByWhereLambda += "a." + UString(uk001col.Name) + " == " + UString(uk001col.Name) + " && "; - parmsBy += UString(uk001col.Name) + "And"; - parmsNodeTypeUpdateCacheRemove += "item." + UString(uk001col.Name) + ", \"_,_\", "; - } - parms = parms.Substring(0, parms.Length - 2); - parmsByWhereLambda = parmsByWhereLambda.Substring(0, parmsByWhereLambda.Length - 4); - parmsBy = parmsBy.Substring(0, parmsBy.Length - 3); - parmsNodeTypeUpdateCacheRemove = parmsNodeTypeUpdateCacheRemove.Substring(0, parmsNodeTypeUpdateCacheRemove.Length - 9); - %} - public static {#UString(table.Name)} GetItem{#uk001[0].IsPrimary ? string.Empty : parmsBy}({#parms}) => Select.Where(a => {#parmsByWhereLambda}).Caching(ItemCacheTimeout, string.Concat("test:{#table.Name}{#uk001[0].IsPrimary ? string.Empty : parmsBy}:", {#parmsNodeTypeUpdateCacheRemove.Replace("item.", "")})).ToOne();{/for} -{for uk001 in table.Uniques}{% - - string parms = string.Empty; - string parmsByWhereLambda = string.Empty; - string parmsNewItem = string.Empty; - string parmsBy = "By"; - string parmsNoneType = string.Empty; - foreach (var uk001col in uk001) { - string getcstype = GetCsType(uk001col); - parms += getcstype.Replace("?", "") + " " + UString(uk001col.Name) + ", "; - parmsByWhereLambda += "a." + UString(uk001col.Name) + " == " + UString(uk001col.Name) + " && "; - parmsNewItem += UString(uk001col.Name) + " = " + UString(uk001col.Name) + ", "; - parmsBy += UString(uk001col.Name) + "And"; - parmsNoneType += UString(uk001col.Name) + ", "; - } - parms = parms.Substring(0, parms.Length - 2); - parmsByWhereLambda = parmsByWhereLambda.Substring(0, parmsByWhereLambda.Length - 4); - parmsNewItem = parmsNewItem.Substring(0, parmsNewItem.Length - 2); - parmsBy = parmsBy.Substring(0, parmsBy.Length - 3); - parmsNoneType = parmsNoneType.Substring(0, parmsNoneType.Length - 2); - %} - public static long Delete{#uk001[0].IsPrimary ? string.Empty : parmsBy}({#parms}) { - var affrows = freesql.Delete<{#UString(table.Name)}>().Where(a => {#parmsByWhereLambda}).ExecuteAffrows();{if table.Uniques.Count > 1} - if (ItemCacheTimeout > 0) RemoveCache(GetItem{#uk001[0].IsPrimary ? string.Empty : parmsBy}({#parmsNoneType}));{else} - if (ItemCacheTimeout > 0) RemoveCache(new {#UString(table.Name)} { {#parmsNewItem} });{/if} - return affrows; - }{/for} -{for fkcoldel in fks}{% - string parms = string.Empty; - string parmsBy = "By"; - string parmsByWhereLambda = string.Empty; - foreach( var fkcoldelcol in fkcoldel.Columns) { - string getcstype = GetCsType(fkcoldelcol); - parms += getcstype.Replace("?", "") + " " + UString(fkcoldelcol.Name) + ", "; - parmsBy += UString(fkcoldelcol.Name) + "And"; - parmsByWhereLambda += "a." + UString(fkcoldelcol.Name) + " == " + UString(fkcoldelcol.Name) + " && "; - } - parms = parms.Substring(0, parms.Length - 2); - parmsBy = parmsBy.Substring(0, parmsBy.Length - 3); - parmsByWhereLambda = parmsByWhereLambda.Substring(0, parmsByWhereLambda.Length - 4); - %} - public static long DeleteBy{#parmsBy}({#parms}) { - return freesql.Delete<{#UString(table.Name)}>().Where(a => {#parmsByWhereLambda}).ExecuteAffrows(); //删除缓存 - } -{/for}{% string redisRemoveCode = string.Empty; %}{for uk001 in table.Uniques}{% - - string parmsBy = "By"; - string parmsNodeTypeUpdateCacheRemove = string.Empty; - foreach (var uk001col in uk001) { - parmsBy += UString(uk001col.Name) + "And"; - parmsNodeTypeUpdateCacheRemove += "item." + UString(uk001col.Name) + ", \"_,_\", "; - } - parmsBy = parmsBy.Substring(0, parmsBy.Length - 3); - parmsNodeTypeUpdateCacheRemove = parmsNodeTypeUpdateCacheRemove.Substring(0, parmsNodeTypeUpdateCacheRemove.Length - 9); - redisRemoveCode += $@" - keys[keysIdx++] = string.Concat(""test:{table.Name}{(uk001[0].IsPrimary ? string.Empty : parmsBy)}:"", {parmsNodeTypeUpdateCacheRemove});"; - %}{/for} - internal static void RemoveCache({#UString(table.Name)} item) => RemoveCache(item == null ? null : new [] { item }); - internal static void RemoveCache(IEnumerable<{#UString(table.Name)}> items) { - if (ItemCacheTimeout <= 0 || items == null || items.Any() == false) return; - var keys = new string[items.Count() * {#table.Uniques.Count}]; - var keysIdx = 0; - foreach (var item in items) {{#redisRemoveCode} - } - if (freesql.Ado.TransactionCurrentThread != null) freesql.Ado.TransactionPreRemoveCache(keys); - else freesql.Cache.Remove(keys); - } -{if (table.Columns.Count < 100)}{% - string CsParam3 = string.Empty; - string CsParamNoType3 = string.Empty; - string parms = string.Empty; - string parmsByWhereLambda = string.Empty; - string parmsNewItem = string.Empty; - string parmsBy = "By"; - string parmsNoneType = string.Empty; - var idens = 0; - var idensCol = table.Columns[0]; - foreach (var uk001col in table.Columns) { - string getcstype = GetCsType(uk001col); - parms += getcstype.Replace("?", "") + " " + UString(uk001col.Name) + ", "; - if (uk001col.IsPrimary) - parmsByWhereLambda += "a." + UString(uk001col.Name) + " == " + UString(uk001col.Name) + " && "; - parmsNewItem += UString(uk001col.Name) + " = " + UString(uk001col.Name) + ", "; - parmsBy += UString(uk001col.Name) + "And"; - parmsNoneType += UString(uk001col.Name) + ", "; - if (uk001col.IsIdentity) { - idens++; - idensCol = uk001col; - } else { - if (getcstype.StartsWith("DateTime") && (uk001col.Name.ToLower() == "create_time" || uk001col.Name.ToLower() == "update_time" || uk001col.Name.ToLower() == "createtime" || uk001col.Name.ToLower() == "updatetime") || - getcstype == "bool?" && (uk001col.Name.ToLower() == "is_deleted" || uk001col.Name.ToLower() == "isdeleted")) { - - } else { - CsParam3 += getcstype + " " + UString(uk001col.Name) + ", "; - CsParamNoType3 += string.Format("\r\n {0} = {0}, ", UString(uk001col.Name)); - } - } - } - parms = parms.Substring(0, parms.Length - 2); - if (parmsByWhereLambda.Length > 0) parmsByWhereLambda = parmsByWhereLambda.Substring(0, parmsByWhereLambda.Length - 4); - parmsNewItem = parmsNewItem.Substring(0, parmsNewItem.Length - 2); - parmsBy = parmsBy.Substring(0, parmsBy.Length - 3); - parmsNoneType = parmsNoneType.Substring(0, parmsNoneType.Length - 2); - if (CsParam3.Length > 0) CsParam3 = CsParam3.Substring(0, CsParam3.Length - 2); - if (CsParamNoType3.Length > 0) CsParamNoType3 = CsParamNoType3.Substring(0, CsParamNoType3.Length - 2); - %}{if idens > 0} - public static {#GetCsType(idensCol)} Insert({#UString(table.Name)} item) { - item.{#UString(idensCol.Name)} = ({#GetCsType(idensCol)})freesql.Insert<{#UString(table.Name)}>().AppendData(item).ExecuteIdentity(); - if (ItemCacheTimeout > 0) RemoveCache(item); - return item.{#UString(idensCol.Name)}; - }{else} - public static void Insert({#UString(table.Name)} item) { - if (ItemCacheTimeout > 0) RemoveCache(item); - freesql.Insert<{#UString(table.Name)}>().AppendData(item).ExecuteAffrows(); - } - public static long Insert(IEnumerable<{#UString(table.Name)}> items) { - if (ItemCacheTimeout > 0) RemoveCache(items); - return freesql.Insert<{#UString(table.Name)}>().AppendData(items).ExecuteAffrows(); - }{/if} - {if CsParamNoType3.Split('=').Length <= 5}{if idens > 0} - public static {#GetCsType(idensCol)} Insert({#CsParam3}) { - var item = new {#UString(table.Name)} {{#CsParamNoType3}}; - item.{#UString(idensCol.Name)} = ({#GetCsType(idensCol)})freesql.Insert<{#UString(table.Name)}>().AppendData(new {#UString(table.Name)} {{#CsParamNoType3}}).ExecuteIdentity(); - if (ItemCacheTimeout > 0) RemoveCache(item); - return item.{#UString(idensCol.Name)}; - }{else} - public static {#UString(table.Name)} Insert({#CsParam3}) { - var item = new {#UString(table.Name)} {{#CsParamNoType3}}; - freesql.Insert<{#UString(table.Name)}>().AppendData(item).ExecuteAffrows(); - if (ItemCacheTimeout > 0) RemoveCache(item); - return item; - }{/if}{/if} - public static long Update({#UString(table.Name)} item) { - if (ItemCacheTimeout > 0) RemoveCache(item); - return freesql.Update<{#UString(table.Name)}>().SetSource(item).ExecuteAffrows(); - } - public static long Update(IEnumerable<{#UString(table.Name)}> items) { - if (ItemCacheTimeout > 0) RemoveCache(items); - return freesql.Update<{#UString(table.Name)}>().SetSource(items).ExecuteAffrows(); - } - /// - /// 指定字段更新 - /// - public IUpdate<{#UString(table.Name)}> UpdateDiy => freesql.Update<{#UString(table.Name)}>().Where(a => {#parmsByWhereLambda}); - /// - /// {if pks.Count > 0}保存或添加,如果主键有值则尝试 Update,如果影响的行为 0 则尝试 Insert{else}添加{/if} - /// - public void Save() {{if pks.Count > 0} - if ({#string.Join(" && ", pks.Select(pkssa => "this." + UString(pkssa.Name) + " != default(" + GetCsType(pkssa) + ")"))}) { - var affrows = freesql.Update<{#UString(table.Name)}>().Where(a => {#parmsByWhereLambda}).ExecuteAffrows(); - if (affrows > 0) return; - }{/if} - {if idens > 0}this.{#UString(idensCol.Name)} = {#GetCsType(idensCol).Replace("?", "") == "long" ? "" : ("(" + GetCsType(idensCol) + ")")}freesql.Insert<{#UString(table.Name)}>().AppendData(this).ExecuteIdentity();{else} - freesql.Insert<{#UString(table.Name)}>().AppendData(this).ExecuteAffrows();{/if} - } -{/if}{/if} - } -{include ../../include/enumtype.tpl} -} \ No newline at end of file diff --git a/Templates/MySql/rich-entity-navigation-object/readme.md b/Templates/MySql/rich-entity-navigation-object/readme.md deleted file mode 100644 index 96c9adcf..00000000 --- a/Templates/MySql/rich-entity-navigation-object/readme.md +++ /dev/null @@ -1,94 +0,0 @@ -# 生成器 - -生成器是基于 dbfirst 开发的辅助工具,适用老项目一键生成实体。生成器采用模板的方式,作者实现了三种生成模板: - -| 模板名称 | 类型映射 | 外键导航属性 | 缓存管理 | 失血 | 贫血 | 充血 | -| ------------- | - | - |- | - |- | - | -| simple-entity | √ | X | X | √ | X | X | -| simple-entity-navigation-object | √ | √ | X | √ | X | X | -| rich-entity-navigation-object | √ | √ | √ | X | √ | X | - -模板在项目目录:/Templates/MySql - -> 更多模板逐步开发中。。。 - -```csharp -//定义 mysql FreeSql -var mysql = new FreeSql.FreeSqlBuilder() - .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10") - .Build(); - -//创建模板生成类实现 -var gen = new FreeSql.Generator.TemplateGenerator(); -gen.Build(mysql.DbFirst, - @"C:\Users\28810\Desktop\github\FreeSql\Templates\MySql\simple-entity", //模板目录(事先下载) - @"C:\Users\28810\Desktop\新建文件夹 (9)", //生成后保存的目录 - "cccddd" //数据库 -); -``` - -## 模板语法 - -```html - - -{#title} - - - - -{#表达式} -{##表达式} 当表达式可能发生runtime错误时使用,性能没有上面的高 - - -{include ../header.html} -
-

aaa

-

bbb {#i}

-

ccc {#i}

-
- - -{module module_name1 parms1, 2, 3...} -{/module} -{module module_name2 parms1, 2, 3...} -{/module} - - -{import ../module.html as myname} -{#myname.module_name(parms1, 2, 3...)} - - -{extends ../inc/layout.html} -{block body}{/block} - - -{% -for (var a = 0; a < 100; a++) - print(a); -%} - - -{if i === 50} -{elseif i > 60} -{else} -{/if} - - -{for i 1,101} 可自定义名 {for index2 表达式1 in 表达式2} - -{for item,index in items} 可选参数称 index - 可自定义名 {for item2, index99 in 数组表达式} - -{for key,item,index on json} 可选参数 item, index, - 可自定义名 {for key2, item2, index99 in 对象表达式} -{/for} - - -{miss} -此块内容不被bmw.js解析 -{/miss} - - - -``` \ No newline at end of file diff --git a/Templates/MySql/simple-entity-navigation-object/Model/for-table.cs.freesql b/Templates/MySql/simple-entity-navigation-object/Model/for-table.cs.freesql deleted file mode 100644 index 7be41bf1..00000000 --- a/Templates/MySql/simple-entity-navigation-object/Model/for-table.cs.freesql +++ /dev/null @@ -1,59 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Threading.Tasks; -using Newtonsoft.Json; -using FreeSql.DataAnnotations; -{% -var dbf = dbfirst as FreeSql.IDbFirst; -var cols = (table.Columns as List); -var pks = (table.Primarys as List); -var fks = (table.Foreigns as List); - -Func UString = stra => stra.Substring(0, 1).ToUpper() + stra.Substring(1); -Func GetCsType = cola3 => { - if (cola3.DbType == (int)MySql.Data.MySqlClient.MySqlDbType.Enum || cola3.DbType == (int)MySql.Data.MySqlClient.MySqlDbType.Set) { - return $"{UString(cola3.Table.Name)}{cola3.Name.ToUpper()}{(cola3.IsNullable ? "?" : "")}"; - } - return dbf.GetCsType(cola3); -}; -Func GetFkObjectName = fkx => { - var eqfks = fks.Where(fk22a => fk22a.ReferencedTable.Name == fkx.ReferencedTable.Name); - if (eqfks.Count() == 1) return "Obj_" + fkx.ReferencedTable.Name; - var fkretname = fkx.Columns[0].Name; - if (fkretname.EndsWith(fkx.ReferencedColumns[0].Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(0, fkretname.Length - fkx.ReferencedColumns[0].Name.Length).TrimEnd('_'); - if (fkretname.EndsWith(fkx.ReferencedTable.Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(0, fkretname.Length - fkx.ReferencedTable.Name.Length).TrimEnd('_'); - if (fkretname.StartsWith(fkx.ReferencedTable.Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(fkx.ReferencedTable.Name.Length).TrimStart('_'); - return "Obj_" + fkx.ReferencedTable.Name + (string.IsNullOrEmpty(fkretname) ? "" : ("_" + fkretname)); -}; -%} -namespace test.Model { - - [JsonObject(MemberSerialization.OptIn), Table(Name = "{#!string.IsNullOrEmpty(table.Schema) ? table.Schema + "." : ""}{#table.Name}"{if cols.Where(cola003 => cola003.Name.ToLower() == "is_deleted" || cola003.Name.ToLower() == "isdeleted").Any()}, SelectFilter = "a.IsDeleted = 1"{/if})] - public partial class {#UString(table.Name)} {{for col,index in table.Columns}{% - var findfks = fks.Where(fkaa => fkaa.Columns.Where(fkaac1 => fkaac1.Name == col.Name).Any()); - %}{if findfks.Any() == false} - {if string.IsNullOrEmpty(col.Coment) == false}/// - /// {#col.Coment.Replace("\r\n", "\n").Replace("\n", "\r\n /// ")} - /// {/if} - [JsonProperty, Column(Name = "{#col.Name}", DbType = "{#col.DbTypeTextFull}"{if col.IsPrimary == true}, IsPrimary = true{/if}{if col.IsIdentity == true}, IsIdentity = true{/if}{if col.IsNullable == true}, IsNullable = true{/if})] - public {#GetCsType(col)} {#UString(col.Name)} { get; set; } - {else} - private {#GetCsType(col)} _{#UString(col.Name)}; - {if string.IsNullOrEmpty(col.Coment) == false}/// - /// {#col.Coment.Replace("\r\n", "\n").Replace("\n", "\r\n /// ")} - /// {/if} - [JsonProperty, Column(Name = "{#col.Name}", DbType = "{#col.DbTypeTextFull}"{if col.IsPrimary == true}, IsPrimary = true{/if}{if col.IsIdentity == true}, IsIdentity = true{/if}{if col.IsNullable == true}, IsNullable = true{/if})] - public {#GetCsType(col)} {#UString(col.Name)} { get => _{#UString(col.Name)}; set { - if (_{#UString(col.Name)} == value) return; - _{#UString(col.Name)} = value;{for fkcok2 in findfks} - {#GetFkObjectName(fkcok2)} = null;{/for} - } } - {/if}{/for}{for fk in fks} - public {#UString(fk.ReferencedTable.Name)} {#GetFkObjectName(fk)} { get; set; } - {/for} - } -{include ../../include/enumtype.tpl} -} \ No newline at end of file diff --git a/Templates/MySql/simple-entity-navigation-object/readme.md b/Templates/MySql/simple-entity-navigation-object/readme.md deleted file mode 100644 index 96c9adcf..00000000 --- a/Templates/MySql/simple-entity-navigation-object/readme.md +++ /dev/null @@ -1,94 +0,0 @@ -# 生成器 - -生成器是基于 dbfirst 开发的辅助工具,适用老项目一键生成实体。生成器采用模板的方式,作者实现了三种生成模板: - -| 模板名称 | 类型映射 | 外键导航属性 | 缓存管理 | 失血 | 贫血 | 充血 | -| ------------- | - | - |- | - |- | - | -| simple-entity | √ | X | X | √ | X | X | -| simple-entity-navigation-object | √ | √ | X | √ | X | X | -| rich-entity-navigation-object | √ | √ | √ | X | √ | X | - -模板在项目目录:/Templates/MySql - -> 更多模板逐步开发中。。。 - -```csharp -//定义 mysql FreeSql -var mysql = new FreeSql.FreeSqlBuilder() - .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10") - .Build(); - -//创建模板生成类实现 -var gen = new FreeSql.Generator.TemplateGenerator(); -gen.Build(mysql.DbFirst, - @"C:\Users\28810\Desktop\github\FreeSql\Templates\MySql\simple-entity", //模板目录(事先下载) - @"C:\Users\28810\Desktop\新建文件夹 (9)", //生成后保存的目录 - "cccddd" //数据库 -); -``` - -## 模板语法 - -```html - - -{#title} - - - - -{#表达式} -{##表达式} 当表达式可能发生runtime错误时使用,性能没有上面的高 - - -{include ../header.html} -
-

aaa

-

bbb {#i}

-

ccc {#i}

-
- - -{module module_name1 parms1, 2, 3...} -{/module} -{module module_name2 parms1, 2, 3...} -{/module} - - -{import ../module.html as myname} -{#myname.module_name(parms1, 2, 3...)} - - -{extends ../inc/layout.html} -{block body}{/block} - - -{% -for (var a = 0; a < 100; a++) - print(a); -%} - - -{if i === 50} -{elseif i > 60} -{else} -{/if} - - -{for i 1,101} 可自定义名 {for index2 表达式1 in 表达式2} - -{for item,index in items} 可选参数称 index - 可自定义名 {for item2, index99 in 数组表达式} - -{for key,item,index on json} 可选参数 item, index, - 可自定义名 {for key2, item2, index99 in 对象表达式} -{/for} - - -{miss} -此块内容不被bmw.js解析 -{/miss} - - - -``` \ No newline at end of file diff --git a/Templates/MySql/simple-entity/Model/for-table.cs.freesql b/Templates/MySql/simple-entity/Model/for-table.cs.freesql deleted file mode 100644 index aa7e88fd..00000000 --- a/Templates/MySql/simple-entity/Model/for-table.cs.freesql +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Threading.Tasks; -using Newtonsoft.Json; -using FreeSql.DataAnnotations; -{% -var dbf = dbfirst as FreeSql.IDbFirst; -var cols = (table.Columns as List); - -Func UString = stra => stra.Substring(0, 1).ToUpper() + stra.Substring(1); -Func GetCsType = cola3 => { - if (cola3.DbType == (int)MySql.Data.MySqlClient.MySqlDbType.Enum || cola3.DbType == (int)MySql.Data.MySqlClient.MySqlDbType.Set) { - return $"{UString(cola3.Table.Name)}{cola3.Name.ToUpper()}{(cola3.IsNullable ? "?" : "")}"; - } - return dbf.GetCsType(cola3); -}; -%} -namespace test.Model { - - [JsonObject(MemberSerialization.OptIn), Table(Name = "{#!string.IsNullOrEmpty(table.Schema) ? table.Schema + "." : ""}{#table.Name}"{if cols.Where(cola003 => cola003.Name.ToLower() == "is_deleted" || cola003.Name.ToLower() == "isdeleted").Any()}, SelectFilter = "a.IsDeleted = 1"{/if})] - public partial class {#UString(table.Name)} {{for col,index in table.Columns} - {if string.IsNullOrEmpty(col.Coment) == false}/// - /// {#col.Coment.Replace("\r\n", "\n").Replace("\n", "\r\n /// ")} - /// {/if} - [JsonProperty, Column(Name = "{#col.Name}", DbType = "{#col.DbTypeTextFull}"{if col.IsPrimary == true}, IsPrimary = true{/if}{if col.IsIdentity == true}, IsIdentity = true{/if}{if col.IsNullable == true}, IsNullable = true{/if})] - public {#GetCsType(col)} {#UString(col.Name)} { get; set; } - {/for} - } -{include ../../include/enumtype.tpl} -} \ No newline at end of file diff --git a/Templates/MySql/simple-entity/readme.md b/Templates/MySql/simple-entity/readme.md deleted file mode 100644 index 96c9adcf..00000000 --- a/Templates/MySql/simple-entity/readme.md +++ /dev/null @@ -1,94 +0,0 @@ -# 生成器 - -生成器是基于 dbfirst 开发的辅助工具,适用老项目一键生成实体。生成器采用模板的方式,作者实现了三种生成模板: - -| 模板名称 | 类型映射 | 外键导航属性 | 缓存管理 | 失血 | 贫血 | 充血 | -| ------------- | - | - |- | - |- | - | -| simple-entity | √ | X | X | √ | X | X | -| simple-entity-navigation-object | √ | √ | X | √ | X | X | -| rich-entity-navigation-object | √ | √ | √ | X | √ | X | - -模板在项目目录:/Templates/MySql - -> 更多模板逐步开发中。。。 - -```csharp -//定义 mysql FreeSql -var mysql = new FreeSql.FreeSqlBuilder() - .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10") - .Build(); - -//创建模板生成类实现 -var gen = new FreeSql.Generator.TemplateGenerator(); -gen.Build(mysql.DbFirst, - @"C:\Users\28810\Desktop\github\FreeSql\Templates\MySql\simple-entity", //模板目录(事先下载) - @"C:\Users\28810\Desktop\新建文件夹 (9)", //生成后保存的目录 - "cccddd" //数据库 -); -``` - -## 模板语法 - -```html - - -{#title} - - - - -{#表达式} -{##表达式} 当表达式可能发生runtime错误时使用,性能没有上面的高 - - -{include ../header.html} -
-

aaa

-

bbb {#i}

-

ccc {#i}

-
- - -{module module_name1 parms1, 2, 3...} -{/module} -{module module_name2 parms1, 2, 3...} -{/module} - - -{import ../module.html as myname} -{#myname.module_name(parms1, 2, 3...)} - - -{extends ../inc/layout.html} -{block body}{/block} - - -{% -for (var a = 0; a < 100; a++) - print(a); -%} - - -{if i === 50} -{elseif i > 60} -{else} -{/if} - - -{for i 1,101} 可自定义名 {for index2 表达式1 in 表达式2} - -{for item,index in items} 可选参数称 index - 可自定义名 {for item2, index99 in 数组表达式} - -{for key,item,index on json} 可选参数 item, index, - 可自定义名 {for key2, item2, index99 in 对象表达式} -{/for} - - -{miss} -此块内容不被bmw.js解析 -{/miss} - - - -``` \ No newline at end of file diff --git a/Templates/PostgreSQL/rich-entity-navigation-object/Const.cs b/Templates/PostgreSQL/rich-entity-navigation-object/Const.cs deleted file mode 100644 index 783e7d9e..00000000 --- a/Templates/PostgreSQL/rich-entity-navigation-object/Const.cs +++ /dev/null @@ -1,5 +0,0 @@ -public static class Const { - public static IFreeSql sqlserver = new FreeSql.FreeSqlBuilder() - .UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10") - .Build(); -} diff --git a/Templates/PostgreSQL/rich-entity-navigation-object/Model/for-table.cs.freesql b/Templates/PostgreSQL/rich-entity-navigation-object/Model/for-table.cs.freesql deleted file mode 100644 index 7a454552..00000000 --- a/Templates/PostgreSQL/rich-entity-navigation-object/Model/for-table.cs.freesql +++ /dev/null @@ -1,240 +0,0 @@ -{%if (table.Type == DbTableType.StoreProcedure) { - print("return;"); - return rTn; - } - %}using System; -using System.Collections; -using System.Collections.Generic; -using System.ComponentModel; -using System.Linq; -using System.Reflection; -using System.Threading.Tasks; -using Newtonsoft.Json; -using FreeSql; -using FreeSql.DataAnnotations; -{% -var dbf = dbfirst as FreeSql.IDbFirst; -var cols = (table.Columns as List); -var pks = (table.Primarys as List); -var fks = (table.Foreigns as List); - -Func UString = stra => stra.Substring(0, 1).ToUpper() + stra.Substring(1); -Func GetCsType = cola3 => { - return dbf.GetCsType(cola3); -}; -Func GetFkObjectName = fkx => { - var eqfks = fks.Where(fk22a => fk22a.ReferencedTable.Name == fkx.ReferencedTable.Name); - if (eqfks.Count() == 1) return "Obj_" + fkx.ReferencedTable.Name; - var fkretname = fkx.Columns[0].Name; - if (fkretname.EndsWith(fkx.ReferencedColumns[0].Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(0, fkretname.Length - fkx.ReferencedColumns[0].Name.Length).TrimEnd('_'); - if (fkretname.EndsWith(fkx.ReferencedTable.Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(0, fkretname.Length - fkx.ReferencedTable.Name.Length).TrimEnd('_'); - if (fkretname.StartsWith(fkx.ReferencedTable.Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(fkx.ReferencedTable.Name.Length).TrimStart('_'); - return "Obj_" + fkx.ReferencedTable.Name + (string.IsNullOrEmpty(fkretname) ? "" : ("_" + fkretname)); -}; - -%} -namespace test.Model { - - [JsonObject(MemberSerialization.OptIn), Table(Name = "{#!string.IsNullOrEmpty(table.Schema) ? table.Schema + "." : ""}{#table.Name}"{if cols.Where(cola003 => cola003.Name.ToLower() == "is_deleted" || cola003.Name.ToLower() == "isdeleted").Any()}, SelectFilter = "a.IsDeleted = 1"{/if})] - public partial class {#UString(table.Name)} {{for col,index in table.Columns}{% - var findfks = fks.Where(fkaa => fkaa.Columns.Where(fkaac1 => fkaac1.Name == col.Name).Any()); - %}{if findfks.Any() == false} - {if string.IsNullOrEmpty(col.Coment) == false}/// - /// {#col.Coment.Replace("\r\n", "\n").Replace("\n", "\r\n /// ")} - /// {/if} - [JsonProperty, Column(Name = "{#col.Name}", DbType = "{#col.DbTypeTextFull}"{if col.IsPrimary == true}, IsPrimary = true{/if}{if col.IsIdentity == true}, IsIdentity = true{/if}{if col.IsNullable == true}, IsNullable = true{/if})] - public {#GetCsType(col)} {#UString(col.Name)} { get; set; } - {else} - private {#GetCsType(col)} _{#UString(col.Name)}; - {if string.IsNullOrEmpty(col.Coment) == false}/// - /// {#col.Coment.Replace("\r\n", "\n").Replace("\n", "\r\n /// ")} - /// {/if} - [JsonProperty, Column(Name = "{#col.Name}", DbType = "{#col.DbTypeTextFull}"{if col.IsPrimary == true}, IsPrimary = true{/if}{if col.IsIdentity == true}, IsIdentity = true{/if}{if col.IsNullable == true}, IsNullable = true{/if})] - public {#GetCsType(col)} {#UString(col.Name)} { get => _{#UString(col.Name)}; set { - if (_{#UString(col.Name)} == value) return; - _{#UString(col.Name)} = value;{for fkcok2 in findfks} - {#GetFkObjectName(fkcok2)} = null;{/for} - } } - {/if}{/for}{for fk in fks} - public {#UString(fk.ReferencedTable.Name)} {#GetFkObjectName(fk)} { get; set; } - {/for} - internal static IFreeSql freesql => Const.sqlserver; - public static ISelect<{#UString(table.Name)}> Select => freesql.Select<{#UString(table.Name)}>(); -{if (table.Uniques.Count > 0)} - public static int ItemCacheTimeout = 180;{for uk001 in table.Uniques}{% - - string parms = string.Empty; - string parmsByWhereLambda = string.Empty; - string parmsBy = "By"; - string parmsNodeTypeUpdateCacheRemove = string.Empty; - foreach (var uk001col in uk001) { - string getcstype = GetCsType(uk001col); - parms += getcstype.Replace("?", "") + " " + UString(uk001col.Name) + ", "; - parmsByWhereLambda += "a." + UString(uk001col.Name) + " == " + UString(uk001col.Name) + " && "; - parmsBy += UString(uk001col.Name) + "And"; - parmsNodeTypeUpdateCacheRemove += "item." + UString(uk001col.Name) + ", \"_,_\", "; - } - parms = parms.Substring(0, parms.Length - 2); - parmsByWhereLambda = parmsByWhereLambda.Substring(0, parmsByWhereLambda.Length - 4); - parmsBy = parmsBy.Substring(0, parmsBy.Length - 3); - parmsNodeTypeUpdateCacheRemove = parmsNodeTypeUpdateCacheRemove.Substring(0, parmsNodeTypeUpdateCacheRemove.Length - 9); - %} - public static {#UString(table.Name)} GetItem{#uk001[0].IsPrimary ? string.Empty : parmsBy}({#parms}) => Select.Where(a => {#parmsByWhereLambda}).Caching(ItemCacheTimeout, string.Concat("test:{#table.Name}{#uk001[0].IsPrimary ? string.Empty : parmsBy}:", {#parmsNodeTypeUpdateCacheRemove.Replace("item.", "")})).ToOne();{/for} -{for uk001 in table.Uniques}{% - - string parms = string.Empty; - string parmsByWhereLambda = string.Empty; - string parmsNewItem = string.Empty; - string parmsBy = "By"; - string parmsNoneType = string.Empty; - foreach (var uk001col in uk001) { - string getcstype = GetCsType(uk001col); - parms += getcstype.Replace("?", "") + " " + UString(uk001col.Name) + ", "; - parmsByWhereLambda += "a." + UString(uk001col.Name) + " == " + UString(uk001col.Name) + " && "; - parmsNewItem += UString(uk001col.Name) + " = " + UString(uk001col.Name) + ", "; - parmsBy += UString(uk001col.Name) + "And"; - parmsNoneType += UString(uk001col.Name) + ", "; - } - parms = parms.Substring(0, parms.Length - 2); - parmsByWhereLambda = parmsByWhereLambda.Substring(0, parmsByWhereLambda.Length - 4); - parmsNewItem = parmsNewItem.Substring(0, parmsNewItem.Length - 2); - parmsBy = parmsBy.Substring(0, parmsBy.Length - 3); - parmsNoneType = parmsNoneType.Substring(0, parmsNoneType.Length - 2); - %} - public static long Delete{#uk001[0].IsPrimary ? string.Empty : parmsBy}({#parms}) { - var affrows = freesql.Delete<{#UString(table.Name)}>().Where(a => {#parmsByWhereLambda}).ExecuteAffrows();{if table.Uniques.Count > 1} - if (ItemCacheTimeout > 0) RemoveCache(GetItem{#uk001[0].IsPrimary ? string.Empty : parmsBy}({#parmsNoneType}));{else} - if (ItemCacheTimeout > 0) RemoveCache(new {#UString(table.Name)} { {#parmsNewItem} });{/if} - return affrows; - }{/for} -{for fkcoldel in fks}{% - string parms = string.Empty; - string parmsBy = "By"; - string parmsByWhereLambda = string.Empty; - foreach( var fkcoldelcol in fkcoldel.Columns) { - string getcstype = GetCsType(fkcoldelcol); - parms += getcstype.Replace("?", "") + " " + UString(fkcoldelcol.Name) + ", "; - parmsBy += UString(fkcoldelcol.Name) + "And"; - parmsByWhereLambda += "a." + UString(fkcoldelcol.Name) + " == " + UString(fkcoldelcol.Name) + " && "; - } - parms = parms.Substring(0, parms.Length - 2); - parmsBy = parmsBy.Substring(0, parmsBy.Length - 3); - parmsByWhereLambda = parmsByWhereLambda.Substring(0, parmsByWhereLambda.Length - 4); - %} - public static long DeleteBy{#parmsBy}({#parms}) { - return freesql.Delete<{#UString(table.Name)}>().Where(a => {#parmsByWhereLambda}).ExecuteAffrows(); //删除缓存 - } -{/for}{% string redisRemoveCode = string.Empty; %}{for uk001 in table.Uniques}{% - - string parmsBy = "By"; - string parmsNodeTypeUpdateCacheRemove = string.Empty; - foreach (var uk001col in uk001) { - parmsBy += UString(uk001col.Name) + "And"; - parmsNodeTypeUpdateCacheRemove += "item." + UString(uk001col.Name) + ", \"_,_\", "; - } - parmsBy = parmsBy.Substring(0, parmsBy.Length - 3); - parmsNodeTypeUpdateCacheRemove = parmsNodeTypeUpdateCacheRemove.Substring(0, parmsNodeTypeUpdateCacheRemove.Length - 9); - redisRemoveCode += $@" - keys[keysIdx++] = string.Concat(""test:{table.Name}{(uk001[0].IsPrimary ? string.Empty : parmsBy)}:"", {parmsNodeTypeUpdateCacheRemove});"; - %}{/for} - internal static void RemoveCache({#UString(table.Name)} item) => RemoveCache(item == null ? null : new [] { item }); - internal static void RemoveCache(IEnumerable<{#UString(table.Name)}> items) { - if (ItemCacheTimeout <= 0 || items == null || items.Any() == false) return; - var keys = new string[items.Count() * {#table.Uniques.Count}]; - var keysIdx = 0; - foreach (var item in items) {{#redisRemoveCode} - } - if (freesql.Ado.TransactionCurrentThread != null) freesql.Ado.TransactionPreRemoveCache(keys); - else freesql.Cache.Remove(keys); - } -{if (table.Columns.Count < 100)}{% - string CsParam3 = string.Empty; - string CsParamNoType3 = string.Empty; - string parms = string.Empty; - string parmsByWhereLambda = string.Empty; - string parmsNewItem = string.Empty; - string parmsBy = "By"; - string parmsNoneType = string.Empty; - var idens = 0; - var idensCol = table.Columns[0]; - foreach (var uk001col in table.Columns) { - string getcstype = GetCsType(uk001col); - parms += getcstype.Replace("?", "") + " " + UString(uk001col.Name) + ", "; - if (uk001col.IsPrimary) - parmsByWhereLambda += "a." + UString(uk001col.Name) + " == " + UString(uk001col.Name) + " && "; - parmsNewItem += UString(uk001col.Name) + " = " + UString(uk001col.Name) + ", "; - parmsBy += UString(uk001col.Name) + "And"; - parmsNoneType += UString(uk001col.Name) + ", "; - if (uk001col.IsIdentity) { - idens++; - idensCol = uk001col; - } else { - if (getcstype.StartsWith("DateTime") && (uk001col.Name.ToLower() == "create_time" || uk001col.Name.ToLower() == "update_time" || uk001col.Name.ToLower() == "createtime" || uk001col.Name.ToLower() == "updatetime") || - getcstype == "bool?" && (uk001col.Name.ToLower() == "is_deleted" || uk001col.Name.ToLower() == "isdeleted")) { - - } else { - CsParam3 += getcstype + " " + UString(uk001col.Name) + ", "; - CsParamNoType3 += string.Format("\r\n {0} = {0}, ", UString(uk001col.Name)); - } - } - } - parms = parms.Substring(0, parms.Length - 2); - if (parmsByWhereLambda.Length > 0) parmsByWhereLambda = parmsByWhereLambda.Substring(0, parmsByWhereLambda.Length - 4); - parmsNewItem = parmsNewItem.Substring(0, parmsNewItem.Length - 2); - parmsBy = parmsBy.Substring(0, parmsBy.Length - 3); - parmsNoneType = parmsNoneType.Substring(0, parmsNoneType.Length - 2); - if (CsParam3.Length > 0) CsParam3 = CsParam3.Substring(0, CsParam3.Length - 2); - if (CsParamNoType3.Length > 0) CsParamNoType3 = CsParamNoType3.Substring(0, CsParamNoType3.Length - 2); - %}{if idens > 0} - public static {#GetCsType(idensCol)} Insert({#UString(table.Name)} item) { - item.{#UString(idensCol.Name)} = ({#GetCsType(idensCol)})freesql.Insert<{#UString(table.Name)}>().AppendData(item).ExecuteIdentity(); - if (ItemCacheTimeout > 0) RemoveCache(item); - return item.{#UString(idensCol.Name)}; - }{else} - public static void Insert({#UString(table.Name)} item) { - if (ItemCacheTimeout > 0) RemoveCache(item); - freesql.Insert<{#UString(table.Name)}>().AppendData(item).ExecuteAffrows(); - } - public static long Insert(IEnumerable<{#UString(table.Name)}> items) { - if (ItemCacheTimeout > 0) RemoveCache(items); - return freesql.Insert<{#UString(table.Name)}>().AppendData(items).ExecuteAffrows(); - }{/if} - {if CsParamNoType3.Split('=').Length <= 5}{if idens > 0} - public static {#GetCsType(idensCol)} Insert({#CsParam3}) { - var item = new {#UString(table.Name)} {{#CsParamNoType3}}; - item.{#UString(idensCol.Name)} = ({#GetCsType(idensCol)})freesql.Insert<{#UString(table.Name)}>().AppendData(new {#UString(table.Name)} {{#CsParamNoType3}}).ExecuteIdentity(); - if (ItemCacheTimeout > 0) RemoveCache(item); - return item.{#UString(idensCol.Name)}; - }{else} - public static {#UString(table.Name)} Insert({#CsParam3}) { - var item = new {#UString(table.Name)} {{#CsParamNoType3}}; - freesql.Insert<{#UString(table.Name)}>().AppendData(item).ExecuteAffrows(); - if (ItemCacheTimeout > 0) RemoveCache(item); - return item; - }{/if}{/if} - public static long Update({#UString(table.Name)} item) { - if (ItemCacheTimeout > 0) RemoveCache(item); - return freesql.Update<{#UString(table.Name)}>().SetSource(item).ExecuteAffrows(); - } - public static long Update(IEnumerable<{#UString(table.Name)}> items) { - if (ItemCacheTimeout > 0) RemoveCache(items); - return freesql.Update<{#UString(table.Name)}>().SetSource(items).ExecuteAffrows(); - } - /// - /// 指定字段更新 - /// - public IUpdate<{#UString(table.Name)}> UpdateDiy => freesql.Update<{#UString(table.Name)}>().Where(a => {#parmsByWhereLambda}); - /// - /// {if pks.Count > 0}保存或添加,如果主键有值则尝试 Update,如果影响的行为 0 则尝试 Insert{else}添加{/if} - /// - public void Save() {{if pks.Count > 0} - if ({#string.Join(" && ", pks.Select(pkssa => "this." + UString(pkssa.Name) + " != default(" + GetCsType(pkssa) + ")"))}) { - var affrows = freesql.Update<{#UString(table.Name)}>().Where(a => {#parmsByWhereLambda}).ExecuteAffrows(); - if (affrows > 0) return; - }{/if} - {if idens > 0}this.{#UString(idensCol.Name)} = {#GetCsType(idensCol).Replace("?", "") == "long" ? "" : ("(" + GetCsType(idensCol) + ")")}freesql.Insert<{#UString(table.Name)}>().AppendData(this).ExecuteIdentity();{else} - freesql.Insert<{#UString(table.Name)}>().AppendData(this).ExecuteAffrows();{/if} - } -{/if}{/if} - } -} \ No newline at end of file diff --git a/Templates/PostgreSQL/rich-entity-navigation-object/readme.md b/Templates/PostgreSQL/rich-entity-navigation-object/readme.md deleted file mode 100644 index 96c9adcf..00000000 --- a/Templates/PostgreSQL/rich-entity-navigation-object/readme.md +++ /dev/null @@ -1,94 +0,0 @@ -# 生成器 - -生成器是基于 dbfirst 开发的辅助工具,适用老项目一键生成实体。生成器采用模板的方式,作者实现了三种生成模板: - -| 模板名称 | 类型映射 | 外键导航属性 | 缓存管理 | 失血 | 贫血 | 充血 | -| ------------- | - | - |- | - |- | - | -| simple-entity | √ | X | X | √ | X | X | -| simple-entity-navigation-object | √ | √ | X | √ | X | X | -| rich-entity-navigation-object | √ | √ | √ | X | √ | X | - -模板在项目目录:/Templates/MySql - -> 更多模板逐步开发中。。。 - -```csharp -//定义 mysql FreeSql -var mysql = new FreeSql.FreeSqlBuilder() - .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10") - .Build(); - -//创建模板生成类实现 -var gen = new FreeSql.Generator.TemplateGenerator(); -gen.Build(mysql.DbFirst, - @"C:\Users\28810\Desktop\github\FreeSql\Templates\MySql\simple-entity", //模板目录(事先下载) - @"C:\Users\28810\Desktop\新建文件夹 (9)", //生成后保存的目录 - "cccddd" //数据库 -); -``` - -## 模板语法 - -```html - - -{#title} - - - - -{#表达式} -{##表达式} 当表达式可能发生runtime错误时使用,性能没有上面的高 - - -{include ../header.html} -
-

aaa

-

bbb {#i}

-

ccc {#i}

-
- - -{module module_name1 parms1, 2, 3...} -{/module} -{module module_name2 parms1, 2, 3...} -{/module} - - -{import ../module.html as myname} -{#myname.module_name(parms1, 2, 3...)} - - -{extends ../inc/layout.html} -{block body}{/block} - - -{% -for (var a = 0; a < 100; a++) - print(a); -%} - - -{if i === 50} -{elseif i > 60} -{else} -{/if} - - -{for i 1,101} 可自定义名 {for index2 表达式1 in 表达式2} - -{for item,index in items} 可选参数称 index - 可自定义名 {for item2, index99 in 数组表达式} - -{for key,item,index on json} 可选参数 item, index, - 可自定义名 {for key2, item2, index99 in 对象表达式} -{/for} - - -{miss} -此块内容不被bmw.js解析 -{/miss} - - - -``` \ No newline at end of file diff --git a/Templates/PostgreSQL/simple-entity-navigation-object/Model/for-table.cs.freesql b/Templates/PostgreSQL/simple-entity-navigation-object/Model/for-table.cs.freesql deleted file mode 100644 index f6a3ff87..00000000 --- a/Templates/PostgreSQL/simple-entity-navigation-object/Model/for-table.cs.freesql +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Threading.Tasks; -using Newtonsoft.Json; -using FreeSql.DataAnnotations; -using System.Net; -using Newtonsoft.Json.Linq; -using System.Net.NetworkInformation; -using NpgsqlTypes; -using Npgsql.LegacyPostgis; -{% -var dbf = dbfirst as FreeSql.IDbFirst; -var cols = (table.Columns as List); -var pks = (table.Primarys as List); -var fks = (table.Foreigns as List); - -Func UString = stra => stra.Substring(0, 1).ToUpper() + stra.Substring(1); -Func GetCsType = cola3 => { - return dbf.GetCsType(cola3); -}; -Func GetFkObjectName = fkx => { - var eqfks = fks.Where(fk22a => fk22a.ReferencedTable.Name == fkx.ReferencedTable.Name); - if (eqfks.Count() == 1) return "Obj_" + fkx.ReferencedTable.Name; - var fkretname = fkx.Columns[0].Name; - if (fkretname.EndsWith(fkx.ReferencedColumns[0].Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(0, fkretname.Length - fkx.ReferencedColumns[0].Name.Length).TrimEnd('_'); - if (fkretname.EndsWith(fkx.ReferencedTable.Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(0, fkretname.Length - fkx.ReferencedTable.Name.Length).TrimEnd('_'); - if (fkretname.StartsWith(fkx.ReferencedTable.Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(fkx.ReferencedTable.Name.Length).TrimStart('_'); - return "Obj_" + fkx.ReferencedTable.Name + (string.IsNullOrEmpty(fkretname) ? "" : ("_" + fkretname)); -}; -%} -namespace test.Model { - - [JsonObject(MemberSerialization.OptIn), Table(Name = "{#!string.IsNullOrEmpty(table.Schema) ? table.Schema + "." : ""}{#table.Name}"{if cols.Where(cola003 => cola003.Name.ToLower() == "is_deleted" || cola003.Name.ToLower() == "isdeleted").Any()}, SelectFilter = "a.IsDeleted = 1"{/if})] - public partial class {#UString(table.Name)} {{for col,index in table.Columns}{% - var findfks = fks.Where(fkaa => fkaa.Columns.Where(fkaac1 => fkaac1.Name == col.Name).Any()); - %}{if findfks.Any() == false} - {if string.IsNullOrEmpty(col.Coment) == false}/// - /// {#col.Coment.Replace("\r\n", "\n").Replace("\n", "\r\n /// ")} - /// {/if} - [JsonProperty, Column(Name = "{#col.Name}", DbType = "{#col.DbTypeTextFull}"{if col.IsPrimary == true}, IsPrimary = true{/if}{if col.IsIdentity == true}, IsIdentity = true{/if}{if col.IsNullable == true}, IsNullable = true{/if})] - public {#GetCsType(col)} {#UString(col.Name)} { get; set; } - {else} - private {#GetCsType(col)} _{#UString(col.Name)}; - {if string.IsNullOrEmpty(col.Coment) == false}/// - /// {#col.Coment.Replace("\r\n", "\n").Replace("\n", "\r\n /// ")} - /// {/if} - [JsonProperty, Column(Name = "{#col.Name}", DbType = "{#col.DbTypeTextFull}"{if col.IsPrimary == true}, IsPrimary = true{/if}{if col.IsIdentity == true}, IsIdentity = true{/if}{if col.IsNullable == true}, IsNullable = true{/if})] - public {#GetCsType(col)} {#UString(col.Name)} { get => _{#UString(col.Name)}; set { - if (_{#UString(col.Name)} == value) return; - _{#UString(col.Name)} = value;{for fkcok2 in findfks} - {#GetFkObjectName(fkcok2)} = null;{/for} - } } - {/if}{/for}{for fk in fks} - public {#UString(fk.ReferencedTable.Name)} {#GetFkObjectName(fk)} { get; set; } - {/for} - } -} \ No newline at end of file diff --git a/Templates/PostgreSQL/simple-entity-navigation-object/readme.md b/Templates/PostgreSQL/simple-entity-navigation-object/readme.md deleted file mode 100644 index 96c9adcf..00000000 --- a/Templates/PostgreSQL/simple-entity-navigation-object/readme.md +++ /dev/null @@ -1,94 +0,0 @@ -# 生成器 - -生成器是基于 dbfirst 开发的辅助工具,适用老项目一键生成实体。生成器采用模板的方式,作者实现了三种生成模板: - -| 模板名称 | 类型映射 | 外键导航属性 | 缓存管理 | 失血 | 贫血 | 充血 | -| ------------- | - | - |- | - |- | - | -| simple-entity | √ | X | X | √ | X | X | -| simple-entity-navigation-object | √ | √ | X | √ | X | X | -| rich-entity-navigation-object | √ | √ | √ | X | √ | X | - -模板在项目目录:/Templates/MySql - -> 更多模板逐步开发中。。。 - -```csharp -//定义 mysql FreeSql -var mysql = new FreeSql.FreeSqlBuilder() - .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10") - .Build(); - -//创建模板生成类实现 -var gen = new FreeSql.Generator.TemplateGenerator(); -gen.Build(mysql.DbFirst, - @"C:\Users\28810\Desktop\github\FreeSql\Templates\MySql\simple-entity", //模板目录(事先下载) - @"C:\Users\28810\Desktop\新建文件夹 (9)", //生成后保存的目录 - "cccddd" //数据库 -); -``` - -## 模板语法 - -```html - - -{#title} - - - - -{#表达式} -{##表达式} 当表达式可能发生runtime错误时使用,性能没有上面的高 - - -{include ../header.html} -
-

aaa

-

bbb {#i}

-

ccc {#i}

-
- - -{module module_name1 parms1, 2, 3...} -{/module} -{module module_name2 parms1, 2, 3...} -{/module} - - -{import ../module.html as myname} -{#myname.module_name(parms1, 2, 3...)} - - -{extends ../inc/layout.html} -{block body}{/block} - - -{% -for (var a = 0; a < 100; a++) - print(a); -%} - - -{if i === 50} -{elseif i > 60} -{else} -{/if} - - -{for i 1,101} 可自定义名 {for index2 表达式1 in 表达式2} - -{for item,index in items} 可选参数称 index - 可自定义名 {for item2, index99 in 数组表达式} - -{for key,item,index on json} 可选参数 item, index, - 可自定义名 {for key2, item2, index99 in 对象表达式} -{/for} - - -{miss} -此块内容不被bmw.js解析 -{/miss} - - - -``` \ No newline at end of file diff --git a/Templates/PostgreSQL/simple-entity/Model/for-table.cs.freesql b/Templates/PostgreSQL/simple-entity/Model/for-table.cs.freesql deleted file mode 100644 index c1347d76..00000000 --- a/Templates/PostgreSQL/simple-entity/Model/for-table.cs.freesql +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Threading.Tasks; -using Newtonsoft.Json; -using FreeSql.DataAnnotations; -using System.Net; -using Newtonsoft.Json.Linq; -using System.Net.NetworkInformation; -using NpgsqlTypes; -using Npgsql.LegacyPostgis; -{% -var dbf = dbfirst as FreeSql.IDbFirst; -var cols = (table.Columns as List); - -Func UString = stra => stra.Substring(0, 1).ToUpper() + stra.Substring(1); -Func GetCsType = cola3 => { - - return dbf.GetCsType(cola3); -}; -%} -namespace test.Model { - - [JsonObject(MemberSerialization.OptIn), Table(Name = "{#!string.IsNullOrEmpty(table.Schema) ? table.Schema + "." : ""}{#table.Name}"{if cols.Where(cola003 => cola003.Name.ToLower() == "is_deleted" || cola003.Name.ToLower() == "isdeleted").Any()}, SelectFilter = "a.IsDeleted = 1"{/if})] - public partial class {#UString(table.Name)} {{for col,index in table.Columns} - {if string.IsNullOrEmpty(col.Coment) == false}/// - /// {#col.Coment.Replace("\r\n", "\n").Replace("\n", "\r\n /// ")} - /// {/if} - [JsonProperty, Column(Name = "{#col.Name}", DbType = "{#col.DbTypeTextFull}"{if col.IsPrimary == true}, IsPrimary = true{/if}{if col.IsIdentity == true}, IsIdentity = true{/if}{if col.IsNullable == true}, IsNullable = true{/if})] - public {#GetCsType(col)} {#UString(col.Name)} { get; set; } - {/for} - } -} \ No newline at end of file diff --git a/Templates/PostgreSQL/simple-entity/readme.md b/Templates/PostgreSQL/simple-entity/readme.md deleted file mode 100644 index 96c9adcf..00000000 --- a/Templates/PostgreSQL/simple-entity/readme.md +++ /dev/null @@ -1,94 +0,0 @@ -# 生成器 - -生成器是基于 dbfirst 开发的辅助工具,适用老项目一键生成实体。生成器采用模板的方式,作者实现了三种生成模板: - -| 模板名称 | 类型映射 | 外键导航属性 | 缓存管理 | 失血 | 贫血 | 充血 | -| ------------- | - | - |- | - |- | - | -| simple-entity | √ | X | X | √ | X | X | -| simple-entity-navigation-object | √ | √ | X | √ | X | X | -| rich-entity-navigation-object | √ | √ | √ | X | √ | X | - -模板在项目目录:/Templates/MySql - -> 更多模板逐步开发中。。。 - -```csharp -//定义 mysql FreeSql -var mysql = new FreeSql.FreeSqlBuilder() - .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10") - .Build(); - -//创建模板生成类实现 -var gen = new FreeSql.Generator.TemplateGenerator(); -gen.Build(mysql.DbFirst, - @"C:\Users\28810\Desktop\github\FreeSql\Templates\MySql\simple-entity", //模板目录(事先下载) - @"C:\Users\28810\Desktop\新建文件夹 (9)", //生成后保存的目录 - "cccddd" //数据库 -); -``` - -## 模板语法 - -```html - - -{#title} - - - - -{#表达式} -{##表达式} 当表达式可能发生runtime错误时使用,性能没有上面的高 - - -{include ../header.html} -
-

aaa

-

bbb {#i}

-

ccc {#i}

-
- - -{module module_name1 parms1, 2, 3...} -{/module} -{module module_name2 parms1, 2, 3...} -{/module} - - -{import ../module.html as myname} -{#myname.module_name(parms1, 2, 3...)} - - -{extends ../inc/layout.html} -{block body}{/block} - - -{% -for (var a = 0; a < 100; a++) - print(a); -%} - - -{if i === 50} -{elseif i > 60} -{else} -{/if} - - -{for i 1,101} 可自定义名 {for index2 表达式1 in 表达式2} - -{for item,index in items} 可选参数称 index - 可自定义名 {for item2, index99 in 数组表达式} - -{for key,item,index on json} 可选参数 item, index, - 可自定义名 {for key2, item2, index99 in 对象表达式} -{/for} - - -{miss} -此块内容不被bmw.js解析 -{/miss} - - - -``` \ No newline at end of file diff --git a/Templates/SqlServer/rich-entity-navigation-object/Const.cs b/Templates/SqlServer/rich-entity-navigation-object/Const.cs deleted file mode 100644 index 783e7d9e..00000000 --- a/Templates/SqlServer/rich-entity-navigation-object/Const.cs +++ /dev/null @@ -1,5 +0,0 @@ -public static class Const { - public static IFreeSql sqlserver = new FreeSql.FreeSqlBuilder() - .UseConnectionString(FreeSql.DataType.SqlServer, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10") - .Build(); -} diff --git a/Templates/SqlServer/rich-entity-navigation-object/Model/for-table.cs.freesql b/Templates/SqlServer/rich-entity-navigation-object/Model/for-table.cs.freesql deleted file mode 100644 index 7a454552..00000000 --- a/Templates/SqlServer/rich-entity-navigation-object/Model/for-table.cs.freesql +++ /dev/null @@ -1,240 +0,0 @@ -{%if (table.Type == DbTableType.StoreProcedure) { - print("return;"); - return rTn; - } - %}using System; -using System.Collections; -using System.Collections.Generic; -using System.ComponentModel; -using System.Linq; -using System.Reflection; -using System.Threading.Tasks; -using Newtonsoft.Json; -using FreeSql; -using FreeSql.DataAnnotations; -{% -var dbf = dbfirst as FreeSql.IDbFirst; -var cols = (table.Columns as List); -var pks = (table.Primarys as List); -var fks = (table.Foreigns as List); - -Func UString = stra => stra.Substring(0, 1).ToUpper() + stra.Substring(1); -Func GetCsType = cola3 => { - return dbf.GetCsType(cola3); -}; -Func GetFkObjectName = fkx => { - var eqfks = fks.Where(fk22a => fk22a.ReferencedTable.Name == fkx.ReferencedTable.Name); - if (eqfks.Count() == 1) return "Obj_" + fkx.ReferencedTable.Name; - var fkretname = fkx.Columns[0].Name; - if (fkretname.EndsWith(fkx.ReferencedColumns[0].Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(0, fkretname.Length - fkx.ReferencedColumns[0].Name.Length).TrimEnd('_'); - if (fkretname.EndsWith(fkx.ReferencedTable.Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(0, fkretname.Length - fkx.ReferencedTable.Name.Length).TrimEnd('_'); - if (fkretname.StartsWith(fkx.ReferencedTable.Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(fkx.ReferencedTable.Name.Length).TrimStart('_'); - return "Obj_" + fkx.ReferencedTable.Name + (string.IsNullOrEmpty(fkretname) ? "" : ("_" + fkretname)); -}; - -%} -namespace test.Model { - - [JsonObject(MemberSerialization.OptIn), Table(Name = "{#!string.IsNullOrEmpty(table.Schema) ? table.Schema + "." : ""}{#table.Name}"{if cols.Where(cola003 => cola003.Name.ToLower() == "is_deleted" || cola003.Name.ToLower() == "isdeleted").Any()}, SelectFilter = "a.IsDeleted = 1"{/if})] - public partial class {#UString(table.Name)} {{for col,index in table.Columns}{% - var findfks = fks.Where(fkaa => fkaa.Columns.Where(fkaac1 => fkaac1.Name == col.Name).Any()); - %}{if findfks.Any() == false} - {if string.IsNullOrEmpty(col.Coment) == false}/// - /// {#col.Coment.Replace("\r\n", "\n").Replace("\n", "\r\n /// ")} - /// {/if} - [JsonProperty, Column(Name = "{#col.Name}", DbType = "{#col.DbTypeTextFull}"{if col.IsPrimary == true}, IsPrimary = true{/if}{if col.IsIdentity == true}, IsIdentity = true{/if}{if col.IsNullable == true}, IsNullable = true{/if})] - public {#GetCsType(col)} {#UString(col.Name)} { get; set; } - {else} - private {#GetCsType(col)} _{#UString(col.Name)}; - {if string.IsNullOrEmpty(col.Coment) == false}/// - /// {#col.Coment.Replace("\r\n", "\n").Replace("\n", "\r\n /// ")} - /// {/if} - [JsonProperty, Column(Name = "{#col.Name}", DbType = "{#col.DbTypeTextFull}"{if col.IsPrimary == true}, IsPrimary = true{/if}{if col.IsIdentity == true}, IsIdentity = true{/if}{if col.IsNullable == true}, IsNullable = true{/if})] - public {#GetCsType(col)} {#UString(col.Name)} { get => _{#UString(col.Name)}; set { - if (_{#UString(col.Name)} == value) return; - _{#UString(col.Name)} = value;{for fkcok2 in findfks} - {#GetFkObjectName(fkcok2)} = null;{/for} - } } - {/if}{/for}{for fk in fks} - public {#UString(fk.ReferencedTable.Name)} {#GetFkObjectName(fk)} { get; set; } - {/for} - internal static IFreeSql freesql => Const.sqlserver; - public static ISelect<{#UString(table.Name)}> Select => freesql.Select<{#UString(table.Name)}>(); -{if (table.Uniques.Count > 0)} - public static int ItemCacheTimeout = 180;{for uk001 in table.Uniques}{% - - string parms = string.Empty; - string parmsByWhereLambda = string.Empty; - string parmsBy = "By"; - string parmsNodeTypeUpdateCacheRemove = string.Empty; - foreach (var uk001col in uk001) { - string getcstype = GetCsType(uk001col); - parms += getcstype.Replace("?", "") + " " + UString(uk001col.Name) + ", "; - parmsByWhereLambda += "a." + UString(uk001col.Name) + " == " + UString(uk001col.Name) + " && "; - parmsBy += UString(uk001col.Name) + "And"; - parmsNodeTypeUpdateCacheRemove += "item." + UString(uk001col.Name) + ", \"_,_\", "; - } - parms = parms.Substring(0, parms.Length - 2); - parmsByWhereLambda = parmsByWhereLambda.Substring(0, parmsByWhereLambda.Length - 4); - parmsBy = parmsBy.Substring(0, parmsBy.Length - 3); - parmsNodeTypeUpdateCacheRemove = parmsNodeTypeUpdateCacheRemove.Substring(0, parmsNodeTypeUpdateCacheRemove.Length - 9); - %} - public static {#UString(table.Name)} GetItem{#uk001[0].IsPrimary ? string.Empty : parmsBy}({#parms}) => Select.Where(a => {#parmsByWhereLambda}).Caching(ItemCacheTimeout, string.Concat("test:{#table.Name}{#uk001[0].IsPrimary ? string.Empty : parmsBy}:", {#parmsNodeTypeUpdateCacheRemove.Replace("item.", "")})).ToOne();{/for} -{for uk001 in table.Uniques}{% - - string parms = string.Empty; - string parmsByWhereLambda = string.Empty; - string parmsNewItem = string.Empty; - string parmsBy = "By"; - string parmsNoneType = string.Empty; - foreach (var uk001col in uk001) { - string getcstype = GetCsType(uk001col); - parms += getcstype.Replace("?", "") + " " + UString(uk001col.Name) + ", "; - parmsByWhereLambda += "a." + UString(uk001col.Name) + " == " + UString(uk001col.Name) + " && "; - parmsNewItem += UString(uk001col.Name) + " = " + UString(uk001col.Name) + ", "; - parmsBy += UString(uk001col.Name) + "And"; - parmsNoneType += UString(uk001col.Name) + ", "; - } - parms = parms.Substring(0, parms.Length - 2); - parmsByWhereLambda = parmsByWhereLambda.Substring(0, parmsByWhereLambda.Length - 4); - parmsNewItem = parmsNewItem.Substring(0, parmsNewItem.Length - 2); - parmsBy = parmsBy.Substring(0, parmsBy.Length - 3); - parmsNoneType = parmsNoneType.Substring(0, parmsNoneType.Length - 2); - %} - public static long Delete{#uk001[0].IsPrimary ? string.Empty : parmsBy}({#parms}) { - var affrows = freesql.Delete<{#UString(table.Name)}>().Where(a => {#parmsByWhereLambda}).ExecuteAffrows();{if table.Uniques.Count > 1} - if (ItemCacheTimeout > 0) RemoveCache(GetItem{#uk001[0].IsPrimary ? string.Empty : parmsBy}({#parmsNoneType}));{else} - if (ItemCacheTimeout > 0) RemoveCache(new {#UString(table.Name)} { {#parmsNewItem} });{/if} - return affrows; - }{/for} -{for fkcoldel in fks}{% - string parms = string.Empty; - string parmsBy = "By"; - string parmsByWhereLambda = string.Empty; - foreach( var fkcoldelcol in fkcoldel.Columns) { - string getcstype = GetCsType(fkcoldelcol); - parms += getcstype.Replace("?", "") + " " + UString(fkcoldelcol.Name) + ", "; - parmsBy += UString(fkcoldelcol.Name) + "And"; - parmsByWhereLambda += "a." + UString(fkcoldelcol.Name) + " == " + UString(fkcoldelcol.Name) + " && "; - } - parms = parms.Substring(0, parms.Length - 2); - parmsBy = parmsBy.Substring(0, parmsBy.Length - 3); - parmsByWhereLambda = parmsByWhereLambda.Substring(0, parmsByWhereLambda.Length - 4); - %} - public static long DeleteBy{#parmsBy}({#parms}) { - return freesql.Delete<{#UString(table.Name)}>().Where(a => {#parmsByWhereLambda}).ExecuteAffrows(); //删除缓存 - } -{/for}{% string redisRemoveCode = string.Empty; %}{for uk001 in table.Uniques}{% - - string parmsBy = "By"; - string parmsNodeTypeUpdateCacheRemove = string.Empty; - foreach (var uk001col in uk001) { - parmsBy += UString(uk001col.Name) + "And"; - parmsNodeTypeUpdateCacheRemove += "item." + UString(uk001col.Name) + ", \"_,_\", "; - } - parmsBy = parmsBy.Substring(0, parmsBy.Length - 3); - parmsNodeTypeUpdateCacheRemove = parmsNodeTypeUpdateCacheRemove.Substring(0, parmsNodeTypeUpdateCacheRemove.Length - 9); - redisRemoveCode += $@" - keys[keysIdx++] = string.Concat(""test:{table.Name}{(uk001[0].IsPrimary ? string.Empty : parmsBy)}:"", {parmsNodeTypeUpdateCacheRemove});"; - %}{/for} - internal static void RemoveCache({#UString(table.Name)} item) => RemoveCache(item == null ? null : new [] { item }); - internal static void RemoveCache(IEnumerable<{#UString(table.Name)}> items) { - if (ItemCacheTimeout <= 0 || items == null || items.Any() == false) return; - var keys = new string[items.Count() * {#table.Uniques.Count}]; - var keysIdx = 0; - foreach (var item in items) {{#redisRemoveCode} - } - if (freesql.Ado.TransactionCurrentThread != null) freesql.Ado.TransactionPreRemoveCache(keys); - else freesql.Cache.Remove(keys); - } -{if (table.Columns.Count < 100)}{% - string CsParam3 = string.Empty; - string CsParamNoType3 = string.Empty; - string parms = string.Empty; - string parmsByWhereLambda = string.Empty; - string parmsNewItem = string.Empty; - string parmsBy = "By"; - string parmsNoneType = string.Empty; - var idens = 0; - var idensCol = table.Columns[0]; - foreach (var uk001col in table.Columns) { - string getcstype = GetCsType(uk001col); - parms += getcstype.Replace("?", "") + " " + UString(uk001col.Name) + ", "; - if (uk001col.IsPrimary) - parmsByWhereLambda += "a." + UString(uk001col.Name) + " == " + UString(uk001col.Name) + " && "; - parmsNewItem += UString(uk001col.Name) + " = " + UString(uk001col.Name) + ", "; - parmsBy += UString(uk001col.Name) + "And"; - parmsNoneType += UString(uk001col.Name) + ", "; - if (uk001col.IsIdentity) { - idens++; - idensCol = uk001col; - } else { - if (getcstype.StartsWith("DateTime") && (uk001col.Name.ToLower() == "create_time" || uk001col.Name.ToLower() == "update_time" || uk001col.Name.ToLower() == "createtime" || uk001col.Name.ToLower() == "updatetime") || - getcstype == "bool?" && (uk001col.Name.ToLower() == "is_deleted" || uk001col.Name.ToLower() == "isdeleted")) { - - } else { - CsParam3 += getcstype + " " + UString(uk001col.Name) + ", "; - CsParamNoType3 += string.Format("\r\n {0} = {0}, ", UString(uk001col.Name)); - } - } - } - parms = parms.Substring(0, parms.Length - 2); - if (parmsByWhereLambda.Length > 0) parmsByWhereLambda = parmsByWhereLambda.Substring(0, parmsByWhereLambda.Length - 4); - parmsNewItem = parmsNewItem.Substring(0, parmsNewItem.Length - 2); - parmsBy = parmsBy.Substring(0, parmsBy.Length - 3); - parmsNoneType = parmsNoneType.Substring(0, parmsNoneType.Length - 2); - if (CsParam3.Length > 0) CsParam3 = CsParam3.Substring(0, CsParam3.Length - 2); - if (CsParamNoType3.Length > 0) CsParamNoType3 = CsParamNoType3.Substring(0, CsParamNoType3.Length - 2); - %}{if idens > 0} - public static {#GetCsType(idensCol)} Insert({#UString(table.Name)} item) { - item.{#UString(idensCol.Name)} = ({#GetCsType(idensCol)})freesql.Insert<{#UString(table.Name)}>().AppendData(item).ExecuteIdentity(); - if (ItemCacheTimeout > 0) RemoveCache(item); - return item.{#UString(idensCol.Name)}; - }{else} - public static void Insert({#UString(table.Name)} item) { - if (ItemCacheTimeout > 0) RemoveCache(item); - freesql.Insert<{#UString(table.Name)}>().AppendData(item).ExecuteAffrows(); - } - public static long Insert(IEnumerable<{#UString(table.Name)}> items) { - if (ItemCacheTimeout > 0) RemoveCache(items); - return freesql.Insert<{#UString(table.Name)}>().AppendData(items).ExecuteAffrows(); - }{/if} - {if CsParamNoType3.Split('=').Length <= 5}{if idens > 0} - public static {#GetCsType(idensCol)} Insert({#CsParam3}) { - var item = new {#UString(table.Name)} {{#CsParamNoType3}}; - item.{#UString(idensCol.Name)} = ({#GetCsType(idensCol)})freesql.Insert<{#UString(table.Name)}>().AppendData(new {#UString(table.Name)} {{#CsParamNoType3}}).ExecuteIdentity(); - if (ItemCacheTimeout > 0) RemoveCache(item); - return item.{#UString(idensCol.Name)}; - }{else} - public static {#UString(table.Name)} Insert({#CsParam3}) { - var item = new {#UString(table.Name)} {{#CsParamNoType3}}; - freesql.Insert<{#UString(table.Name)}>().AppendData(item).ExecuteAffrows(); - if (ItemCacheTimeout > 0) RemoveCache(item); - return item; - }{/if}{/if} - public static long Update({#UString(table.Name)} item) { - if (ItemCacheTimeout > 0) RemoveCache(item); - return freesql.Update<{#UString(table.Name)}>().SetSource(item).ExecuteAffrows(); - } - public static long Update(IEnumerable<{#UString(table.Name)}> items) { - if (ItemCacheTimeout > 0) RemoveCache(items); - return freesql.Update<{#UString(table.Name)}>().SetSource(items).ExecuteAffrows(); - } - /// - /// 指定字段更新 - /// - public IUpdate<{#UString(table.Name)}> UpdateDiy => freesql.Update<{#UString(table.Name)}>().Where(a => {#parmsByWhereLambda}); - /// - /// {if pks.Count > 0}保存或添加,如果主键有值则尝试 Update,如果影响的行为 0 则尝试 Insert{else}添加{/if} - /// - public void Save() {{if pks.Count > 0} - if ({#string.Join(" && ", pks.Select(pkssa => "this." + UString(pkssa.Name) + " != default(" + GetCsType(pkssa) + ")"))}) { - var affrows = freesql.Update<{#UString(table.Name)}>().Where(a => {#parmsByWhereLambda}).ExecuteAffrows(); - if (affrows > 0) return; - }{/if} - {if idens > 0}this.{#UString(idensCol.Name)} = {#GetCsType(idensCol).Replace("?", "") == "long" ? "" : ("(" + GetCsType(idensCol) + ")")}freesql.Insert<{#UString(table.Name)}>().AppendData(this).ExecuteIdentity();{else} - freesql.Insert<{#UString(table.Name)}>().AppendData(this).ExecuteAffrows();{/if} - } -{/if}{/if} - } -} \ No newline at end of file diff --git a/Templates/SqlServer/rich-entity-navigation-object/readme.md b/Templates/SqlServer/rich-entity-navigation-object/readme.md deleted file mode 100644 index 96c9adcf..00000000 --- a/Templates/SqlServer/rich-entity-navigation-object/readme.md +++ /dev/null @@ -1,94 +0,0 @@ -# 生成器 - -生成器是基于 dbfirst 开发的辅助工具,适用老项目一键生成实体。生成器采用模板的方式,作者实现了三种生成模板: - -| 模板名称 | 类型映射 | 外键导航属性 | 缓存管理 | 失血 | 贫血 | 充血 | -| ------------- | - | - |- | - |- | - | -| simple-entity | √ | X | X | √ | X | X | -| simple-entity-navigation-object | √ | √ | X | √ | X | X | -| rich-entity-navigation-object | √ | √ | √ | X | √ | X | - -模板在项目目录:/Templates/MySql - -> 更多模板逐步开发中。。。 - -```csharp -//定义 mysql FreeSql -var mysql = new FreeSql.FreeSqlBuilder() - .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10") - .Build(); - -//创建模板生成类实现 -var gen = new FreeSql.Generator.TemplateGenerator(); -gen.Build(mysql.DbFirst, - @"C:\Users\28810\Desktop\github\FreeSql\Templates\MySql\simple-entity", //模板目录(事先下载) - @"C:\Users\28810\Desktop\新建文件夹 (9)", //生成后保存的目录 - "cccddd" //数据库 -); -``` - -## 模板语法 - -```html - - -{#title} - - - - -{#表达式} -{##表达式} 当表达式可能发生runtime错误时使用,性能没有上面的高 - - -{include ../header.html} -
-

aaa

-

bbb {#i}

-

ccc {#i}

-
- - -{module module_name1 parms1, 2, 3...} -{/module} -{module module_name2 parms1, 2, 3...} -{/module} - - -{import ../module.html as myname} -{#myname.module_name(parms1, 2, 3...)} - - -{extends ../inc/layout.html} -{block body}{/block} - - -{% -for (var a = 0; a < 100; a++) - print(a); -%} - - -{if i === 50} -{elseif i > 60} -{else} -{/if} - - -{for i 1,101} 可自定义名 {for index2 表达式1 in 表达式2} - -{for item,index in items} 可选参数称 index - 可自定义名 {for item2, index99 in 数组表达式} - -{for key,item,index on json} 可选参数 item, index, - 可自定义名 {for key2, item2, index99 in 对象表达式} -{/for} - - -{miss} -此块内容不被bmw.js解析 -{/miss} - - - -``` \ No newline at end of file diff --git a/Templates/SqlServer/simple-entity-navigation-object/Model/for-table.cs.freesql b/Templates/SqlServer/simple-entity-navigation-object/Model/for-table.cs.freesql deleted file mode 100644 index 3d606937..00000000 --- a/Templates/SqlServer/simple-entity-navigation-object/Model/for-table.cs.freesql +++ /dev/null @@ -1,59 +0,0 @@ -{%if (table.Type == DbTableType.StoreProcedure) { - print("return;"); - return rTn; - } - %}using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Threading.Tasks; -using Newtonsoft.Json; -using FreeSql.DataAnnotations; -{% -var dbf = dbfirst as FreeSql.IDbFirst; -var cols = (table.Columns as List); -var pks = (table.Primarys as List); -var fks = (table.Foreigns as List); - -Func UString = stra => stra.Substring(0, 1).ToUpper() + stra.Substring(1); -Func GetCsType = cola3 => { - return dbf.GetCsType(cola3); -}; -Func GetFkObjectName = fkx => { - var eqfks = fks.Where(fk22a => fk22a.ReferencedTable.Name == fkx.ReferencedTable.Name); - if (eqfks.Count() == 1) return "Obj_" + fkx.ReferencedTable.Name; - var fkretname = fkx.Columns[0].Name; - if (fkretname.EndsWith(fkx.ReferencedColumns[0].Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(0, fkretname.Length - fkx.ReferencedColumns[0].Name.Length).TrimEnd('_'); - if (fkretname.EndsWith(fkx.ReferencedTable.Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(0, fkretname.Length - fkx.ReferencedTable.Name.Length).TrimEnd('_'); - if (fkretname.StartsWith(fkx.ReferencedTable.Name, StringComparison.CurrentCultureIgnoreCase)) fkretname = fkretname.Substring(fkx.ReferencedTable.Name.Length).TrimStart('_'); - return "Obj_" + fkx.ReferencedTable.Name + (string.IsNullOrEmpty(fkretname) ? "" : ("_" + fkretname)); -}; -%} -namespace test.Model { - - [JsonObject(MemberSerialization.OptIn), Table(Name = "{#!string.IsNullOrEmpty(table.Schema) ? table.Schema + "." : ""}{#table.Name}"{if cols.Where(cola003 => cola003.Name.ToLower() == "is_deleted" || cola003.Name.ToLower() == "isdeleted").Any()}, SelectFilter = "a.IsDeleted = 1"{/if})] - public partial class {#UString(table.Name)} {{for col,index in table.Columns}{% - var findfks = fks.Where(fkaa => fkaa.Columns.Where(fkaac1 => fkaac1.Name == col.Name).Any()); - %}{if findfks.Any() == false} - {if string.IsNullOrEmpty(col.Coment) == false}/// - /// {#col.Coment.Replace("\r\n", "\n").Replace("\n", "\r\n /// ")} - /// {/if} - [JsonProperty, Column(Name = "{#col.Name}", DbType = "{#col.DbTypeTextFull}"{if col.IsPrimary == true}, IsPrimary = true{/if}{if col.IsIdentity == true}, IsIdentity = true{/if}{if col.IsNullable == true}, IsNullable = true{/if})] - public {#GetCsType(col)} {#UString(col.Name)} { get; set; } - {else} - private {#GetCsType(col)} _{#UString(col.Name)}; - {if string.IsNullOrEmpty(col.Coment) == false}/// - /// {#col.Coment.Replace("\r\n", "\n").Replace("\n", "\r\n /// ")} - /// {/if} - [JsonProperty, Column(Name = "{#col.Name}", DbType = "{#col.DbTypeTextFull}"{if col.IsPrimary == true}, IsPrimary = true{/if}{if col.IsIdentity == true}, IsIdentity = true{/if}{if col.IsNullable == true}, IsNullable = true{/if})] - public {#GetCsType(col)} {#UString(col.Name)} { get => _{#UString(col.Name)}; set { - if (_{#UString(col.Name)} == value) return; - _{#UString(col.Name)} = value;{for fkcok2 in findfks} - {#GetFkObjectName(fkcok2)} = null;{/for} - } } - {/if}{/for}{for fk in fks} - public {#UString(fk.ReferencedTable.Name)} {#GetFkObjectName(fk)} { get; set; } - {/for} - } -} \ No newline at end of file diff --git a/Templates/SqlServer/simple-entity-navigation-object/readme.md b/Templates/SqlServer/simple-entity-navigation-object/readme.md deleted file mode 100644 index 96c9adcf..00000000 --- a/Templates/SqlServer/simple-entity-navigation-object/readme.md +++ /dev/null @@ -1,94 +0,0 @@ -# 生成器 - -生成器是基于 dbfirst 开发的辅助工具,适用老项目一键生成实体。生成器采用模板的方式,作者实现了三种生成模板: - -| 模板名称 | 类型映射 | 外键导航属性 | 缓存管理 | 失血 | 贫血 | 充血 | -| ------------- | - | - |- | - |- | - | -| simple-entity | √ | X | X | √ | X | X | -| simple-entity-navigation-object | √ | √ | X | √ | X | X | -| rich-entity-navigation-object | √ | √ | √ | X | √ | X | - -模板在项目目录:/Templates/MySql - -> 更多模板逐步开发中。。。 - -```csharp -//定义 mysql FreeSql -var mysql = new FreeSql.FreeSqlBuilder() - .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10") - .Build(); - -//创建模板生成类实现 -var gen = new FreeSql.Generator.TemplateGenerator(); -gen.Build(mysql.DbFirst, - @"C:\Users\28810\Desktop\github\FreeSql\Templates\MySql\simple-entity", //模板目录(事先下载) - @"C:\Users\28810\Desktop\新建文件夹 (9)", //生成后保存的目录 - "cccddd" //数据库 -); -``` - -## 模板语法 - -```html - - -{#title} - - - - -{#表达式} -{##表达式} 当表达式可能发生runtime错误时使用,性能没有上面的高 - - -{include ../header.html} -
-

aaa

-

bbb {#i}

-

ccc {#i}

-
- - -{module module_name1 parms1, 2, 3...} -{/module} -{module module_name2 parms1, 2, 3...} -{/module} - - -{import ../module.html as myname} -{#myname.module_name(parms1, 2, 3...)} - - -{extends ../inc/layout.html} -{block body}{/block} - - -{% -for (var a = 0; a < 100; a++) - print(a); -%} - - -{if i === 50} -{elseif i > 60} -{else} -{/if} - - -{for i 1,101} 可自定义名 {for index2 表达式1 in 表达式2} - -{for item,index in items} 可选参数称 index - 可自定义名 {for item2, index99 in 数组表达式} - -{for key,item,index on json} 可选参数 item, index, - 可自定义名 {for key2, item2, index99 in 对象表达式} -{/for} - - -{miss} -此块内容不被bmw.js解析 -{/miss} - - - -``` \ No newline at end of file diff --git a/Templates/SqlServer/simple-entity/Model/for-table.cs.freesql b/Templates/SqlServer/simple-entity/Model/for-table.cs.freesql deleted file mode 100644 index 86f7cb7f..00000000 --- a/Templates/SqlServer/simple-entity/Model/for-table.cs.freesql +++ /dev/null @@ -1,33 +0,0 @@ -{%if (table.Type == DbTableType.StoreProcedure) { - print("return;"); - return rTn; - } - %}using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Threading.Tasks; -using Newtonsoft.Json; -using FreeSql.DataAnnotations; -{% -var dbf = dbfirst as FreeSql.IDbFirst; -var cols = (table.Columns as List); - -Func UString = stra => stra.Substring(0, 1).ToUpper() + stra.Substring(1); -Func GetCsType = cola3 => { - return dbf.GetCsType(cola3); -}; -%} -namespace test.Model { - - [JsonObject(MemberSerialization.OptIn), Table(Name = "{#!string.IsNullOrEmpty(table.Schema) ? table.Schema + "." : ""}{#table.Name}"{if cols.Where(cola003 => cola003.Name.ToLower() == "is_deleted" || cola003.Name.ToLower() == "isdeleted").Any()}, SelectFilter = "a.IsDeleted = 1"{/if})] - public partial class {#UString(table.Name)} {{for col,index in table.Columns} - {if string.IsNullOrEmpty(col.Coment) == false}/// - /// {#col.Coment.Replace("\r\n", "\n").Replace("\n", "\r\n /// ")} - /// {/if} - [JsonProperty, Column(Name = "{#col.Name}", DbType = "{#col.DbTypeTextFull}"{if col.IsPrimary == true}, IsPrimary = true{/if}{if col.IsIdentity == true}, IsIdentity = true{/if}{if col.IsNullable == true}, IsNullable = true{/if})] - public {#GetCsType(col)} {#UString(col.Name)} { get; set; } - {/for} - } -} \ No newline at end of file diff --git a/Templates/SqlServer/simple-entity/readme.md b/Templates/SqlServer/simple-entity/readme.md deleted file mode 100644 index 96c9adcf..00000000 --- a/Templates/SqlServer/simple-entity/readme.md +++ /dev/null @@ -1,94 +0,0 @@ -# 生成器 - -生成器是基于 dbfirst 开发的辅助工具,适用老项目一键生成实体。生成器采用模板的方式,作者实现了三种生成模板: - -| 模板名称 | 类型映射 | 外键导航属性 | 缓存管理 | 失血 | 贫血 | 充血 | -| ------------- | - | - |- | - |- | - | -| simple-entity | √ | X | X | √ | X | X | -| simple-entity-navigation-object | √ | √ | X | √ | X | X | -| rich-entity-navigation-object | √ | √ | √ | X | √ | X | - -模板在项目目录:/Templates/MySql - -> 更多模板逐步开发中。。。 - -```csharp -//定义 mysql FreeSql -var mysql = new FreeSql.FreeSqlBuilder() - .UseConnectionString(FreeSql.DataType.MySql, "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10") - .Build(); - -//创建模板生成类实现 -var gen = new FreeSql.Generator.TemplateGenerator(); -gen.Build(mysql.DbFirst, - @"C:\Users\28810\Desktop\github\FreeSql\Templates\MySql\simple-entity", //模板目录(事先下载) - @"C:\Users\28810\Desktop\新建文件夹 (9)", //生成后保存的目录 - "cccddd" //数据库 -); -``` - -## 模板语法 - -```html - - -{#title} - - - - -{#表达式} -{##表达式} 当表达式可能发生runtime错误时使用,性能没有上面的高 - - -{include ../header.html} -
-

aaa

-

bbb {#i}

-

ccc {#i}

-
- - -{module module_name1 parms1, 2, 3...} -{/module} -{module module_name2 parms1, 2, 3...} -{/module} - - -{import ../module.html as myname} -{#myname.module_name(parms1, 2, 3...)} - - -{extends ../inc/layout.html} -{block body}{/block} - - -{% -for (var a = 0; a < 100; a++) - print(a); -%} - - -{if i === 50} -{elseif i > 60} -{else} -{/if} - - -{for i 1,101} 可自定义名 {for index2 表达式1 in 表达式2} - -{for item,index in items} 可选参数称 index - 可自定义名 {for item2, index99 in 数组表达式} - -{for key,item,index on json} 可选参数 item, index, - 可自定义名 {for key2, item2, index99 in 对象表达式} -{/for} - - -{miss} -此块内容不被bmw.js解析 -{/miss} - - - -``` \ No newline at end of file diff --git a/readme.md b/readme.md index cb00e799..e1572a6a 100644 --- a/readme.md +++ b/readme.md @@ -2,14 +2,6 @@ FreeSql 是一个功能强大的 .NETStandard 库,用于对象关系映射程 据了解,用户使用很少问问题,编码过程中,因业务阻塞,情有可原;因框架使用问题阻塞,得不偿失。我们的口号:做 .net 最方便的 ORM!愿每一位开发者嘴角上扬😏! -| Package Name | NuGet | Downloads | -|--------------| ------- | ---- | -| FreeSql | [![nuget](https://img.shields.io/nuget/v/FreeSql.svg?style=flat-square)](https://www.nuget.org/packages/FreeSql) | [![stats](https://img.shields.io/nuget/dt/FreeSql.svg?style=flat-square)](https://www.nuget.org/stats/packages/FreeSql?groupby=Version) | -| [FreeSql.Repository](https://github.com/2881099/FreeSql/wiki/Repository) | [![nuget](https://img.shields.io/nuget/v/FreeSql.Repository.svg?style=flat-square)](https://www.nuget.org/packages/FreeSql.Repository) | [![stats](https://img.shields.io/nuget/dt/FreeSql.Repository.svg?style=flat-square)](https://www.nuget.org/stats/packages/FreeSql.Repository?groupby=Version) | -| [FreeSql.DbContext](https://github.com/2881099/FreeSql.DbContext) | [![nuget](https://img.shields.io/nuget/v/FreeSql.DbContext.svg?style=flat-square)](https://www.nuget.org/packages/FreeSql.DbContext) | [![stats](https://img.shields.io/nuget/dt/FreeSql.DbContext.svg?style=flat-square)](https://www.nuget.org/stats/packages/FreeSql.DbContext?groupby=Version) | -| [FreeSql.AdminLTE](https://github.com/2881099/FreeSql.AdminLTE) | [![nuget](https://img.shields.io/nuget/v/FreeSql.AdminLTE.svg?style=flat-square)](https://www.nuget.org/packages/FreeSql.AdminLTE) | [![stats](https://img.shields.io/nuget/dt/FreeSql.AdminLTE.svg?style=flat-square)](https://www.nuget.org/stats/packages/FreeSql.AdminLTE?groupby=Version) | -| [FreeSql.Connection.Extensions](https://github.com/2881099/FreeSql.Connection.Extensions) | [![nuget](https://img.shields.io/nuget/v/FreeSql.Connection.Extensions.svg?style=flat-square)](https://www.nuget.org/packages/FreeSql.Connection.Extensions) | [![stats](https://img.shields.io/nuget/dt/FreeSql.Connection.Extensions.svg?style=flat-square)](https://www.nuget.org/stats/packages/FreeSql.Connection.Extensions?groupby=Version) | - # Features - [x] 支持 CodeFirst 迁移; @@ -29,9 +21,31 @@ FreeSql 是一个功能强大的 .NETStandard 库,用于对象关系映射程 | ![image](https://user-images.githubusercontent.com/16286519/55138263-06921480-516e-11e9-8da9-81f18a18b694.png) | [《Repository》](https://github.com/2881099/FreeSql/wiki/Repository) \| [《UnitOfWork》](https://github.com/2881099/FreeSql/wiki/%e5%b7%a5%e4%bd%9c%e5%8d%95%e5%85%83) \| [《过滤器》](https://github.com/2881099/FreeSql/wiki/%e8%bf%87%e6%bb%a4%e5%99%a8) \| [《乐观锁》](https://github.com/2881099/FreeSql/wiki/%e4%bf%ae%e6%94%b9) \| [《DbContext》](https://github.com/2881099/FreeSql/wiki/DbContext) | | ![image](https://user-images.githubusercontent.com/16286519/55138284-0eea4f80-516e-11e9-8764-29264807f402.png) | [《读写分离》](https://github.com/2881099/FreeSql/wiki/%e8%af%bb%e5%86%99%e5%88%86%e7%a6%bb) \| [《分区分表》](https://github.com/2881099/FreeSql/wiki/%e5%88%86%e5%8c%ba%e5%88%86%e8%a1%a8) \| [《租户》](https://github.com/2881099/FreeSql/wiki/%e7%a7%9f%e6%88%b7) \| [《AOP》](https://github.com/2881099/FreeSql/wiki/AOP) \| [*更新日志*](https://github.com/2881099/FreeSql/wiki/%e6%9b%b4%e6%96%b0%e6%97%a5%e5%bf%97) | +# Packages + +| Package Name | NuGet | Downloads | +|--------------| ------- | ---- | +| FreeSql | [![nuget](https://img.shields.io/nuget/v/FreeSql.svg?style=flat-square)](https://www.nuget.org/packages/FreeSql) | [![stats](https://img.shields.io/nuget/dt/FreeSql.svg?style=flat-square)](https://www.nuget.org/stats/packages/FreeSql?groupby=Version) | +| [FreeSql.Repository](https://github.com/2881099/FreeSql/wiki/Repository) | [![nuget](https://img.shields.io/nuget/v/FreeSql.Repository.svg?style=flat-square)](https://www.nuget.org/packages/FreeSql.Repository) | [![stats](https://img.shields.io/nuget/dt/FreeSql.Repository.svg?style=flat-square)](https://www.nuget.org/stats/packages/FreeSql.Repository?groupby=Version) | +| [FreeSql.DbContext](https://github.com/2881099/FreeSql.DbContext) | [![nuget](https://img.shields.io/nuget/v/FreeSql.DbContext.svg?style=flat-square)](https://www.nuget.org/packages/FreeSql.DbContext) | [![stats](https://img.shields.io/nuget/dt/FreeSql.DbContext.svg?style=flat-square)](https://www.nuget.org/stats/packages/FreeSql.DbContext?groupby=Version) | +| [FreeSql.AdminLTE](https://github.com/2881099/FreeSql.AdminLTE) | [![nuget](https://img.shields.io/nuget/v/FreeSql.AdminLTE.svg?style=flat-square)](https://www.nuget.org/packages/FreeSql.AdminLTE) | [![stats](https://img.shields.io/nuget/dt/FreeSql.AdminLTE.svg?style=flat-square)](https://www.nuget.org/stats/packages/FreeSql.AdminLTE?groupby=Version) | +| [FreeSql.Connection.Extensions](https://github.com/2881099/FreeSql.Connection.Extensions) | [![nuget](https://img.shields.io/nuget/v/FreeSql.Connection.Extensions.svg?style=flat-square)](https://www.nuget.org/packages/FreeSql.Connection.Extensions) | [![stats](https://img.shields.io/nuget/dt/FreeSql.Connection.Extensions.svg?style=flat-square)](https://www.nuget.org/stats/packages/FreeSql.Connection.Extensions?groupby=Version) | + +# Providers + +| Package Name | NuGet | Downloads | +|--------------| ------- | ---- | +| FreeSql.Provider.MySql | [![nuget](https://img.shields.io/nuget/v/FreeSql.Provider.MySql.svg?style=flat-square)](https://www.nuget.org/packages/FreeSql.Provider.MySql) | [![stats](https://img.shields.io/nuget/dt/FreeSql.Provider.MySql.svg?style=flat-square)](https://www.nuget.org/stats/packages/FreeSql.Provider.MySql?groupby=Version) | +| FreeSql.Provider.PostgreSQL | [![nuget](https://img.shields.io/nuget/v/FreeSql.Provider.PostgreSQL.svg?style=flat-square)](https://www.nuget.org/packages/FreeSql.Provider.PostgreSQL) | [![stats](https://img.shields.io/nuget/dt/FreeSql.Provider.PostgreSQL.svg?style=flat-square)](https://www.nuget.org/stats/packages/FreeSql.Provider.PostgreSQL?groupby=Version) | +| FreeSql.Provider.SqlServer | [![nuget](https://img.shields.io/nuget/v/FreeSql.Provider.SqlServer.svg?style=flat-square)](https://www.nuget.org/packages/FreeSql.Provider.SqlServer) | [![stats](https://img.shields.io/nuget/dt/FreeSql.Provider.SqlServer.svg?style=flat-square)](https://www.nuget.org/stats/packages/FreeSql.Provider.SqlServer?groupby=Version) | +| FreeSql.Provider.Sqlite | [![nuget](https://img.shields.io/nuget/v/FreeSql.Provider.Sqlite.svg?style=flat-square)](https://www.nuget.org/packages/FreeSql.Provider.Sqlite) | [![stats](https://img.shields.io/nuget/dt/FreeSql.Provider.MySqliteSql.svg?style=flat-square)](https://www.nuget.org/stats/packages/FreeSql.Provider.Sqlite?groupby=Version) | +| FreeSql.Provider.Oracle | [![nuget](https://img.shields.io/nuget/v/FreeSql.Provider.Oracle.svg?style=flat-square)](https://www.nuget.org/packages/FreeSql.Provider.Oracle) | [![stats](https://img.shields.io/nuget/dt/FreeSql.Provider.Oracle.svg?style=flat-square)](https://www.nuget.org/stats/packages/FreeSql.Provider.Oracle?groupby=Version) | +| FreeSql.Extensions.LazyLoading | [![nuget](https://img.shields.io/nuget/v/FreeSql.Extensions.LazyLoading.svg?style=flat-square)](https://www.nuget.org/packages/FreeSql.Extensions.LazyLoading) | [![stats](https://img.shields.io/nuget/dt/FreeSql.Extensions.LazyLoading.svg?style=flat-square)](https://www.nuget.org/stats/packages/FreeSql.Extensions.LazyLoading?groupby=Version) | + # Quick start > dotnet add package FreeSql +> dotnet add package FreeSql.Provider.Sqlite ```csharp IFreeSql fsql = new FreeSql.FreeSqlBuilder()