From 846c1801912951ec2bf65b6342bafc103fd46d36 Mon Sep 17 00:00:00 2001
From: ChenBo <1114927184@qq.com>
Date: Sun, 28 Nov 2021 21:37:10 +0800
Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E6=89=B9=E9=87=8F=E6=8F=92?=
=?UTF-8?q?=E5=85=A5=E6=95=B0=E6=8D=AE=E7=9A=84=E6=96=B9=E5=BC=8F(?=
=?UTF-8?q?=E6=B5=8B=E8=AF=95100w=E6=9D=A15=E7=A7=92=E4=B8=8D=E5=88=B0)?=
=?UTF-8?q?=EF=BC=8C=E6=9B=B4=E6=94=B9=E6=95=B0=E6=8D=AE=E4=BF=AE=E6=94=B9?=
=?UTF-8?q?=E6=97=B6=E7=9A=84=E6=9B=BF=E6=8D=A2=E5=8F=AF=E8=83=BD=E6=9B=BF?=
=?UTF-8?q?=E6=8D=A2=E5=88=B0=E6=95=B0=E6=8D=AE=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
FreeSql.DbContext/FreeSql.DbContext.xml | 9 --
.../ClickHouse/ClickHouseTest1.cs | 21 ++++-
.../Curd/ClickHouseInsert.cs | 86 ++++++++++++++++++-
.../Curd/ClickHouseUpdate.cs | 6 +-
4 files changed, 104 insertions(+), 18 deletions(-)
diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml
index bdd16ff9..da7ace6b 100644
--- a/FreeSql.DbContext/FreeSql.DbContext.xml
+++ b/FreeSql.DbContext/FreeSql.DbContext.xml
@@ -538,14 +538,5 @@
-
-
- 批量注入 Repository,可以参考代码自行调整
-
-
-
-
-
-
diff --git a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest1.cs b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest1.cs
index 55133c34..22cece67 100644
--- a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest1.cs
+++ b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest1.cs
@@ -3,6 +3,9 @@ using System.Collections.Generic;
using System.Reflection;
using System.Text;
using Xunit;
+using System.Linq;
+using System.Collections;
+using System.Diagnostics;
namespace FreeSql.Tests.MySql
{
@@ -32,13 +35,18 @@ namespace FreeSql.Tests.MySql
public int? Points { get; set; }
}
[FreeSql.DataAnnotations.Table(Name = "ClickHouseTest")]
- public class TestClickHouse
+ public class TestClickHouse : IEnumerable
{
[FreeSql.DataAnnotations.Column(IsPrimary = true)]
[Now]
public long Id { get; set; }
public string Name { get; set; }
+ public IEnumerator GetEnumerator()
+ {
+ yield return Id;
+ yield return Name;
+ }
}
class NowAttribute: Attribute { }
@@ -73,9 +81,10 @@ namespace FreeSql.Tests.MySql
[Fact]
public void TestInsert()
{
+ Stopwatch stopwatch =new Stopwatch();
var fsql = g.clickHouse;
List list=new List();
- for (int i = 0; i < 1000; i++)
+ for (int i = 0; i < 1000000; i++)
{
list.Add(new TestClickHouse()
{
@@ -83,9 +92,13 @@ namespace FreeSql.Tests.MySql
Name = $"测试{i}"
});
}
+ fsql.Delete().Where(t => 1 == 1).ExecuteAffrows();
+ stopwatch.Start();
fsql.Insert(list).ExecuteAffrows();
- var items = fsql.Select().Where(o=>o.Id>900).OrderByDescending(o=>o.Id).ToList();
- Assert.Equal(100, items.Count);
+ stopwatch.Stop();
+ Debug.WriteLine(list.Count+"条用时:" +stopwatch.ElapsedMilliseconds.ToString());
+ //var items = fsql.Select().Where(o=>o.Id>900).OrderByDescending(o=>o.Id).ToList();
+ //Assert.Equal(100, items.Count);
}
[Fact]
diff --git a/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseInsert.cs b/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseInsert.cs
index 6ddbb87b..57f606bb 100644
--- a/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseInsert.cs
+++ b/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseInsert.cs
@@ -1,9 +1,12 @@
-using FreeSql.Internal;
+using ClickHouse.Client.ADO;
+using ClickHouse.Client.Copy;
+using FreeSql.Internal;
using FreeSql.Internal.Model;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
+using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
@@ -30,9 +33,9 @@ namespace FreeSql.ClickHouse.Curd
internal Dictionary InternalIgnore => _ignore;
internal void InternalClearData() => ClearData();
- public override int ExecuteAffrows() => base.SplitExecuteAffrows(_batchValuesLimit > 0 ? _batchValuesLimit : 5000, _batchParameterLimit > 0 ? _batchParameterLimit : 3000);
- public override long ExecuteIdentity() => base.SplitExecuteIdentity(_batchValuesLimit > 0 ? _batchValuesLimit : 5000, _batchParameterLimit > 0 ? _batchParameterLimit : 3000);
- public override List ExecuteInserted() => base.SplitExecuteInserted(_batchValuesLimit > 0 ? _batchValuesLimit : 5000, _batchParameterLimit > 0 ? _batchParameterLimit : 3000);
+ public override int ExecuteAffrows() => base.SplitExecuteAffrows(int.MaxValue, int.MaxValue);
+ public override long ExecuteIdentity() => base.SplitExecuteIdentity(int.MaxValue, int.MaxValue);
+ public override List ExecuteInserted() => base.SplitExecuteInserted(int.MaxValue, int.MaxValue);
public override string ToSql()
@@ -42,6 +45,81 @@ namespace FreeSql.ClickHouse.Curd
return $"INSERT IGNORE INTO {sql.Substring(12)}";
}
+ protected override int RawExecuteAffrows()
+ {
+ var affrows = 0;
+ Exception exception = null;
+ Aop.CurdBeforeEventArgs before=null;
+ if (_source.Count>1)
+ {
+ try
+ {
+ before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, null, _params);
+ _orm.Aop.CurdBeforeHandler?.Invoke(this, before);
+ using var bulkCopyInterface = new ClickHouseBulkCopy(_orm.Ado.MasterPool.Get().Value as ClickHouseConnection)
+ {
+ DestinationTableName = _table.DbName,
+ BatchSize = _source.Count
+ };
+ bulkCopyInterface.WriteToServerAsync(ToDataTable(),default).Wait();
+ return affrows;
+ }
+ catch (Exception ex)
+ {
+ exception = ex;
+ throw ex;
+ }
+ finally
+ {
+ var after = new Aop.CurdAfterEventArgs(before, exception, affrows);
+ _orm.Aop.CurdAfterHandler?.Invoke(this, after);
+ }
+ }
+ else
+ {
+ var sql = this.ToSql();
+ before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params);
+ _orm.Aop.CurdBeforeHandler?.Invoke(this, before);
+ try
+ {
+ affrows = _orm.Ado.ExecuteNonQuery(_connection, _transaction, CommandType.Text, sql, _commandTimeout, _params);
+ }
+ catch (Exception ex)
+ {
+ exception = ex;
+ throw ex;
+ }
+ finally
+ {
+ var after = new Aop.CurdAfterEventArgs(before, exception, affrows);
+ _orm.Aop.CurdAfterHandler?.Invoke(this, after);
+ }
+ return affrows;
+ }
+ }
+
+ private IDictionary GetValue(T u, System.Reflection.PropertyInfo[] columns)
+ {
+ try
+ {
+ Dictionary dic = new Dictionary();
+ foreach (var item in columns)
+ {
+ object v = null;
+ if (u != null)
+ {
+ v = item.GetValue(u);
+ }
+ dic.TryAdd(item.Name, v);
+ }
+ return dic;
+ }
+ catch (Exception e)
+ {
+ throw;
+ }
+ }
+
protected override long RawExecuteIdentity()
{
var sql = this.ToSql();
diff --git a/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseUpdate.cs b/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseUpdate.cs
index a284c98d..16745836 100644
--- a/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseUpdate.cs
+++ b/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseUpdate.cs
@@ -24,7 +24,11 @@ namespace FreeSql.ClickHouse.Curd
internal Dictionary InternalIgnore => _ignore;
public override string ToSql()
{
- return base.ToSql()?.Replace("UPDATE", "ALTER TABLE").Replace("SET", "UPDATE");
+ var sql = base.ToSql();
+ sql = sql.Remove(0, 6).Insert(0, "ALTER TABLE");
+ var index = sql.IndexOf(" SET ");
+ sql = sql.Remove(index, 5).Insert(index, " UPDATE ");
+ return sql;
}
internal void InternalResetSource(List source) => _source = source;
internal string InternalWhereCaseSource(string CsName, Func thenValue) => WhereCaseSource(CsName, thenValue);