From 330b84b3f116fa08191f0c75d1923d563583acb3 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Wed, 10 Dec 2025 16:00:25 +0800 Subject: [PATCH] =?UTF-8?q?=20-=20feat(DateOnly):=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=88=B0=20Clickhouse=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 17 +++ FreeSql/FreeSql.xml | 109 ------------------ .../ClickHouseAdo/ClickHouseAdo.cs | 10 ++ .../ClickHouseCodeFirst.cs | 28 ++--- .../ClickHouseProvider.cs | 22 +++- .../FreeSql.Provider.ClickHouse.csproj | 6 +- 6 files changed, 61 insertions(+), 131 deletions(-) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index e6ab97073..2f95808f4 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -742,6 +742,15 @@ + + + 根据Assembly扫描所有继承IEntityTypeConfiguration<T>的配置类 + + + + + + 创建普通数据上下文档对象 @@ -779,5 +788,13 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 7b3d7b06e..1f4f5d651 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1097,93 +1097,6 @@ - - - 动态创建实体类型 - - - - - 配置Class - - 类名 - 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] - - - - - 获取类型构建器,可作为要构建的Type来引用 - - - - - 配置属性 - - 属性名称 - 属性类型 - 属性标记的特性-支持多个 - - - - - 配置属性 - - 属性名称 - 属性类型 - 该属性是否重写父类属性 - 属性标记的特性-支持多个 - - - - - 配置属性 - - 属性名称 - 属性类型 - 该属性是否重写父类属性 - 属性默认值 - 属性标记的特性-支持多个 - - - - - 配置父类 - - 父类类型 - - - - - Override属性 - - - - - - Emit动态创建出Class - Type - - - - - - Emit动态创建出Class - Type,不附带获取TableInfo - - - - - - 首字母小写 - - - - - - - 首字母大写 - - - - 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 "" @@ -6009,28 +5922,6 @@ 对象池 - - - 动态构建Class Type - - - - - - 根据字典,创建 table 对应的实体对象 - - - - - - - - 根据实体对象,创建 table 对应的字典 - - - - - C#: that >= between && that <= and diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseAdo.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseAdo.cs index b7e274377..d7b777213 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseAdo.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseAdo.cs @@ -63,6 +63,16 @@ namespace FreeSql.ClickHouse else if (param is DateTime?) return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'"); +#if net60 + else if (param is DateOnly || param is DateOnly?) + return AddslashesTypeHandler(typeof(DateOnly), param) ?? string.Concat("'", ((DateOnly)param).ToString("yyyy-MM-dd"), "'"); + else if (param is TimeOnly || param is TimeOnly?) + { + var ts = (TimeOnly)param; + return $"'{ts.Hour}:{ts.Minute}:{ts.Second}'"; + } +#endif + else if (param is TimeSpan || param is TimeSpan?) { var ts = (TimeSpan)param; diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs index f421e4f0a..7b4bd9e56 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs @@ -51,26 +51,16 @@ namespace FreeSql.ClickHouse { typeof(double?).FullName, CsToDb.New(DbType.Double, "Float64", "Nullable(Float64)", false, true, null) }, { typeof(float).FullName, CsToDb.New(DbType.Single, "Float32", "Float32", false, false, 0) }, { typeof(float?).FullName, CsToDb.New(DbType.Single, "Float32", "Nullable(Float32)", false, true, null) }, - { - typeof(decimal).FullName, - CsToDb.New(DbType.Decimal, "Decimal(38, 19)", "Decimal(38, 19)", false, false, - 0) //Nullable(Decimal(38, 19)) - }, - { - typeof(decimal?).FullName, - CsToDb.New(DbType.Decimal, "Nullable(Decimal(38, 19))", "Nullable(Decimal(38, 19))", false, true, null) - }, + { typeof(decimal).FullName, CsToDb.New(DbType.Decimal, "Decimal(38, 19)", "Decimal(38, 19)", false, false, 0) }, //Nullable(Decimal(38, 19)) + { typeof(decimal?).FullName, CsToDb.New(DbType.Decimal, "Nullable(Decimal(38, 19))", "Nullable(Decimal(38, 19))", false, true, null) }, - { - typeof(DateTime).FullName, - CsToDb.New(DbType.DateTime, "DateTime('Asia/Shanghai')", "DateTime('Asia/Shanghai')", false, false, - new DateTime(1970, 1, 1)) - }, - { - typeof(DateTime?).FullName, - CsToDb.New(DbType.DateTime, "DateTime('Asia/Shanghai')", "Nullable(DateTime('Asia/Shanghai'))", false, - true, null) - }, + { typeof(DateTime).FullName, CsToDb.New(DbType.DateTime, "DateTime('Asia/Shanghai')", "DateTime('Asia/Shanghai')", false, false, new DateTime(1970, 1, 1)) }, + { typeof(DateTime?).FullName, CsToDb.New(DbType.DateTime, "DateTime('Asia/Shanghai')", "Nullable(DateTime('Asia/Shanghai'))", false, true, null) }, + +#if net60 + { typeof(TimeOnly).FullName, CsToDb.New(DbType.Time, "time", "time NOT NULL", false, false, TimeOnly.MinValue) },{ typeof(TimeOnly?).FullName, CsToDb.New(DbType.Time, "time", "time", false, true, null) }, + { typeof(DateOnly).FullName, CsToDb.New(DbType.Date, "date", "date NOT NULL", false, false, new DateTime(1970,1,1)) },{ typeof(DateOnly?).FullName, CsToDb.New(DbType.Date, "date", "date", false, true, null) }, +#endif { typeof(string).FullName, CsToDb.New(DbType.String, "String", "String", false, null, "") }, { typeof(char).FullName, CsToDb.New(DbType.String, "String", "String", false, false, "") }, diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseProvider.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseProvider.cs index 41ff2dba6..3bb398be5 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseProvider.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseProvider.cs @@ -1,9 +1,11 @@ -using FreeSql.Internal; +using FreeSql.ClickHouse.Curd; +using FreeSql.Internal; using FreeSql.Internal.CommonProvider; -using FreeSql.ClickHouse.Curd; using System; +using System.Collections; using System.Data.Common; using System.Linq.Expressions; +using System.Numerics; using System.Threading; namespace FreeSql.ClickHouse @@ -11,6 +13,21 @@ namespace FreeSql.ClickHouse public class ClickHouseProvider : BaseDbProvider, IFreeSql { + static int _firstInit = 1; + static void InitInternal() + { + if (Interlocked.Exchange(ref _firstInit, 0) == 1) //不能放在 static ctor .NetFramework 可能报初始化类型错误 + { +#if net60 + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(DateOnly)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(TimeOnly)] = true; +#endif + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(BigInteger)] = true; + Utils.dicExecuteArrayRowReadClassOrTuple[typeof(BitArray)] = true; + Select0Provider._dicMethodDataReaderGetValue[typeof(Guid)] = typeof(DbDataReader).GetMethod("GetGuid", new Type[] { typeof(int) }); + } + } + public override ISelect CreateSelectProvider(object dywhere) => new ClickHouseSelect(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere); public override IInsert CreateInsertProvider() => new ClickHouseInsert(this, this.InternalCommonUtils, this.InternalCommonExpression); public override IUpdate CreateUpdateProvider(object dywhere) => new ClickHouseUpdate(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere); @@ -21,6 +38,7 @@ namespace FreeSql.ClickHouse } public ClickHouseProvider(string masterConnectionString, string[] slaveConnectionString, Func connectionFactory = null) { + InitInternal(); this.InternalCommonUtils = new ClickHouseUtils(this); this.InternalCommonExpression = new ClickHouseExpression(this.InternalCommonUtils); diff --git a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj index 44f3e81be..2c9cfe658 100644 --- a/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj +++ b/Providers/FreeSql.Provider.ClickHouse/FreeSql.Provider.ClickHouse.csproj @@ -2,7 +2,7 @@ 9 - netstandard2.1 + net10.0;net9.0;net8.0;net7.0;net6.0;netstandard2.1 true FreeSql;ncc;YeXiangQin;ChenBo FreeSql 数据库实现,基于 ClickHouse.Client Ado.net @@ -36,5 +36,9 @@ + + net60 + +