From 8e2aa2b44b8ebbce63a66b394cd0318bd8756cde Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Tue, 21 Nov 2023 14:21:11 +0800 Subject: [PATCH] =?UTF-8?q?Clickhouse=20=E6=95=B0=E7=BB=84=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E5=8C=96=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ClickHouse/ClickHouseTest3.cs | 37 +++++++++++++------ FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml | 5 +++ .../ClickHouseCodeFirst.cs | 17 ++++++++- .../ClickHouseUtils.cs | 10 +++-- 4 files changed, 53 insertions(+), 16 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs index 87abfe4c..f375df23 100644 --- a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs +++ b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using FreeSql.DataAnnotations; +using Newtonsoft.Json; using Xunit; using Xunit.Abstractions; @@ -21,7 +22,7 @@ namespace FreeSql.Tests.ClickHouse _fsql = new FreeSqlBuilder().UseConnectionString(DataType.ClickHouse, "Host=192.168.1.123;Port=8123;Database=test;Compress=True;Min Pool Size=1") .UseMonitorCommand(cmd => _output.WriteLine($"线程:{cmd.CommandText}\r\n")) - .UseNoneCommandParameter(true) + .UseNoneCommandParameter(false) .Build(); } @@ -118,18 +119,32 @@ namespace FreeSql.Tests.ClickHouse } /// - /// 测试Array类型映射 + /// 测试Array类型插入 /// [Fact] public void ArrayBoolMappingInsert() { - _ = _fsql.Insert(new ArrayMappingTestSimple + var source = new List() { - Name = "daily", - Tags1 = new List() { "a", "b", "c" }, - Tags2 = new List() { 1, 2, 3, 4 }, - Tags3 = new List() { true, true, false } - }).ExecuteAffrows(); + new ArrayMappingTestSimple + { + Name = "daily", + Tags1 = new [] { "e", "f", "g" }, + Tags2 = new [] { 3, 45, 100, 400 }, + Tags3 = new [] { false, true, false } + } + }; + var str = _fsql.Insert(source).ExecuteAffrows(); + } + + /// + /// 测试Array类型映射 + /// + [Fact] + public void ArrayBoolMappingSelect() + { + var list = _fsql.Select().ToList(); + _output.WriteLine(JsonConvert.SerializeObject(list)); } } @@ -176,10 +191,10 @@ namespace FreeSql.Tests.ClickHouse [Column(Name = "name", IsPrimary = true)] public string Name { get; set; } - [Column(Name = "tags1")] public IEnumerable Tags1 { get; set; } + [Column(Name = "tags1")] public string [] Tags1 { get; set; } - [Column(Name = "tags2")] public List Tags2 { get; set; } + [Column(Name = "tags2")] public int[] Tags2 { get; set; } - [Column(Name = "tags3")] public IEnumerable Tags3 { get; set; } + [Column(Name = "tags3")] public bool [] Tags3 { get; set; } } } \ No newline at end of file diff --git a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml index a4862081..13f136a0 100644 --- a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml +++ b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml @@ -35,6 +35,11 @@ + + 测试Array类型插入 + + + 测试Array类型映射 diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs index c1296886..77bb5991 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs @@ -85,7 +85,7 @@ namespace FreeSql.ClickHouse trydc.defaultValue); //判断是否是集合 - var isCollection = IsCollection(type); + var isCollection = IsArray(type); if (isCollection.Item1) { var genericType = isCollection.Item2; @@ -102,6 +102,21 @@ namespace FreeSql.ClickHouse return null; } + + private Tuple IsArray(Type type) + { + var flag = false; + Type resultType = null; + + if (type.IsArray) + { + flag = true; + resultType = type.GetElementType(); + } + + return new Tuple(flag, resultType); + } + private Tuple IsCollection(Type type) { var flag = false; diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseUtils.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseUtils.cs index 38a74d35..da3fb3ff 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseUtils.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseUtils.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Data.Common; using System.Globalization; using System.Data; +using System.Text.Json; using ClickHouse.Client.ADO.Parameters; using System.Text.RegularExpressions; @@ -18,7 +19,7 @@ namespace FreeSql.ClickHouse } public override DbParameter AppendParamter(List _params, string parameterName, ColumnInfo col, Type type, object value) - { + { if (value is string str) value = str?.Replace("\t", "\\t") .Replace("\r\n", "\\r\\n") @@ -43,9 +44,10 @@ namespace FreeSql.ClickHouse if (col.DbScale != 0) ret.Scale = col.DbScale; break; } - //直接使用Bool - //if (value is bool) - // ret.Value = (bool)value ? 1 : 0; + //if (value.GetType().IsArray) + //{ + // ret.DbType = DbType.Object; + //} } _params?.Add(ret); return ret;