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 28f1ca01..a6a26d05 100644
--- a/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest1.cs
+++ b/FreeSql.Tests/FreeSql.Tests/ClickHouse/ClickHouseTest1.cs
@@ -7,20 +7,22 @@ using System.Linq;
using System.Collections;
using System.Diagnostics;
using XY.Model.Business;
+using System.ComponentModel.DataAnnotations;
+using FreeSql.DataAnnotations;
namespace FreeSql.Tests.MySql
{
public class ClickHouseTest1
{
-
- class TestAuditValue
+ private class TestAuditValue
{
[FreeSql.DataAnnotations.Column(IsPrimary = true)]
public long Id { get; set; }
+
[Now]
public DateTime CreateTime { get; set; }
- [FreeSql.DataAnnotations.Column(IsNullable = true )]
+ [FreeSql.DataAnnotations.Column(IsNullable = true)]
public string Name { get; set; }
[FreeSql.DataAnnotations.Column(IsNullable = false)]
@@ -35,6 +37,7 @@ namespace FreeSql.Tests.MySql
public int? Points { get; set; }
}
+
[FreeSql.DataAnnotations.Table(Name = "ClickHouseTest")]
public class TestClickHouse
{
@@ -45,12 +48,14 @@ namespace FreeSql.Tests.MySql
public string Name { get; set; }
public Decimal Money { get; set; }
}
- class NowAttribute: Attribute { }
+
+ private class NowAttribute : Attribute
+ { }
[Fact]
public void AuditValue()
{
- var id = BitConverter.ToInt64(Guid.NewGuid().ToByteArray(), 0);
+ var id = BitConverter.ToInt64(Guid.NewGuid().ToByteArray(), 0);
var item = new TestClickHouse();
item.Id = id;
item.Name = "李四";
@@ -66,7 +71,6 @@ namespace FreeSql.Tests.MySql
g.clickHouse.Aop.AuditValue -= audit;
}
-
[Fact]
public void CreateTalbe()
{
@@ -76,11 +80,11 @@ namespace FreeSql.Tests.MySql
[Fact]
public void TestInsert()
{
- Stopwatch stopwatch =new Stopwatch();
+ Stopwatch stopwatch = new Stopwatch();
var fsql = g.clickHouse;
- List list=new List();
- List list1=new List();
- var date=DateTime.Now;
+ List list = new List();
+ List list1 = new List();
+ var date = DateTime.Now;
for (int i = 1; i < 1000000; i++)
{
//list.Add(new TestClickHouse
@@ -101,14 +105,14 @@ namespace FreeSql.Tests.MySql
}
fsql.Delete().Where(t => 1 == 1).ExecuteAffrows();
stopwatch.Start();
- var insert=fsql.Insert(list1);
+ var insert = fsql.Insert(list1);
stopwatch.Stop();
Debug.WriteLine("审计数据用时:" + stopwatch.ElapsedMilliseconds.ToString());
stopwatch.Restart();
insert.ExecuteAffrows();
//fsql.GetRepository().Insert(list1);
stopwatch.Stop();
- Debug.WriteLine("转换并插入用时:" +stopwatch.ElapsedMilliseconds.ToString());
+ Debug.WriteLine("转换并插入用时:" + stopwatch.ElapsedMilliseconds.ToString());
//var items = fsql.Select().Where(o=>o.Id>900).OrderByDescending(o=>o.Id).ToList();
//Assert.Equal(100, items.Count);
}
@@ -118,9 +122,9 @@ namespace FreeSql.Tests.MySql
{
var fsql = g.clickHouse;
- var list=fsql.Select()
- .Page(1,100)
- .Where(o=>o.Id>200&&o.Id<500)
+ var list = fsql.Select()
+ .Page(1, 100)
+ .Where(o => o.Id > 200 && o.Id < 500)
.Count(out var count).ToList();
//Assert.Equal(100, list.Count);
}
@@ -129,7 +133,7 @@ namespace FreeSql.Tests.MySql
public void TestDelete()
{
var fsql = g.clickHouse;
- var count1=fsql.Select().Count();
+ var count1 = fsql.Select().Count();
fsql.Delete().Where(o => o.Id < 500).ExecuteAffrows();
var count2 = fsql.Select().Count();
//Assert.NotEqual(count1, count2);
@@ -140,27 +144,25 @@ namespace FreeSql.Tests.MySql
{
var fsql = g.clickHouse;
fsql.Update().Where(o => o.Id > 900)
- .Set(o=>o.Name,"修改后的值")
+ .Set(o => o.Name, "修改后的值")
.ExecuteAffrows();
-
}
[Fact]
public void TestRepositorySelect()
{
var fsql = g.clickHouse;
- var list=fsql.GetRepository().Where(o => o.Id > 900)
+ var list = fsql.GetRepository().Where(o => o.Id > 900)
.ToList();
-
}
[Fact]
public void TestRepositoryInsert()
{
var fsql = g.clickHouse;
- long id = BitConverter.ToInt64(Guid.NewGuid().ToByteArray(),0);
- var list=fsql.GetRepository().Insert(new TestClickHouse { Id= id, Name="张三"});
- var data=fsql.GetRepository().Get(id);
+ long id = BitConverter.ToInt64(Guid.NewGuid().ToByteArray(), 0);
+ var list = fsql.GetRepository().Insert(new TestClickHouse { Id = id, Name = "张三" });
+ var data = fsql.GetRepository().Get(id);
}
[Fact]
@@ -168,11 +170,15 @@ namespace FreeSql.Tests.MySql
{
var fsql = g.clickHouse;
long id = BitConverter.ToInt64(Guid.NewGuid().ToByteArray(), 0);
- DateTime createTime=DateTime.Now;
- fsql.Insert(new TestAuditValue {
- Id = id, CreateTime = createTime, Age =18,Name="张三"
+ DateTime createTime = DateTime.Now;
+ fsql.Insert(new TestAuditValue
+ {
+ Id = id,
+ CreateTime = createTime,
+ Age = 18,
+ Name = "张三"
}).ExecuteAffrows();
-
+
var date1 = fsql.GetRepository().Where(o => o.CreateTime == createTime)
.ToList();
var date2 = fsql.GetRepository().Where(o => o.CreateTime.Date == createTime.Date)
@@ -187,54 +193,54 @@ namespace FreeSql.Tests.MySql
.ToList();
var date7 = fsql.GetRepository().Where(o => o.CreateTime.AddSeconds(10) < createTime)
.ToList();
-
}
-
[Fact]
public void TestUpdateTime()
{
var fsql = g.clickHouse;
var state = fsql.GetRepository().UpdateDiy.Set(o => o.UpdateTime, DateTime.Now).Where(o => 1 == 1).ExecuteAffrows();
//var state1 = fsql.GetRepository().UpdateDiy.Set(o => o.UpdateTime, null).Where(o => 1 == 1).ExecuteAffrows();
-
-
}
+
[Fact]
public void TestRepositoryUpdateTime()
{
Stopwatch stopwatch = new Stopwatch();
var fsql = g.clickHouse;
- var repository=fsql.GetRepository();
- List list=new List();
+ var repository = fsql.GetRepository();
+ List list = new List();
for (int i = 1; i < 5; i++)
{
list.Add(new TestAuditValue
{
Id = new Random().Next(),
- Age=1, Name=i.ToString(), State=true, CreateTime=DateTime.Now,
- UpdateTime=DateTime.Now,
+ Age = 1,
+ Name = i.ToString(),
+ State = true,
+ CreateTime = DateTime.Now,
+ UpdateTime = DateTime.Now,
Enable = false
});
}
list = repository.Insert(list);
//var list = repository.Select.ToList();
- list.ForEach(o=>o.UpdateTime = DateTime.Now);
+ list.ForEach(o => o.UpdateTime = DateTime.Now);
list.ForEach(o => o.Enable = true);
stopwatch.Start();
repository.Update(list);
stopwatch.Stop();
Debug.WriteLine("更新用时:" + stopwatch.ElapsedMilliseconds.ToString());
-
}
+
[Fact]
public async void TestInsertUpdateData()
{
//g.clickHouse.CodeFirst.SyncStructure();
Stopwatch stopwatch = new Stopwatch();
var fsql = g.clickHouse;
- var repository=fsql.GetRepository();
- await repository.DeleteAsync(o=>o.Id>0);
+ var repository = fsql.GetRepository();
+ await repository.DeleteAsync(o => o.Id > 0);
List tables = new List();
for (int i = 1; i < 3; i++)
{
@@ -246,7 +252,7 @@ namespace FreeSql.Tests.MySql
EquipmentCode = "11",
UnitStr = "111",
PropertyCode = "1111",
- NumericValue=1111.1119999912500M
+ NumericValue = 1111.1119999912500M
});
}
@@ -260,8 +266,54 @@ namespace FreeSql.Tests.MySql
//await repository.UpdateAsync(list);
//stopwatch.Stop();
Debug.WriteLine("更新用时:" + stopwatch.ElapsedMilliseconds.ToString());
-
}
+ [Fact]
+ public async void TestInsertDecimalData()
+ {
+ //g.clickHouse.CodeFirst.SyncStructure();
+ Stopwatch stopwatch = new Stopwatch();
+ var fsql = g.clickHouse;
+ var repository = fsql.GetRepository();
+ await repository.DeleteAsync(o => o.Id > 0);
+
+ var insert = repository.Insert(new CollectDataEntity
+ {
+ Id = new Random().Next(),
+ CollectTime = DateTime.Now,
+ DataFlag = "1",
+ EquipmentCode = "11",
+ UnitStr = "111",
+ PropertyCode = "1111",
+ NumericValue = 1111.1119999912500M
+ });
+ var list = repository.Orm.Select().ToList();
+ //var list = repository.Insert(tables);
+ //var list = repository.Select.ToList();
+ //list.ForEach(o=>o.EquipmentCode = "666");
+ //stopwatch.Start();
+ //await repository.UpdateAsync(list);
+ //stopwatch.Stop();
+ Debug.WriteLine("更新用时:" + stopwatch.ElapsedMilliseconds.ToString());
+ }
+
+ internal class Entity
+ {
+ [Required]
+ public string Id { get; set; }
+
+ [Column(StringLength = -2)]
+ public string Content { get; set; }
+ }
+
+ [Fact]
+ public void TestInsertNoneParameter()
+ {
+ 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\"}]";
+ var data = new Entity { Id = Guid.NewGuid().ToString(), Content = json };
+
+ var fsql = g.clickHouse;
+ fsql.Insert(data).NoneParameter().ExecuteAffrows();
+ }
}
-}
+}
\ No newline at end of file
diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseUtils.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseUtils.cs
index 9bb6d484..e343a8b5 100644
--- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseUtils.cs
+++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseUtils.cs
@@ -7,11 +7,11 @@ using System.Data.Common;
using System.Globalization;
using System.Data;
using ClickHouse.Client.ADO.Parameters;
+using System.Text.RegularExpressions;
namespace FreeSql.ClickHouse
{
-
- class ClickHouseUtils : CommonUtils
+ internal class ClickHouseUtils : CommonUtils
{
public ClickHouseUtils(IFreeSql orm) : base(orm)
{
@@ -21,7 +21,7 @@ namespace FreeSql.ClickHouse
{
if (string.IsNullOrEmpty(parameterName)) parameterName = $"p_{_params?.Count}";
var dbtype = (DbType)_orm.CodeFirst.GetDbInfo(type)?.type;
- DbParameter ret = new ClickHouseDbParameter { ParameterName = parameterName, DbType= dbtype, Value = value };//QuoteParamterName(parameterName)
+ DbParameter ret = new ClickHouseDbParameter { ParameterName = parameterName, DbType = dbtype, Value = value };//QuoteParamterName(parameterName)
if (col != null)
{
var dbtype2 = (DbType)_orm.DbFirst.GetDbType(new DatabaseModel.DbColumnInfo { DbTypeText = col.DbTypeText, DbTypeTextFull = col.Attribute.DbType, MaxLength = col.DbSize });
@@ -53,19 +53,28 @@ namespace FreeSql.ClickHouse
var tp = _orm.CodeFirst.GetDbInfo(type)?.type;
if (tp != null)
{
-
- ret.DbType = (DbType)tp.Value;
+ ret.DbType = (DbType)tp.Value;
}
return ret;
});
+
public override string RewriteColumn(ColumnInfo col, string sql)
{
col.Attribute.DbType = col.Attribute.DbType.Replace(" NOT NULL", "");
if (string.IsNullOrWhiteSpace(col?.Attribute.RewriteSql) == false)
return string.Format(col.Attribute.RewriteSql, sql);
- return string.Format(sql, col.Attribute.DbType);
+ if (Regex.IsMatch(sql, @"\{\{[\w\d]+_+\d:\{\d\}\}\}"))
+ {
+ return string.Format(sql, col.Attribute.DbType);
+ }
+ else
+ {
+ return sql;
+ }
}
+
public override string FormatSql(string sql, params object[] args) => sql?.FormatClickHouse(args);
+
public override string QuoteSqlName(params string[] name)
{
if (name.Length == 1)
@@ -79,6 +88,7 @@ namespace FreeSql.ClickHouse
}
return $"`{string.Join("`.`", name)}`";
}
+
public override string TrimQuoteSqlName(string name)
{
var nametrim = name.Trim();
@@ -86,12 +96,19 @@ namespace FreeSql.ClickHouse
return nametrim; //原生SQL
return $"{nametrim.Trim('`').Replace("`.`", ".").Replace(".`", ".")}";
}
+
public override string[] SplitTableName(string name) => GetSplitTableNames(name, '`', '`', 2);
+
public override string QuoteParamterName(string name) => $"{{{{{name}:{{0}}}}}}";
+
public override string IsNull(string sql, object value) => $"ifnull({sql}, {value})";
+
public override string StringConcat(string[] objs, Type[] types) => $"concat({string.Join(", ", objs)})";
+
public override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}";
+
public override string Div(string left, string right, Type leftType, Type rightType) => $"{left} div {right}";
+
public override string Now => "now()";
public override string NowUtc => "now('UTC')";
@@ -108,6 +125,7 @@ namespace FreeSql.ClickHouse
}
return paramterName;
}
+
protected override string QuoteReadColumnAdapter(Type type, Type mapType, string columnName)
{
switch (mapType.FullName)
@@ -135,4 +153,4 @@ namespace FreeSql.ClickHouse
return FormatSql("{0}", value, 1);
}
}
-}
+}
\ No newline at end of file