From dc73a1571ab452ae15f7d3f81d4f43153e3e97d9 Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Tue, 21 Nov 2023 09:03:59 +0800 Subject: [PATCH 01/14] =?UTF-8?q?=E4=BC=98=E5=8C=96Bool=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E6=98=A0=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs index b6293849..38763de3 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs @@ -23,8 +23,8 @@ namespace FreeSql.ClickHouse static Dictionary> _dicCsToDb = new Dictionary>() { - { typeof(bool).FullName, CsToDb.New(DbType.SByte, "Int8", "Int8", null, false, false) }, - { typeof(bool?).FullName, CsToDb.New(DbType.SByte, "Int8", "Nullable(Int8)", null, true, null) }, + { typeof(bool).FullName, CsToDb.New(DbType.SByte, "Bool", "Bool", null, false, false) }, + { typeof(bool?).FullName, CsToDb.New(DbType.SByte, "Bool", "Nullable(Bool)", null, true, null) }, { typeof(sbyte).FullName, CsToDb.New(DbType.SByte, "Int8", "Int8", false, false, 0) }, { typeof(sbyte?).FullName, CsToDb.New(DbType.SByte, "Int8", "Nullable(Int8)", false, true, null) }, From 3528c01c5b0a2674b967020112155c325aff7125 Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Tue, 21 Nov 2023 09:39:34 +0800 Subject: [PATCH 02/14] =?UTF-8?q?=E6=B5=8B=E8=AF=95ClickHouse=20Bool?= =?UTF-8?q?=E6=98=A0=E5=B0=84=E6=8F=92=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ClickHouse/ClickHouseTest2.cs | 4 + .../ClickHouse/ClickHouseTest3.cs | 87 +++++++++++++++++++ .../ClickHouseUtils.cs | 5 +- 3 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs diff --git a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest2.cs b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest2.cs index 9bc76f41..b96e8e9d 100644 --- a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest2.cs +++ b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest2.cs @@ -8,11 +8,14 @@ using System.Diagnostics; using System.ComponentModel.DataAnnotations; using FreeSql.DataAnnotations; using Xunit; +using Xunit.Abstractions; namespace FreeSql.Tests.ClickHouse { public class ClickHouseTest2 { + + private static IFreeSql fsql = new FreeSqlBuilder().UseConnectionString(DataType.ClickHouse, "Host=127.0.0.1;Port=8123;Database=test;Compress=True;Min Pool Size=1") .UseMonitorCommand(cmd => Console.WriteLine($"线程:{cmd.CommandText}\r\n")) @@ -29,6 +32,7 @@ namespace FreeSql.Tests.ClickHouse { fsql.CodeFirst.SyncStructure(typeof(PositionInfoModel)); } + [Fact] public void Issuse1587TestOnePrimary() { diff --git a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs new file mode 100644 index 00000000..fc990939 --- /dev/null +++ b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using FreeSql.DataAnnotations; +using Xunit; +using Xunit.Abstractions; + +namespace FreeSql.Tests.ClickHouse +{ + public class ClickHouseTest3 + { + private static ITestOutputHelper _output; + private static IFreeSql _fsql; + + public ClickHouseTest3(ITestOutputHelper output) + { + _output = output; + _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(false) + .Build(); + } + + /// + /// 测试bool类型映射 + /// + [Fact] + public void TestBoolMappingSync() + { + _fsql.CodeFirst.SyncStructure(typeof(BoolMappingTest)); + + } + + /// + /// 测试bool类型映射 + /// + [Fact] + public void TestBoolMappingInsert() + { + _fsql.Insert(new BoolMappingTest + { + Name = "Tom", + Age = 20, + Id = Guid.NewGuid().ToString(), + IsDelete = true, + IsEnable = true + }).ExecuteAffrows(); + + _fsql.Insert(new BoolMappingTest + { + Name = "Jess", + Age = 21, + Id = Guid.NewGuid().ToString(), + IsDelete = true, + IsEnable = false + }).ExecuteAffrows(); + + _fsql.Insert(new BoolMappingTest + { + Name = "Daily", + Age = 22, + Id = Guid.NewGuid().ToString(), + IsDelete = true, + IsEnable = null + }).ExecuteAffrows(); + } + + } + + [Table(Name = "table_test_bool")] + public class BoolMappingTest + { + [Column(IsPrimary = true, Name = "id")] + public string Id { set; get; } + + [Column(Name = "name")] public string Name { get; set; } + + [Column(Name = "age")] public int Age { get; set; } + + [Column(Name = "is_delete")] public bool IsDelete { get; set; } + + [Column(Name = "is_enable")] public bool? IsEnable { get; set; } + } +} \ No newline at end of file diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseUtils.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseUtils.cs index 126b0704..c2ec7634 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseUtils.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseUtils.cs @@ -43,8 +43,9 @@ namespace FreeSql.ClickHouse if (col.DbScale != 0) ret.Scale = col.DbScale; break; } - if (value is bool) - ret.Value = (bool)value ? 1 : 0; + //直接使用Bool + //if (value is bool) + // ret.Value = (bool)value ? 1 : 0; } _params?.Add(ret); return ret; From bfb438ee08a60182598c4ea66efd057d81ce7550 Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Tue, 21 Nov 2023 09:53:28 +0800 Subject: [PATCH 03/14] =?UTF-8?q?Clickhouse=20Bool=E7=B1=BB=E5=9E=8BParame?= =?UTF-8?q?ter=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FreeSql.Tests/ClickHouse/ClickHouseTest3.cs | 16 ++++++++++++---- .../ClickHouseAdo/ClickHouseAdo.cs | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs index fc990939..52819284 100644 --- a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs +++ b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs @@ -20,7 +20,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(false) + .UseNoneCommandParameter(true) .Build(); } @@ -35,7 +35,7 @@ namespace FreeSql.Tests.ClickHouse } /// - /// 测试bool类型映射 + /// 测试bool类型插入 /// [Fact] public void TestBoolMappingInsert() @@ -63,11 +63,19 @@ namespace FreeSql.Tests.ClickHouse Name = "Daily", Age = 22, Id = Guid.NewGuid().ToString(), - IsDelete = true, - IsEnable = null + IsDelete = false, + IsEnable = false }).ExecuteAffrows(); } + /// + /// 测试bool类型查询 + /// + [Fact] + public void TestBoolMappingSelect() + { + var list = _fsql.Select().ToList(); + } } [Table(Name = "table_test_bool")] diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseAdo.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseAdo.cs index 3ba93410..d3de56e4 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseAdo.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseAdo.cs @@ -48,7 +48,7 @@ namespace FreeSql.ClickHouse param = Utils.GetDataReaderValue(mapType, param); if (param is bool || param is bool?) - return (bool)param ? 1 : 0; + return (bool)param; //不需要转0/1 else if (param is string) return string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\"), "'"); //只有 mysql 需要处理反斜杠 else if (param is char) From 2e14568b533e730e5bb9ff41660b8d2fbec954bc Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Tue, 21 Nov 2023 09:54:47 +0800 Subject: [PATCH 04/14] =?UTF-8?q?Clickhouse=20NoneCommandParameter?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FreeSql.Tests/ClickHouse/ClickHouseTest3.cs | 2 +- FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs index 52819284..fbfff577 100644 --- a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs +++ b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs @@ -20,7 +20,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(); } diff --git a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml index 23fd15f0..3fd2b953 100644 --- a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml +++ b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml @@ -4,6 +4,21 @@ FreeSql.Tests + + + 测试bool类型映射 + + + + + 测试bool类型插入 + + + + + 测试bool类型查询 + + 实时数据 From 35c4cfb3e2bcdf5df8565e439b84f46be4d1a95f Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Tue, 21 Nov 2023 09:57:55 +0800 Subject: [PATCH 05/14] =?UTF-8?q?Clickhouse=20Update=20Set=20NoneCommandPa?= =?UTF-8?q?rameter=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FreeSql.Tests/ClickHouse/ClickHouseTest3.cs | 16 ++++++++++++++-- FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml | 5 +++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs index fbfff577..cb265bee 100644 --- a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs +++ b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs @@ -20,7 +20,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(false) + .UseNoneCommandParameter(true) .Build(); } @@ -31,7 +31,6 @@ namespace FreeSql.Tests.ClickHouse public void TestBoolMappingSync() { _fsql.CodeFirst.SyncStructure(typeof(BoolMappingTest)); - } /// @@ -68,6 +67,19 @@ namespace FreeSql.Tests.ClickHouse }).ExecuteAffrows(); } + /// + /// 测试bool类型修改 + /// + [Fact] + public void TestBoolMappingUpdate() + { + _fsql.Update() + .Set(t => t.IsDelete, false) + .Where(b => b.Age > 10) + .ExecuteAffrows(); + } + + /// /// 测试bool类型查询 /// diff --git a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml index 3fd2b953..66065318 100644 --- a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml +++ b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml @@ -14,6 +14,11 @@ 测试bool类型插入 + + + 测试bool类型修改 + + 测试bool类型查询 From e6a42ee2d2241b98c530d62ee40210999a9c8d60 Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Tue, 21 Nov 2023 09:59:18 +0800 Subject: [PATCH 06/14] =?UTF-8?q?Clickhouse=20Update=20Set=20Parameter?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs index cb265bee..8bbeff68 100644 --- a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs +++ b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs @@ -20,7 +20,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(); } @@ -74,7 +74,7 @@ namespace FreeSql.Tests.ClickHouse public void TestBoolMappingUpdate() { _fsql.Update() - .Set(t => t.IsDelete, false) + .Set(t => t.IsDelete, true) .Where(b => b.Age > 10) .ExecuteAffrows(); } From 84f2ab4d415e5cc96718f07f3974fb3ebcf645cf Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Tue, 21 Nov 2023 10:01:26 +0800 Subject: [PATCH 07/14] =?UTF-8?q?Clickhouse=20Update=20=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ClickHouse/ClickHouseTest3.cs | 20 ++++++++++++++++++- FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml | 5 +++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs index 8bbeff68..ecad96a1 100644 --- a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs +++ b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs @@ -71,7 +71,7 @@ namespace FreeSql.Tests.ClickHouse /// 测试bool类型修改 /// [Fact] - public void TestBoolMappingUpdate() + public void TestBoolMappingUpdateSet() { _fsql.Update() .Set(t => t.IsDelete, true) @@ -79,6 +79,24 @@ namespace FreeSql.Tests.ClickHouse .ExecuteAffrows(); } + /// + /// 测试bool类型修改 + /// + [Fact] + public void TestBoolMappingUpdate() + { + _fsql.Update() + .SetSource(new BoolMappingTest + { + Id = "af199304-239a-48da-9c75-1d5e36167d74", + IsEnable = false, + IsDelete = true, + Age = 60, + Name = "Update" + }) + .ExecuteAffrows(); + } + /// /// 测试bool类型查询 diff --git a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml index 66065318..5f6bcd3a 100644 --- a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml +++ b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml @@ -14,6 +14,11 @@ 测试bool类型插入 + + + 测试bool类型修改 + + 测试bool类型修改 From 322332cf73ae8e76a1fd49fb39a3ea4359812f78 Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Tue, 21 Nov 2023 11:20:54 +0800 Subject: [PATCH 08/14] =?UTF-8?q?Clickhouse=20Array=E6=B3=9B=E5=9E=8B?= =?UTF-8?q?=E6=98=A0=E5=B0=84=E5=8A=9F=E8=83=BD=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ClickHouse/ClickHouseTest3.cs | 33 +++++++- FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml | 5 ++ .../ClickHouseCodeFirst.cs | 84 +++++++++++++++---- 3 files changed, 106 insertions(+), 16 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs index ecad96a1..953eef71 100644 --- a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs +++ b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; @@ -20,7 +21,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(false) + .UseNoneCommandParameter(true) .Build(); } @@ -106,6 +107,15 @@ namespace FreeSql.Tests.ClickHouse { var list = _fsql.Select().ToList(); } + + /// + /// 测试Array类型映射 + /// + [Fact] + public void ArrayBoolMappingSync() + { + _fsql.CodeFirst.SyncStructure(typeof(ArrayMappingTest)); + } } [Table(Name = "table_test_bool")] @@ -122,4 +132,25 @@ namespace FreeSql.Tests.ClickHouse [Column(Name = "is_enable")] public bool? IsEnable { get; set; } } + + [Table(Name = "table_test_array")] + public class ArrayMappingTest + { + [Column(Name = "name", IsPrimary = true)] + public string Name { get; set; } + + [Column(Name = "tags1")] public IEnumerable Tags1 { get; set; } + + [Column(Name = "tags2")] public IList Tags2 { get; set; } + + [Column(Name = "tags3")] public List Tags3 { get; set; } + + [Column(Name = "tags4")] public ArrayList Tags4 { get; set; } + + [Column(Name = "tags5")] public Array Tags5 { get; set; } + + [Column(Name = "tags6")] public List Tags6 { get; set; } + + [Column(Name = "tags7")] public IEnumerable Tags7 { 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 5f6bcd3a..5f515a4c 100644 --- a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml +++ b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml @@ -29,6 +29,11 @@ 测试bool类型查询 + + + 测试Array类型映射 + + 实时数据 diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs index 38763de3..c1296886 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs @@ -1,6 +1,7 @@ using FreeSql.Internal; using FreeSql.Internal.Model; using System; +using System.Collections; using System.Collections.Generic; using System.Data; using System.Linq; @@ -50,7 +51,8 @@ namespace FreeSql.ClickHouse { 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)) + CsToDb.New(DbType.Decimal, "Decimal(38, 19)", "Decimal(38, 19)", false, false, + 0) //Nullable(Decimal(38, 19)) }, { typeof(decimal?).FullName, @@ -75,16 +77,68 @@ namespace FreeSql.ClickHouse { typeof(Guid?).FullName, CsToDb.New(DbType.String, "String", "Nullable(String)", false, true, null) }, }; + public override DbInfoResult GetDbInfo(Type type) { if (_dicCsToDb.TryGetValue(type.FullName, out var trydc)) return new DbInfoResult((int)trydc.type, trydc.dbtype, trydc.dbtypeFull, trydc.isnullable, trydc.defaultValue); - if (type.IsArray) - return null; + + //判断是否是集合 + var isCollection = IsCollection(type); + if (isCollection.Item1) + { + var genericType = isCollection.Item2; + var genericTypeName = genericType?.FullName; + var tryGetValue = _dicCsToDb.TryGetValue(genericTypeName, out var value); + if (tryGetValue) + { + var arrayDbType = $"Array({value.dbtype})"; + var defaultArray = new ArrayList(0); + return new DbInfoResult(Convert.ToInt32(DbType.Object), arrayDbType, arrayDbType, false,defaultArray); + } + + } return null; } + private Tuple IsCollection(Type type) + { + var flag = false; + Type resultType = null; + var interfaces = type.GetInterfaces(); + + if (interfaces.Any(t => t.Name == "IList")) + flag = true; + + if (interfaces.Any(t => t.Name == "ICollection")) + flag = true; + + if (interfaces.Any(t => t.Name == "IEnumerable")) + flag = true; + + if (type.Name == "Array") + { + flag = true; + resultType = typeof(string); + } + + if (type.Name == "ArrayList") + { + flag = true; + resultType = typeof(string); + } + + //是否是泛型 + if (type.GetGenericArguments().Any()) + { + var first = type.GetGenericArguments().First(); + resultType = first; + } + + return new Tuple(flag, resultType); + } + protected override string GetComparisonDDLStatements(params TypeAndName[] objects) { Object conn = null; @@ -299,7 +353,8 @@ where a.database in ({0}) and a.table in ({1})", tboldname ?? tbname); //添加列 sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName(tbname[0], tbname[1])) - .Append(" ADD Column ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ") + .Append(" ADD Column ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)) + .Append(" ") .Append(tbcol.Attribute.DbType); if (tbcol.Attribute.IsNullable == false && tbcol.DbDefaultValue != "NULL" && tbcol.Attribute.IsIdentity == false) @@ -483,7 +538,7 @@ where a.database in ({0}) and a.table in ({1})", tboldname ?? tbname); cmd.CommandText = sql; cmd.CommandType = CommandType.Text; var before = new Aop.CommandBeforeEventArgs(cmd); - this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); + this._orm?.Aop.CommandBeforeHandler?.Invoke(this._orm, before); Exception afterException = null; try { @@ -496,7 +551,8 @@ where a.database in ({0}) and a.table in ({1})", tboldname ?? tbname); } finally { - this._orm?.Aop.CommandAfterHandler?.Invoke(this._orm, new Aop.CommandAfterEventArgs(before, afterException, null)); + this._orm?.Aop.CommandAfterHandler?.Invoke(this._orm, + new Aop.CommandAfterEventArgs(before, afterException, null)); } } } @@ -511,12 +567,13 @@ where a.database in ({0}) and a.table in ({1})", tboldname ?? tbname); { if (isPrimary) { - if (dbType.Contains("Nullable")) + if (dbType.Contains("Nullable")) return dbType.Replace("Nullable(", "") .Replace(")", "") .Replace(" NOT NULL", ""); return dbType; } + return dbType.Replace(" NOT NULL", ""); } @@ -524,6 +581,9 @@ where a.database in ({0}) and a.table in ({1})", tboldname ?? tbname); string CkIntAdapter(string dbType) { var result = dbType; + if (dbType.Contains("Array")) + return dbType; + if (dbType.ToLower().Contains("int64")) { if (dbType.Contains("Nullable")) @@ -578,13 +638,7 @@ where a.database in ({0}) and a.table in ({1})", tboldname ?? tbname); internal class ClickHouseTableIndex { - public string name - { - get; set; - } - public string expr - { - get; set; - } + public string name { get; set; } + public string expr { get; set; } } } \ No newline at end of file From d91c7fbdfd64fc9dc18a997560d7aeb480b64a3a Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Tue, 21 Nov 2023 11:40:22 +0800 Subject: [PATCH 09/14] =?UTF-8?q?Clickhouse=20Array=E6=B3=9B=E5=9E=8B?= =?UTF-8?q?=E6=8F=92=E5=85=A5=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ClickHouse/ClickHouseTest3.cs | 31 ++++++++++++++++++- FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml | 5 +++ .../AdoProvider/AdoProviderUtils.cs | 2 +- .../ClickHouseUtils.cs | 2 +- 4 files changed, 37 insertions(+), 3 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs index 953eef71..87abfe4c 100644 --- a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs +++ b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs @@ -114,7 +114,22 @@ namespace FreeSql.Tests.ClickHouse [Fact] public void ArrayBoolMappingSync() { - _fsql.CodeFirst.SyncStructure(typeof(ArrayMappingTest)); + _fsql.CodeFirst.SyncStructure(typeof(ArrayMappingTestSimple)); + } + + /// + /// 测试Array类型映射 + /// + [Fact] + public void ArrayBoolMappingInsert() + { + _ = _fsql.Insert(new ArrayMappingTestSimple + { + Name = "daily", + Tags1 = new List() { "a", "b", "c" }, + Tags2 = new List() { 1, 2, 3, 4 }, + Tags3 = new List() { true, true, false } + }).ExecuteAffrows(); } } @@ -153,4 +168,18 @@ namespace FreeSql.Tests.ClickHouse [Column(Name = "tags7")] public IEnumerable Tags7 { get; set; } } + + [Table(Name = "table_test_array_simple")] + public class ArrayMappingTestSimple + + { + [Column(Name = "name", IsPrimary = true)] + public string Name { get; set; } + + [Column(Name = "tags1")] public IEnumerable Tags1 { get; set; } + + [Column(Name = "tags2")] public List Tags2 { get; set; } + + [Column(Name = "tags3")] public IEnumerable 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 5f515a4c..a4862081 100644 --- a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml +++ b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml @@ -34,6 +34,11 @@ 测试Array类型映射 + + + 测试Array类型映射 + + 实时数据 diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderUtils.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderUtils.cs index a5461a4d..001c2b4e 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderUtils.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderUtils.cs @@ -43,7 +43,7 @@ namespace FreeSql.Internal.CommonProvider sb.Append(AddslashesProcessParam(z, mapType, mapColumn)); } - return sb.Length == 0 ? "(NULL)" : sb.Remove(0, 1).Insert(0, "(").Append(")").ToString(); + return sb.Length == 0 ? "(NULL)" : sb.Remove(0, 1).Insert(0, "[").Append("]").ToString(); } public static bool IsFromSlave(string cmdText) diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseUtils.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseUtils.cs index c2ec7634..38a74d35 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseUtils.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseUtils.cs @@ -146,7 +146,7 @@ namespace FreeSql.ClickHouse } public override string GetNoneParamaterSqlValue(List specialParams, string specialParamFlag, ColumnInfo col, Type type, object value) - { + { if (value == null) return "NULL"; if (type.IsNumberType()) return string.Format(CultureInfo.InvariantCulture, "{0}", value); if (type == typeof(byte[])) return $"0x{CommonUtils.BytesSqlRaw(value as byte[])}"; 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 10/14] =?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; From 89803df4b05dba152e8a05c326722d0c9f41e8f1 Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Tue, 21 Nov 2023 14:24:05 +0800 Subject: [PATCH 11/14] =?UTF-8?q?Cilckhouse=20Array=E6=97=A0=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E5=8C=96=E6=8F=92=E5=85=A5=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs index f375df23..b92f5915 100644 --- a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs +++ b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs @@ -22,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(false) + .UseNoneCommandParameter(true) .Build(); } From 57b0347c9431c9346d84bf7f3b02d288beaae98c Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Thu, 30 Nov 2023 15:48:59 +0800 Subject: [PATCH 12/14] =?UTF-8?q?=E6=B5=8B=E8=AF=95Array=E5=B8=B8=E7=94=A8?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ClickHouse/ClickHouseTest3.cs | 249 +++++++++++++++++- FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml | 72 +++++ .../ClickHouseCodeFirst.cs | 6 +- .../ClickHouseExpression.cs | 48 +++- .../ClickHouseExtensions.cs | 45 +++- .../Curd/ClickHouseInsert.cs | 31 ++- 6 files changed, 416 insertions(+), 35 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs index b92f5915..8cd0473a 100644 --- a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs +++ b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs @@ -1,8 +1,11 @@ using System; using System.Collections; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; +using System.Linq.Expressions; using System.Text; +using System.Threading; using System.Threading.Tasks; using FreeSql.DataAnnotations; using Newtonsoft.Json; @@ -126,15 +129,15 @@ namespace FreeSql.Tests.ClickHouse { var source = new List() { - new ArrayMappingTestSimple + new() { Name = "daily", - Tags1 = new [] { "e", "f", "g" }, - Tags2 = new [] { 3, 45, 100, 400 }, - Tags3 = new [] { false, true, false } + Tags1 = Array.Empty(), + Tags2 = new[] { 3, 45, 100, 400 }, + Tags3 = new[] { false, true, false } } }; - var str = _fsql.Insert(source).ExecuteAffrows(); + var str = _fsql.Insert(source).ExecuteAffrows(); } /// @@ -146,8 +149,176 @@ namespace FreeSql.Tests.ClickHouse var list = _fsql.Select().ToList(); _output.WriteLine(JsonConvert.SerializeObject(list)); } + + /// + /// 测试Array常用查询函数 + /// + [Fact] + public void ArraySelectAnySync() + { + var sql = _fsql.Select().Where(a => !a.Tags1.Any()).ToList(a => a.Name); + _output.WriteLine(JsonConvert.SerializeObject(sql)); + } + + + /// + /// 测试Array常用查询函数 + /// + [Fact] + public void ArraySelectLengthSync() + { + var sql = _fsql.Select().ToList(a => a.Tags1.Count()); + _output.WriteLine(JsonConvert.SerializeObject(sql)); + + var sql2 = _fsql.Select().Where(a => a.Tags1.Count() > 5).ToList(a => a.Tags1); + _output.WriteLine(JsonConvert.SerializeObject(sql2)); + } + + + /// + /// 测试Array常用查询函数 + /// + [Fact] + public void ArraySelectContainsSync() + { + var sql = _fsql.Select().ToList(a => a.Tags1.Contains("a")); + _output.WriteLine(JsonConvert.SerializeObject(sql)); + + var sql2 = _fsql.Select().Where(a => a.Tags2.Contains(2)).ToList(a => a.Tags2); + _output.WriteLine(JsonConvert.SerializeObject(sql2)); + } + + /// + /// 测试Array常用查询函数 + /// + [Fact] + public void ArraySelectConcatSync() + { + var list = new List() { "f" }; + var sql = _fsql.Select().ToList(a => a.Tags1.Concat(list)); + _output.WriteLine(JsonConvert.SerializeObject(sql)); + + } + + /// + /// 测试ArrayFilter测试 + /// + [Fact] + public void ArrayFilterFuncTest() + { + //var list = _fsql.Select().Where(a => a.Tags2.ArrayFilter(o => o == 1).Any()) + // .ToSql(); + + + ////SELECT a.`name`, a.`tags1`, a.`tags2`, a.`tags3` + ////FROM `table_test_array_simple` a + ////WHERE (arrayFilter(x -> x = '1', a.`tags2`) != []) + + //_output.WriteLine(JsonConvert.SerializeObject(list)); + } + + /// + /// 测试ArrayFilter测试 + /// + [Fact] + public void IsPrimaryTest() + { + _fsql.CodeFirst.SyncStructure(); + } + + /// + /// https://github.com/dotnetcore/FreeSql/issues/969 + /// + [Fact] + public async Task UriStringIsTooLongTest() + { + _fsql.CodeFirst.SyncStructure(); + var json = + "[{\"date\":\"2021-12-19T02:47:53.4365075 08:00\",\"temperatureC\":6,\"temperatureF\":42,\"summary\":\"Balmy\"},{\"date\":\"2021-12-20T02:47:53.4366893 08:00\",\"temperatureC\":36,\"temperatureF\":96,\"summary\":\"Bracing\"},{\"date\":\"2021-12-21T02:47:53.4366903 08:00\",\"temperatureC\":-15,\"temperatureF\":6,\"summary\":\"Bracing\"},{\"date\":\"2021-12-22T02:47:53.4366904 08:00\",\"temperatureC\":14,\"temperatureF\":57,\"summary\":\"Cool\"},{\"date\":\"2021-12-23T02:47:53.4366905 08:00\",\"temperatureC\":29,\"temperatureF\":84,\"summary\":\"Mild\"}][{\"date\":\"2021-12-19T02:47:53.4365075 08:00\",\"temperatureC\":6,\"temperatureF\":42,\"summary\":\"Balmy\"},{\"date\":\"2021-12-20T02:47:53.4366893 08:00\",\"temperatureC\":36,\"temperatureF\":96,\"summary\":\"Bracing\"},{\"date\":\"2021-12-21T02:47:53.4366903 08:00\",\"temperatureC\":-15,\"temperatureF\":6,\"summary\":\"Bracing\"},{\"date\":\"2021-12-22T02:47:53.4366904 08:00\",\"temperatureC\":14,\"temperatureF\":57,\"summary\":\"Cool\"},{\"date\":\"2021-12-23T02:47:53.4366905 08:00\",\"temperatureC\":29,\"temperatureF\":84,\"summary\":\"Mild\"}[{\"date\":\"2021-12-19T02:47:53.4365075 08:00\",\"temperatureC\":6,\"temperatureF\":42,\"summary\":\"Balmy\"},{\"date\":\"2021-12-20T02:47:53.4366893 08:00\",\"temperatureC\":36,\"temperatureF\":96,\"summary\":\"Bracing\"},{\"date\":\"2021-12-21T02:47:53.4366903 08:00\",\"temperatureC\":-15,\"temperatureF\":6,\"summary\":\"Bracing\"},{\"date\":\"2021-12-22T02:47:53.4366904 08:00\",\"temperatureC\":14,\"temperatureF\":57,\"summary\":\"Cool\"},{\"date\":\"2021-12-23T02:47:53.4366905 08:00\",\"temperatureC\":29,\"temperatureF\":84,\"summary\":\"Mild\"}[{\"date\":\"2021-12-19T02:47:53.4365075 08:00\",\"temperatureC\":6,\"temperatureF\":42,\"summary\":\"Balmy\"},{\"date\":\"2021-12-20T02:47:53.4366893 08:00\",\"temperatureC\":36,\"temperatureF\":96,\"summary\":\"Bracing\"},{\"date\":\"2021-12-21T02:47:53.4366903 08:00\",\"temperatureC\":-15,\"temperatureF\":6,\"summary\":\"Bracing\"},{\"date\":\"2021-12-22T02:47:53.4366904 08:00\",\"temperatureC\":14,\"temperatureF\":57,\"summary\":\"Cool\"},{\"date\":\"2021-12-23T02:47:53.4366905 08:00\",\"temperatureC\":29,\"temperatureF\":84,\"summary\":\"Mild\"}[{\"date\":\"2021-12-19T02:47:53.4365075 08:00\",\"temperatureC\":6,\"temperatureF\":42,\"summary\":\"Balmy\"},{\"date\":\"2021-12-20T02:47:53.4366893 08:00\",\"temperatureC\":36,\"temperatureF\":96,\"summary\":\"Bracing\"},{\"date\":\"2021-12-21T02:47:53.4366903 08:00\",\"temperatureC\":-15,\"temperatureF\":6,\"summary\":\"Bracing\"},{\"date\":\"2021-12-22T02:47:53.4366904 08:00\",\"temperatureC\":14,\"temperatureF\":57,\"summary\":\"Cool\"},{\"date\":\"2021-12-23T02:47:53.4366905 08:00\",\"temperatureC\":29,\"temperatureF\":84,\"summary\":\"Mild\"}[{\"date\":\"2021-12-19T02:47:53.4365075 08:00\",\"temperatureC\":6,\"temperatureF\":42,\"summary\":\"Balmy\"},{\"date\":\"2021-12-20T02:47:53.4366893 08:00\",\"temperatureC\":36,\"temperatureF\":96,\"summary\":\"Bracing\"},{\"date\":\"2021-12-21T02:47:53.4366903 08:00\",\"temperatureC\":-15,\"temperatureF\":6,\"summary\":\"Bracing\"},{\"date\":\"2021-12-22T02:47:53.4366904 08:00\",\"temperatureC\":14,\"temperatureF\":57,\"summary\":\"Cool\"},{\"date\":\"2021-12-23T02:47:53.4366905 08:00\",\"temperatureC\":29,\"temperatureF\":84,\"summary\":\"Mild\"}[{\"date\":\"2021-12-19T02:47:53.4365075 08:00\",\"temperatureC\":6,\"temperatureF\":42,\"summary\":\"Balmy\"},{\"date\":\"2021-12-20T02:47:53.4366893 08:00\",\"temperatureC\":36,\"temperatureF\":96,\"summary\":\"Bracing\"},{\"date\":\"2021-12-21T02:47:53.4366903 08:00\",\"temperatureC\":-15,\"temperatureF\":6,\"summary\":\"Bracing\"},{\"date\":\"2021-12-22T02:47:53.4366904 08:00\",\"temperatureC\":14,\"temperatureF\":57,\"summary\":\"Cool\"},{\"date\":\"2021-12-23T02:47:53.4366905 08:00\",\"temperatureC\":29,\"temperatureF\":84,\"summary\":\"Mild\"}[{\"date\":\"2021-12-19T02:47:53.4365075 08:00\",\"temperatureC\":6,\"temperatureF\":42,\"summary\":\"Balmy\"},{\"date\":\"2021-12-20T02:47:53.4366893 08:00\",\"temperatureC\":36,\"temperatureF\":96,\"summary\":\"Bracing\"},{\"date\":\"2021-12-21T02:47:53.4366903 08:00\",\"temperatureC\":-15,\"temperatureF\":6,\"summary\":\"Bracing\"},{\"date\":\"2021-12-22T02:47:53.4366904 08:00\",\"temperatureC\":14,\"temperatureF\":57,\"summary\":\"Cool\"},{\"date\":\"2021-12-23T02:47:53.4366905 08:00\",\"temperatureC\":29,\"temperatureF\":84,\"summary\":\"Mild\"}[{\"date\":\"2021-12-19T02:47:53.4365075 08:00\",\"temperatureC\":6,\"temperatureF\":42,\"summary\":\"Balmy\"},{\"date\":\"2021-12-20T02:47:53.4366893 08:00\",\"temperatureC\":36,\"temperatureF\":96,\"summary\":\"Bracing\"},{\"date\":\"2021-12-21T02:47:53.4366903 08:00\",\"temperatureC\":-15,\"temperatureF\":6,\"summary\":\"Bracing\"},{\"date\":\"2021-12-22T02:47:53.4366904 08:00\",\"temperatureC\":14,\"temperatureF\":57,\"summary\":\"Cool\"},{\"date\":\"2021-12-23T02:47:53.4366905 08:00\",\"temperatureC\":29,\"temperatureF\":84,\"summary\":\"Mild\"}[{\"date\":\"2021-12-19T02:47:53.4365075 08:00\",\"temperatureC\":6,\"temperatureF\":42,\"summary\":\"Balmy\"},{\"date\":\"2021-12-20T02:47:53.4366893 08:00\",\"temperatureC\":36,\"temperatureF\":96,\"summary\":\"Bracing\"},{\"date\":\"2021-12-21T02:47:53.4366903 08:00\",\"temperatureC\":-15,\"temperatureF\":6,\"summary\":\"Bracing\"},{\"date\":\"2021-12-22T02:47:53.4366904 08:00\",\"temperatureC\":14,\"temperatureF\":57,\"summary\":\"Cool\"},{\"date\":\"2021-12-23T02:47:53.4366905 08:00\",\"temperatureC\":29,\"temperatureF\":84,\"summary\":\"Mild\"}[{\"date\":\"2021-12-19T02:47:53.4365075 08:00\",\"temperatureC\":6,\"temperatureF\":42,\"summary\":\"Balmy\"},{\"date\":\"2021-12-20T02:47:53.4366893 08:00\",\"temperatureC\":36,\"temperatureF\":96,\"summary\":\"Bracing\"},{\"date\":\"2021-12-21T02:47:53.4366903 08:00\",\"temperatureC\":-15,\"temperatureF\":6,\"summary\":\"Bracing\"},{\"date\":\"2021-12-22T02:47:53.4366904 08:00\",\"temperatureC\":14,\"temperatureF\":57,\"summary\":\"Cool\"},{\"date\":\"2021-12-23T02:47:53.4366905 08:00\",\"temperatureC\":29,\"temperatureF\":84,\"summary\":\"Mild\"}[{\"date\":\"2021-12-19T02:47:53.4365075 08:00\",\"temperatureC\":6,\"temperatureF\":42,\"summary\":\"Balmy\"},{\"date\":\"2021-12-20T02:47:53.4366893 08:00\",\"temperatureC\":36,\"temperatureF\":96,\"summary\":\"Bracing\"},{\"date\":\"2021-12-21T02:47:53.4366903 08:00\",\"temperatureC\":-15,\"temperatureF\":6,\"summary\":\"Bracing\"},{\"date\":\"2021-12-22T02:47:53.4366904 08:00\",\"temperatureC\":14,\"temperatureF\":57,\"summary\":\"Cool\"},{\"date\":\"2021-12-23T02:47:53.4366905 08:00\",\"temperatureC\":29,\"temperatureF\":84,\"summary\":\"Mild\"}[{\"date\":\"2021-12-19T02:47:53.4365075 08:00\",\"temperatureC\":6,\"temperatureF\":42,\"summary\":\"Balmy\"},{\"date\":\"2021-12-20T02:47:53.4366893 08:00\",\"temperatureC\":36,\"temperatureF\":96,\"summary\":\"Bracing\"},{\"date\":\"2021-12-21T02:47:53.4366903 08:00\",\"temperatureC\":-15,\"temperatureF\":6,\"summary\":\"Bracing\"},{\"date\":\"2021-12-22T02:47:53.4366904 08:00\",\"temperatureC\":14,\"temperatureF\":57,\"summary\":\"Cool\"},{\"date\":\"2021-12-23T02:47:53.4366905 08:00\",\"temperatureC\":29,\"temperatureF\":84,\"summary\":\"Mild\"}[{\"date\":\"2021-12-19T02:47:53.4365075 08:00\",\"temperatureC\":6,\"temperatureF\":42,\"summary\":\"Balmy\"},{\"date\":\"2021-12-20T02:47:53.4366893 08:00\",\"temperatureC\":36,\"temperatureF\":96,\"summary\":\"Bracing\"},{\"date\":\"2021-12-21T02:47:53.4366903 08:00\",\"temperatureC\":-15,\"temperatureF\":6,\"summary\":\"Bracing\"},{\"date\":\"2021-12-22T02:47:53.4366904 08:00\",\"temperatureC\":14,\"temperatureF\":57,\"summary\":\"Cool\"},{\"date\":\"2021-12-23T02:47:53.4366905 08:00\",\"temperatureC\":29,\"temperatureF\":84,\"summary\":\"Mild\"}"; + + json += json; + json += json; + json += json; + json += json; + json += json; + json += json; + json += json; + json += json; + json += json; + json += json; + json += json; + json += json; + json += json; + json += json; + + var t = new TestTable + { + Id = Guid.NewGuid().ToString(), + Content = json, + Content2 = json, + Time = DateTime.Now + }; + + //单个插入报错 + await _fsql.Insert(t).ExecuteAffrowsAsync(); + + // await _fsql.Insert(t).ExecuteBulkCopyAsync(); + } + + + /// + /// 测试BulkCopy单条 + /// + /// + [Fact] + public async Task TestBulkCopySingle() + { + var t = new TestTable + { + Id = Guid.NewGuid().ToString(), + Content = "1", + Content2 = "2", + Time = DateTime.Now + }; + + //单个插入报错 + await _fsql.Insert(t).ExecuteAffrowsAsync(); + + await _fsql.Insert(t).ExecuteBulkCopyAsync(); + + _fsql.Insert(t).ExecuteBulkCopy(); + } + + /// + /// 测试BulkCopy多条 + /// + /// + [Fact] + public async Task TestBulkCopyMany() + { + var t = new List(); + + foreach (var i in Enumerable.Range(0, 10)) + { + t.Add(new TestTable + { + Id = Guid.NewGuid().ToString(), + Content = i.ToString(), + Content2 = i.ToString(), + Time = DateTime.Now + }); + } + + //单个插入报错 + await _fsql.Insert(t).ExecuteAffrowsAsync(); + + await _fsql.Insert(t).ExecuteBulkCopyAsync(); + + _fsql.Insert(t).ExecuteBulkCopy(); + } } + [Table(Name = "table_test_bool")] public class BoolMappingTest { @@ -191,10 +362,74 @@ namespace FreeSql.Tests.ClickHouse [Column(Name = "name", IsPrimary = true)] public string Name { get; set; } - [Column(Name = "tags1")] public string [] Tags1 { get; set; } + [Column(Name = "tags1")] public string[] Tags1 { get; set; } [Column(Name = "tags2")] public int[] Tags2 { get; set; } - [Column(Name = "tags3")] public bool [] Tags3 { get; set; } + [Column(Name = "tags3")] public bool[] Tags3 { get; set; } + } + + /// + /// Http请求信息统计 + /// + [Table(Name = "http_context_record")] + public class HttpContextRecord + { + [Column(Name = "id", IsPrimary = true)] + public string Id { get; set; } + + /// + /// 请求模板 + /// + [Column(Name = "request_total_key", StringLength = 80)] + public string RequestTotalKey { get; set; } + + /// + /// 请求量 + /// + [Column(Name = "total")] + public long Total { get; set; } + + /// + /// 记录请求类型 + /// + [Column(Name = "type")] + public int Type { get; set; } + + /// + /// 添加时间 + /// + [Column(Name = "add_time")] + public DateTime AddTime { get; set; } + } + + public class ContentRecord + { + [Column(IsPrimary = true)] public string Id { get; set; } + + public string? Content1 { get; set; } + + public string? Content2 { get; set; } + + public string? Content3 { get; set; } + + public string Content4 { get; set; } + } + + internal class TestTable + { + [Required] [Column(IsIdentity = true)] public string Id { get; set; } + + [Column(StringLength = -2)] public string Content { get; set; } + + [Column(StringLength = -2)] public string Content2 { get; set; } + + [Column(DbType = "DateTime64(3, 'Asia/Shanghai')")] + public DateTime Time { get; set; } + + public override string ToString() + { + return $"Id:{Id} Content:{Content} Content2:{Content2} Time:{Time}"; + } } } \ 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 13f136a0..fa03b482 100644 --- a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml +++ b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml @@ -44,6 +44,78 @@ 测试Array类型映射 + + + 测试Array常用查询函数 + + + + + 测试Array常用查询函数 + + + + + 测试Array常用查询函数 + + + + + 测试Array常用查询函数 + + + + + 测试ArrayFilter测试 + + + + + 测试ArrayFilter测试 + + + + + https://github.com/dotnetcore/FreeSql/issues/969 + + + + + 测试BulkCopy单条 + + + + + + 测试BulkCopy多条 + + + + + + Http请求信息统计 + + + + + 请求模板 + + + + + 请求量 + + + + + 记录请求类型 + + + + + 添加时间 + + 实时数据 diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs index 77bb5991..f56737fd 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseCodeFirst.cs @@ -583,9 +583,13 @@ where a.database in ({0}) and a.table in ({1})", tboldname ?? tbname); if (isPrimary) { if (dbType.Contains("Nullable")) - return dbType.Replace("Nullable(", "") + { + var res = dbType.Replace("Nullable(", "") .Replace(")", "") .Replace(" NOT NULL", ""); + return res; + } + return dbType; } diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseExpression.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseExpression.cs index cc613093..d4a7ea74 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseExpression.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseExpression.cs @@ -5,6 +5,7 @@ using System.Collections; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; +using System.Reflection; using System.Text; using System.Text.RegularExpressions; @@ -121,27 +122,51 @@ namespace FreeSql.ClickHouse case "First": case "FirstOrDefault": return $"substr({getExp(callExp.Arguments[0])}, 1, 1)"; + } } } if (objType == null) objType = callExp.Method.DeclaringType; if (objType != null || objType.IsArrayOrList()) { - if (argIndex >= callExp.Arguments.Count) break; - tsc.SetMapColumnTmp(null); - var args1 = getExp(callExp.Arguments[argIndex]); - var oldMapType = tsc.SetMapTypeReturnOld(tsc.mapTypeTmp); - var oldDbParams = objExp?.NodeType == ExpressionType.MemberAccess ? tsc.SetDbParamsReturnOld(null) : null; //#900 UseGenerateCommandParameterWithLambda(true) 子查询 bug、以及 #1173 参数化 bug - tsc.isNotSetMapColumnTmp = true; + //if (argIndex >= callExp.Arguments.Count) break; + //tsc.SetMapColumnTmp(null); + //var args1 = getExp(callExp.Arguments[argIndex]); + //var oldMapType = tsc.SetMapTypeReturnOld(tsc.mapTypeTmp); + //var oldDbParams = objExp?.NodeType == ExpressionType.MemberAccess ? tsc.SetDbParamsReturnOld(null) : null; //#900 UseGenerateCommandParameterWithLambda(true) 子查询 bug、以及 #1173 参数化 bug + //tsc.isNotSetMapColumnTmp = true; var left = objExp == null ? null : getExp(objExp); - tsc.isNotSetMapColumnTmp = false; - tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); - if (oldDbParams != null) tsc.SetDbParamsReturnOld(oldDbParams); + //tsc.isNotSetMapColumnTmp = false; + //tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + //if (oldDbParams != null) tsc.SetDbParamsReturnOld(oldDbParams); switch (callExp.Method.Name) { + case "Count": + left = objExp == null ? null : getExp(objExp); + if (left.StartsWith("(") || left.EndsWith(")")) left = $"array[{left.TrimStart('(').TrimEnd(')')}]"; + return $"(case when {left} is null then 0 else length({left}) end)"; + case "Any": + left = objExp == null ? null : getExp(objExp); + if (left.StartsWith("(") || left.EndsWith(")")) left = $"array[{left.TrimStart('(').TrimEnd(')')}]"; + return $"(case when {left} is null then 0 else length({left}) end > 0)"; case "Contains": - //判断 in //在各大 Provider AdoProvider 中已约定,500元素分割, 3空格\r\n4空格 - return $"(({args1}) in {left.Replace(", \r\n \r\n", $") \r\n OR ({args1}) in (")})"; + tsc.SetMapColumnTmp(null); + var args1 = getExp(callExp.Arguments[argIndex]); + var oldMapType = tsc.SetMapTypeReturnOld(tsc.mapTypeTmp); + var oldDbParams = objExp?.NodeType == ExpressionType.MemberAccess ? tsc.SetDbParamsReturnOld(null) : null; //#900 UseGenerateCommandParameterWithLambda(true) 子查询 bug、以及 #1173 参数化 bug + tsc.isNotSetMapColumnTmp = true; + left = objExp == null ? null : getExp(objExp); + tsc.isNotSetMapColumnTmp = false; + tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType); + if (oldDbParams != null) tsc.SetDbParamsReturnOld(oldDbParams); + if (left.StartsWith("(") || left.EndsWith(")")) left = $"array[{left.TrimStart('(').TrimEnd(')')}]"; + return $"(hasAny({left}, [{args1}]))"; + case "Concat": + left = objExp == null ? null : getExp(objExp); + if (left.StartsWith("(") || left.EndsWith(")")) left = $"array[{left.TrimStart('(').TrimEnd(')')}]"; + var right2 = getExp(callExp.Arguments[argIndex]); + if (right2.StartsWith("(") || right2.EndsWith(")")) right2 = $"array[{right2.TrimStart('(').TrimEnd(')')}]"; + return $"(arrayConcat({left} || {right2}))"; } } break; @@ -181,7 +206,6 @@ namespace FreeSql.ClickHouse } return null; } - public override string ExpressionLambdaToSqlMemberAccessString(MemberExpression exp, ExpTSC tsc) { if (exp.Expression == null) diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseExtensions.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseExtensions.cs index bc3bc7c3..36428c07 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseExtensions.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseExtensions.cs @@ -2,24 +2,30 @@ using FreeSql.ClickHouse.Curd; using FreeSql.Internal.CommonProvider; using System; +using System.Collections.Generic; using System.Linq.Expressions; +using System.Threading; +using System.Threading.Tasks; +using FreeSql.DataAnnotations; public static partial class FreeSqlClickHouseGlobalExtensions { - /// /// 特殊处理类似 string.Format 的使用方法,防止注入,以及 IS NULL 转换 /// /// /// /// - public static string FormatClickHouse(this string that, params object[] args) => _clickHouseAdo.Addslashes(that, args); + public static string FormatClickHouse(this string that, params object[] args) => + _clickHouseAdo.Addslashes(that, args); + static FreeSql.ClickHouse.ClickHouseAdo _clickHouseAdo = new FreeSql.ClickHouse.ClickHouseAdo(); /// /// Clickhouse limit by /// - public static ISelect LimitBy(this ISelect that, Expression> selector, int limit, int offset = 0) + public static ISelect LimitBy(this ISelect that, Expression> selector, int limit, + int offset = 0) { if (limit <= 0 && offset <= 0) return that; var s0p = that as ClickHouseSelect; @@ -34,6 +40,7 @@ public static partial class FreeSqlClickHouseGlobalExtensions { s0p._orderby = oldOrderBy; } + return that; } @@ -52,4 +59,36 @@ public static partial class FreeSqlClickHouseGlobalExtensions s0p._sample = $"SAMPLE {k}"; return that; } + + /// + /// 批量快速插入 + /// + /// + /// + /// + public static async Task ExecuteBulkCopyAsync(this IInsert that) where T : class + { + try + { + var insert = that as ClickHouseInsert; + await insert.InternalBulkCopyAsync(); + } + catch (Exception e) + { + throw e; + } + + return 0; + } + + /// + /// 批量快速插入 + /// + /// + /// + /// + public static int ExecuteBulkCopy(this IInsert insert) where T : class + { + return ExecuteBulkCopyAsync(insert).ConfigureAwait(false).GetAwaiter().GetResult(); + } } diff --git a/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseInsert.cs b/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseInsert.cs index 0645397a..9b6eb58d 100644 --- a/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseInsert.cs +++ b/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseInsert.cs @@ -57,18 +57,7 @@ namespace FreeSql.ClickHouse.Curd { before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, null, _params); _orm.Aop.CurdBeforeHandler?.Invoke(this, before); - var data = ToDataTable(); - using (var conn = _orm.Ado.MasterPool.Get()) - { - using (var bulkCopyInterface = new ClickHouseBulkCopy(conn.Value as ClickHouseConnection) - { - DestinationTableName = data.TableName, - BatchSize = _source.Count - }) - { - bulkCopyInterface.WriteToServerAsync(data, default).Wait(); - } - } + InternalBulkCopyAsync().ConfigureAwait(false).GetAwaiter().GetResult(); return affrows; } catch (Exception ex) @@ -85,6 +74,24 @@ namespace FreeSql.ClickHouse.Curd return base.RawExecuteAffrows(); } + internal async Task InternalBulkCopyAsync() + { + var data = ToDataTable(); + using (var conn = _orm.Ado.MasterPool.Get()) + { + using (var bulkCopyInterface = new ClickHouseBulkCopy(conn.Value as ClickHouseConnection) + { + DestinationTableName = data.TableName, + BatchSize = _source.Count + }) + { + await bulkCopyInterface.WriteToServerAsync(data, default); + } + } + return 0; + + } + private IDictionary GetValue(T u, System.Reflection.PropertyInfo[] columns) { try From 80f959a662cee0eaacbd379981e8b95beb36777f Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Thu, 30 Nov 2023 15:59:11 +0800 Subject: [PATCH 13/14] =?UTF-8?q?=E9=80=82=E9=85=8DClickhouse=E5=B8=B8?= =?UTF-8?q?=E7=94=A8=E6=95=B0=E7=BB=84=E8=A1=A8=E8=BE=BE=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ClickHouse/ClickHouseTest3.cs | 24 +++++++++++++++++-- FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml | 10 ++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs index 8cd0473a..9818bda4 100644 --- a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs +++ b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs @@ -160,7 +160,7 @@ namespace FreeSql.Tests.ClickHouse _output.WriteLine(JsonConvert.SerializeObject(sql)); } - + /// /// 测试Array常用查询函数 /// @@ -174,7 +174,7 @@ namespace FreeSql.Tests.ClickHouse _output.WriteLine(JsonConvert.SerializeObject(sql2)); } - + /// /// 测试Array常用查询函数 /// @@ -197,7 +197,27 @@ namespace FreeSql.Tests.ClickHouse var list = new List() { "f" }; var sql = _fsql.Select().ToList(a => a.Tags1.Concat(list)); _output.WriteLine(JsonConvert.SerializeObject(sql)); + } + /// + /// 测试Array常用查询函数 + /// + [Fact] + public void ArraySelectConstContainsSync() + { + var list = new List() { "daily", "a" }; + var sql = _fsql.Select().Where(a => list.Contains(a.Name)).ToList(); + _output.WriteLine(JsonConvert.SerializeObject(sql)); + } + + /// + /// 测试Array常用查询函数 + /// + [Fact] + public void ArraySelectConstLengthSync() + { + var sql = _fsql.Select().ToList(a => "aaaa".Length); + _output.WriteLine(JsonConvert.SerializeObject(sql)); } /// diff --git a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml index fa03b482..47cc24ad 100644 --- a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml +++ b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml @@ -64,6 +64,16 @@ 测试Array常用查询函数 + + + 测试Array常用查询函数 + + + + + 测试Array常用查询函数 + + 测试ArrayFilter测试 From 39315b3228a2a0bb4913743a8e5621c63d9d1d03 Mon Sep 17 00:00:00 2001 From: d4ilys <963922242@qq.com> Date: Thu, 30 Nov 2023 16:00:09 +0800 Subject: [PATCH 14/14] =?UTF-8?q?=E5=A2=9E=E5=8A=A0Clickhouse=20-=20BulkCo?= =?UTF-8?q?py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs index 9818bda4..b3fbd72d 100644 --- a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs +++ b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest3.cs @@ -332,7 +332,8 @@ namespace FreeSql.Tests.ClickHouse //单个插入报错 await _fsql.Insert(t).ExecuteAffrowsAsync(); - await _fsql.Insert(t).ExecuteBulkCopyAsync(); + //BulkCopy不会报错 + await _fsql.Insert(t).ExecuteBulkCopyAsync(); _fsql.Insert(t).ExecuteBulkCopy(); }