Skip to content

Commit 868e70e

Browse files
authored
Merge pull request #1936 from d4ilys/master
增加TDengine支持
2 parents 688960a + c194f35 commit 868e70e

29 files changed

+3074
-4
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net8.0</TargetFramework>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<Nullable>enable</Nullable>
7+
8+
<IsPackable>false</IsPackable>
9+
<IsTestProject>true</IsTestProject>
10+
</PropertyGroup>
11+
12+
<ItemGroup>
13+
<PackageReference Include="coverlet.collector" Version="6.0.0" />
14+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
15+
<PackageReference Include="xunit" Version="2.5.3" />
16+
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.3" />
17+
</ItemGroup>
18+
19+
<ItemGroup>
20+
<ProjectReference Include="..\..\Providers\FreeSql.Provider.TDengine\FreeSql.Provider.TDengine.csproj" />
21+
</ItemGroup>
22+
23+
<ItemGroup>
24+
<Using Include="Xunit" />
25+
</ItemGroup>
26+
27+
</Project>
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
using System;
2+
using FreeSql.Tests.Provider.TDengine.TDengine.Tables;
3+
using Xunit;
4+
5+
namespace FreeSql.Tests.Provider.TDengine.TDengine.TDengineAdo
6+
{
7+
public class TDengineAdoTest
8+
{
9+
IFreeSql fsql => g.tdengine;
10+
11+
[Fact]
12+
void CodeFirstTest()
13+
{
14+
fsql.CodeFirst.SyncStructure<D1001>();
15+
fsql.CodeFirst.SyncStructure<D1002>();
16+
fsql.CodeFirst.SyncStructure<Users>();
17+
}
18+
19+
[Fact]
20+
void InsertTest()
21+
{
22+
var insertAffrows = fsql.Insert(new D1001()
23+
{
24+
Ts = DateTime.Now,
25+
Current = 1,
26+
Voltage = 1,
27+
Describe = "D10021"
28+
}
29+
).ExecuteAffrows();
30+
31+
var insertAffrows2 = fsql.Insert(new D1001()
32+
{
33+
Ts = DateTime.Now,
34+
Current = 1,
35+
Voltage = 1,
36+
Describe = "D10021"
37+
}
38+
).ExecuteAffrows();
39+
40+
var batchInsertAffrows = fsql.Insert(new List<D1002>()
41+
{
42+
new D1002()
43+
{
44+
Ts = DateTime.Now,
45+
Current = 6,
46+
Voltage = 6,
47+
Describe = "D10026"
48+
},
49+
new D1002()
50+
{
51+
Ts = DateTime.Now,
52+
Current = 3,
53+
Voltage = 3,
54+
Describe = "D10023"
55+
},
56+
new D1002()
57+
{
58+
Ts = DateTime.Now,
59+
Current = 4,
60+
Voltage = 4,
61+
Describe = "D10024"
62+
}
63+
}
64+
).ExecuteAffrows();
65+
}
66+
67+
[Fact]
68+
void SelectTest()
69+
{
70+
var subList = fsql.Select<D1001>().ToList(d => new
71+
{
72+
GroupId = d.GroupId
73+
});
74+
75+
var superMetersList = fsql.Select<Meters>().ToList();
76+
}
77+
78+
[Fact]
79+
void WhereSelectTest()
80+
{
81+
var list = fsql.Select<Meters>().Where(d => d.GroupId == 2).ToList();
82+
}
83+
84+
[Fact]
85+
void DeleteTest()
86+
{
87+
var startTime = DateTime.Parse("2024-11-30T02:33:52.308+00:00");
88+
var endTime = DateTime.Parse("2024-11-30T02:40:58.961+00:00");
89+
var executeAffrows = fsql.Delete<Meters>()
90+
.Where(meters => meters.Ts >= startTime && meters.Ts <= endTime && meters.GroupId == 1)
91+
.ExecuteAffrows();
92+
}
93+
94+
[Fact]
95+
void DbFirst_GetDatabases()
96+
{
97+
var databases = fsql.DbFirst.GetDatabases();
98+
foreach (var database in databases)
99+
{
100+
Console.WriteLine(database);
101+
}
102+
}
103+
}
104+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using FreeSql.DataAnnotations;
7+
using FreeSql.Provider.TDengine.Attributes;
8+
9+
namespace FreeSql.Tests.Provider.TDengine.TDengine.Tables
10+
{
11+
[TDengineSuperTable(Name = "meters")]
12+
public class Meters
13+
{
14+
[Column(Name = "ts")]
15+
public DateTime Ts { get; set; }
16+
17+
[Column(Name = "current")]
18+
public float Current { get; set; }
19+
20+
[Column(Name = "voltage")]
21+
public int Voltage { get; set; }
22+
23+
[Column(Name = "describe", StringLength = 50)]
24+
public string? Describe { get; set; }
25+
26+
[TDengineTag(Name = "location")]
27+
public virtual string? Location { get; set; }
28+
29+
[TDengineTag(Name = "group_id")]
30+
public virtual int GroupId { get; set; }
31+
}
32+
33+
[TDengineSubTable(SuperTableName = "meters", Name = "d1001")]
34+
public class D1001 : Meters
35+
{
36+
[TDengineTag(Name = "location")]
37+
public override string Location { get; set; } = "BeiJIng.ChaoYang";
38+
39+
[TDengineTag(Name = "group_id")]
40+
public override int GroupId { get; set; } = 1;
41+
}
42+
43+
[TDengineSubTable(SuperTableName = "meters", Name = "d1002")]
44+
public class D1002 : Meters
45+
{
46+
[TDengineTag(Name = "location")]
47+
public new string Location { get; set; } = "California.SanFrancisco";
48+
49+
[TDengineTag(Name = "group_id")]
50+
public new int GroupId { get; set; } = 2;
51+
}
52+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using FreeSql.DataAnnotations;
7+
8+
namespace FreeSql.Tests.Provider.TDengine.TDengine.Tables
9+
{
10+
[Table(Name = "users")]
11+
public class Users
12+
{
13+
[Column(Name = "ts")]
14+
public DateTime Ts { get; set; }
15+
16+
[Column(Name = "id")]
17+
public float Id { get; set; }
18+
19+
[Column(Name = "address")]
20+
public int Address { get; set; }
21+
22+
[Column(Name = "name", StringLength = 20)]
23+
public string? Name { get; set; }
24+
}
25+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace FreeSql.Tests.Provider.TDengine.TDengineAdo
2+
{
3+
public class TDengineAdoTest
4+
{
5+
IFreeSql fsql => g.tdengine;
6+
7+
[Fact]
8+
public void AuditValue()
9+
{
10+
var executeConnectTest = fsql.Ado.ExecuteConnectTest();
11+
12+
}
13+
}
14+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Diagnostics;
4+
using System.Linq;
5+
using System.Text;
6+
using System.Threading;
7+
using System.Threading.Tasks;
8+
9+
namespace FreeSql.Tests.Provider.TDengine
10+
{
11+
internal class g
12+
{
13+
private static readonly Lazy<IFreeSql> tdengineLazy = new Lazy<IFreeSql>(() =>
14+
{
15+
var fsql = new FreeSql.FreeSqlBuilder()
16+
.UseConnectionString(FreeSql.DataType.TDengine,
17+
"host=localhost;port=6030;username=root;password=taosdata;protocol=Native;db=test;")
18+
.UseMonitorCommand(cmd => Console.WriteLine($"Sql:{cmd.CommandText}\r\n"))
19+
.UseNoneCommandParameter(true)
20+
.Build();
21+
return fsql;
22+
});
23+
24+
public static IFreeSql tdengine => tdengineLazy.Value;
25+
}
26+
}

FreeSql.sln

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Provider.Duckdb", "
131131
EndProject
132132
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Tests.Provider.Duckdb", "FreeSql.Tests\FreeSql.Tests.Provider.Duckdb\FreeSql.Tests.Provider.Duckdb.csproj", "{DE79C012-15B1-40EC-AD19-CBD7D489DB8E}"
133133
EndProject
134+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Provider.TDengine", "Providers\FreeSql.Provider.TDengine\FreeSql.Provider.TDengine.csproj", "{329BA8B3-4139-4CCE-AFEC-4BE9B7BED317}"
135+
EndProject
136+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Tests.Provider.TDengine", "FreeSql.Tests\FreeSql.Tests.Provider.TDengine\FreeSql.Tests.Provider.TDengine.csproj", "{0C178F1C-0F65-47AA-A1DE-545CBF8543D1}"
137+
EndProject
134138
Global
135139
GlobalSection(SolutionConfigurationPlatforms) = preSolution
136140
Debug|Any CPU = Debug|Any CPU
@@ -789,6 +793,30 @@ Global
789793
{DE79C012-15B1-40EC-AD19-CBD7D489DB8E}.Release|x64.Build.0 = Release|Any CPU
790794
{DE79C012-15B1-40EC-AD19-CBD7D489DB8E}.Release|x86.ActiveCfg = Release|Any CPU
791795
{DE79C012-15B1-40EC-AD19-CBD7D489DB8E}.Release|x86.Build.0 = Release|Any CPU
796+
{329BA8B3-4139-4CCE-AFEC-4BE9B7BED317}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
797+
{329BA8B3-4139-4CCE-AFEC-4BE9B7BED317}.Debug|Any CPU.Build.0 = Debug|Any CPU
798+
{329BA8B3-4139-4CCE-AFEC-4BE9B7BED317}.Debug|x64.ActiveCfg = Debug|Any CPU
799+
{329BA8B3-4139-4CCE-AFEC-4BE9B7BED317}.Debug|x64.Build.0 = Debug|Any CPU
800+
{329BA8B3-4139-4CCE-AFEC-4BE9B7BED317}.Debug|x86.ActiveCfg = Debug|Any CPU
801+
{329BA8B3-4139-4CCE-AFEC-4BE9B7BED317}.Debug|x86.Build.0 = Debug|Any CPU
802+
{329BA8B3-4139-4CCE-AFEC-4BE9B7BED317}.Release|Any CPU.ActiveCfg = Release|Any CPU
803+
{329BA8B3-4139-4CCE-AFEC-4BE9B7BED317}.Release|Any CPU.Build.0 = Release|Any CPU
804+
{329BA8B3-4139-4CCE-AFEC-4BE9B7BED317}.Release|x64.ActiveCfg = Release|Any CPU
805+
{329BA8B3-4139-4CCE-AFEC-4BE9B7BED317}.Release|x64.Build.0 = Release|Any CPU
806+
{329BA8B3-4139-4CCE-AFEC-4BE9B7BED317}.Release|x86.ActiveCfg = Release|Any CPU
807+
{329BA8B3-4139-4CCE-AFEC-4BE9B7BED317}.Release|x86.Build.0 = Release|Any CPU
808+
{0C178F1C-0F65-47AA-A1DE-545CBF8543D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
809+
{0C178F1C-0F65-47AA-A1DE-545CBF8543D1}.Debug|Any CPU.Build.0 = Debug|Any CPU
810+
{0C178F1C-0F65-47AA-A1DE-545CBF8543D1}.Debug|x64.ActiveCfg = Debug|Any CPU
811+
{0C178F1C-0F65-47AA-A1DE-545CBF8543D1}.Debug|x64.Build.0 = Debug|Any CPU
812+
{0C178F1C-0F65-47AA-A1DE-545CBF8543D1}.Debug|x86.ActiveCfg = Debug|Any CPU
813+
{0C178F1C-0F65-47AA-A1DE-545CBF8543D1}.Debug|x86.Build.0 = Debug|Any CPU
814+
{0C178F1C-0F65-47AA-A1DE-545CBF8543D1}.Release|Any CPU.ActiveCfg = Release|Any CPU
815+
{0C178F1C-0F65-47AA-A1DE-545CBF8543D1}.Release|Any CPU.Build.0 = Release|Any CPU
816+
{0C178F1C-0F65-47AA-A1DE-545CBF8543D1}.Release|x64.ActiveCfg = Release|Any CPU
817+
{0C178F1C-0F65-47AA-A1DE-545CBF8543D1}.Release|x64.Build.0 = Release|Any CPU
818+
{0C178F1C-0F65-47AA-A1DE-545CBF8543D1}.Release|x86.ActiveCfg = Release|Any CPU
819+
{0C178F1C-0F65-47AA-A1DE-545CBF8543D1}.Release|x86.Build.0 = Release|Any CPU
792820
EndGlobalSection
793821
GlobalSection(SolutionProperties) = preSolution
794822
HideSolutionNode = FALSE
@@ -831,6 +859,7 @@ Global
831859
{8064870C-22EA-4A58-972D-DBD57D096D91} = {2A381C57-2697-427B-9F10-55DA11FD02E4}
832860
{D9419896-BFB0-47C1-BEFD-A6C48394643B} = {4A92E8A6-9A6D-41A1-9CDA-DE10899648AA}
833861
{4871434E-481D-4306-B6DD-73595C61A473} = {2A381C57-2697-427B-9F10-55DA11FD02E4}
862+
{329BA8B3-4139-4CCE-AFEC-4BE9B7BED317} = {2A381C57-2697-427B-9F10-55DA11FD02E4}
834863
EndGlobalSection
835864
GlobalSection(ExtensibilityGlobals) = postSolution
836865
RESX_NeutralResourcesLanguage = en-US

FreeSql/DataType.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ public enum DataType {
6565

6666
CustomOracle, CustomSqlServer, CustomMySql, CustomPostgreSQL,
6767

68-
DuckDB
68+
DuckDB,
69+
70+
TDengine
6971
}
7072
}

FreeSql/FreeSqlBuilder.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,11 @@ public IFreeSql<TMark> Build<TMark>()
385385
if (type == null) throwNotFind("FreeSql.Provider.Duckdb.dll", "FreeSql.Duckdb.DuckdbProvider<>");
386386
break;
387387

388+
case DataType.TDengine:
389+
type = Type.GetType("FreeSql.TDengine.TDengineProvider`1,FreeSql.Provider.TDengine")?.MakeGenericType(typeof(TMark));
390+
if (type == null) throwNotFind("FreeSql.Provider.TDengine.dll", "FreeSql.TDengine.TDengineProvider<>");
391+
break;
392+
388393
default: throw new Exception(CoreErrorStrings.NotSpecified_UseConnectionString_UseConnectionFactory);
389394
}
390395
}

FreeSql/Internal/CommonProvider/InsertProvider.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -609,10 +609,10 @@ public IInsert<T1> AsType(Type entityType)
609609

610610
public virtual string ToSql() => ToSqlValuesOrSelectUnionAllExtension103(true, null, null, false);
611611

612-
public string ToSqlValuesOrSelectUnionAll(bool isValues = true) => ToSqlValuesOrSelectUnionAllExtension103(isValues, null, null, false);
612+
public string ToSqlValuesOrSelectUnionAll(bool isValues = true, List<string> ignoreColumn = null) => ToSqlValuesOrSelectUnionAllExtension103(isValues, null, null, false, ignoreColumn);
613613
public string ToSqlValuesOrSelectUnionAllExtension101(bool isValues, Action<object, int, StringBuilder> onrow) => ToSqlValuesOrSelectUnionAllExtension103(isValues, null, onrow, false);
614614
public string ToSqlValuesOrSelectUnionAllExtension102(bool isValues, Action<object, int, StringBuilder> onrowPre, Action<object, int, StringBuilder> onrow) => ToSqlValuesOrSelectUnionAllExtension103(isValues, onrowPre, onrow, false);
615-
string ToSqlValuesOrSelectUnionAllExtension103(bool isValues, Action<object, int, StringBuilder> onrowPre, Action<object, int, StringBuilder> onrow, bool isAsTableSplited)
615+
string ToSqlValuesOrSelectUnionAllExtension103(bool isValues, Action<object, int, StringBuilder> onrowPre, Action<object, int, StringBuilder> onrow, bool isAsTableSplited, List<string> ignoreColumn = null)
616616
{
617617
if (_source == null || _source.Any() == false) return null;
618618
var sb = new StringBuilder();
@@ -643,6 +643,8 @@ string ToSqlValuesOrSelectUnionAllExtension103(bool isValues, Action<object, int
643643
var colidx = 0;
644644
foreach (var col in _table.Columns.Values)
645645
{
646+
//增加忽略插入的列
647+
if (ignoreColumn != null && ignoreColumn.Contains(col.CsName)) continue;
646648
if (col.Attribute.IsIdentity && _insertIdentity == false && string.IsNullOrEmpty(col.DbInsertValue)) continue;
647649
if (col.Attribute.IsIdentity == false && _ignore.ContainsKey(col.Attribute.Name)) continue;
648650

@@ -663,6 +665,8 @@ string ToSqlValuesOrSelectUnionAllExtension103(bool isValues, Action<object, int
663665
var colidx2 = 0;
664666
foreach (var col in _table.Columns.Values)
665667
{
668+
//增加忽略插入的列
669+
if (ignoreColumn != null && ignoreColumn.Contains(col.CsName)) continue;
666670
if (col.Attribute.IsIdentity && _insertIdentity == false && string.IsNullOrEmpty(col.DbInsertValue)) continue;
667671
if (col.Attribute.IsIdentity == false && _ignore.ContainsKey(col.Attribute.Name)) continue;
668672

0 commit comments

Comments
 (0)