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
+
+