TDengine Ado调试

This commit is contained in:
d4ilys
2024-09-03 17:07:44 +08:00
parent 0bcd23537b
commit 0e81ee0a35
12 changed files with 485 additions and 320 deletions

View File

@@ -1,27 +1,27 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<WarningLevel>3</WarningLevel>
<NoWarn>1701;1702;1591</NoWarn>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.8.3" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="xunit" Version="2.5.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\Providers\FreeSql.Provider.TDengine\FreeSql.Provider.TDengine.csproj" />
</ItemGroup>
<ItemGroup>
<Using Include="Xunit" />
</ItemGroup>
</Project>

View File

@@ -8,10 +8,10 @@ namespace FreeSql.Tests.Provider.TDengine.TDengine.TDengineAdo
IFreeSql fsql => g.tdengine;
[Fact]
public void ExecuteConnectTest()
public void AuditValue()
{
var executeConnectTest = fsql.Ado.ExecuteConnectTest();
Assert.True(executeConnectTest);
}
}
}

View File

@@ -0,0 +1,14 @@
namespace FreeSql.Tests.Provider.TDengine.TDengineAdo
{
public class TDengineAdoTest
{
IFreeSql fsql => g.tdengine;
[Fact]
public void AuditValue()
{
var executeConnectTest = fsql.Ado.ExecuteConnectTest();
}
}
}

View File

@@ -10,11 +10,11 @@ namespace FreeSql.Tests.Provider.TDengine
{
internal class g
{
static readonly Lazy<IFreeSql> tdengineLazy = new Lazy<IFreeSql>(() =>
private static readonly Lazy<IFreeSql> tdengineLazy = new Lazy<IFreeSql>(() =>
{
return new FreeSql.FreeSqlBuilder()
var fsql = new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.TDengine,
"Host=127.0.0.1;Port=6030;Username=root;Password=taosdata;Protocol=Native;db=test;Min Pool Size=1;Max Poll Size=10")
"host=localhost;port=6030;username=root;password=taosdata;protocol=Native;db=test;")
.UseAutoSyncStructure(true)
.UseNameConvert(Internal.NameConvertType.ToLower)
.UseMonitorCommand(
@@ -23,6 +23,7 @@ namespace FreeSql.Tests.Provider.TDengine
//, (cmd, traceLog) => Console.WriteLine(traceLog)
)
.Build();
return fsql;
});
public static IFreeSql tdengine => tdengineLazy.Value;

View File

@@ -131,9 +131,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Provider.Duckdb", "
EndProject
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}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FreeSql.Provider.TDengine", "Providers\FreeSql.Provider.TDengine\FreeSql.Provider.TDengine.csproj", "{329BA8B3-4139-4CCE-AFEC-4BE9B7BED317}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Provider.TDengine", "Providers\FreeSql.Provider.TDengine\FreeSql.Provider.TDengine.csproj", "{329BA8B3-4139-4CCE-AFEC-4BE9B7BED317}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FreeSql.Tests.Provider.TDengine", "FreeSql.Tests\FreeSql.Tests.Provider.TDengine\FreeSql.Tests.Provider.TDengine.csproj", "{1F313BE0-5069-4B5E-BEE7-138954D293F9}"
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}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -805,18 +805,18 @@ Global
{329BA8B3-4139-4CCE-AFEC-4BE9B7BED317}.Release|x64.Build.0 = Release|Any CPU
{329BA8B3-4139-4CCE-AFEC-4BE9B7BED317}.Release|x86.ActiveCfg = Release|Any CPU
{329BA8B3-4139-4CCE-AFEC-4BE9B7BED317}.Release|x86.Build.0 = Release|Any CPU
{1F313BE0-5069-4B5E-BEE7-138954D293F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1F313BE0-5069-4B5E-BEE7-138954D293F9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1F313BE0-5069-4B5E-BEE7-138954D293F9}.Debug|x64.ActiveCfg = Debug|Any CPU
{1F313BE0-5069-4B5E-BEE7-138954D293F9}.Debug|x64.Build.0 = Debug|Any CPU
{1F313BE0-5069-4B5E-BEE7-138954D293F9}.Debug|x86.ActiveCfg = Debug|Any CPU
{1F313BE0-5069-4B5E-BEE7-138954D293F9}.Debug|x86.Build.0 = Debug|Any CPU
{1F313BE0-5069-4B5E-BEE7-138954D293F9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1F313BE0-5069-4B5E-BEE7-138954D293F9}.Release|Any CPU.Build.0 = Release|Any CPU
{1F313BE0-5069-4B5E-BEE7-138954D293F9}.Release|x64.ActiveCfg = Release|Any CPU
{1F313BE0-5069-4B5E-BEE7-138954D293F9}.Release|x64.Build.0 = Release|Any CPU
{1F313BE0-5069-4B5E-BEE7-138954D293F9}.Release|x86.ActiveCfg = Release|Any CPU
{1F313BE0-5069-4B5E-BEE7-138954D293F9}.Release|x86.Build.0 = Release|Any CPU
{0C178F1C-0F65-47AA-A1DE-545CBF8543D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0C178F1C-0F65-47AA-A1DE-545CBF8543D1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0C178F1C-0F65-47AA-A1DE-545CBF8543D1}.Debug|x64.ActiveCfg = Debug|Any CPU
{0C178F1C-0F65-47AA-A1DE-545CBF8543D1}.Debug|x64.Build.0 = Debug|Any CPU
{0C178F1C-0F65-47AA-A1DE-545CBF8543D1}.Debug|x86.ActiveCfg = Debug|Any CPU
{0C178F1C-0F65-47AA-A1DE-545CBF8543D1}.Debug|x86.Build.0 = Debug|Any CPU
{0C178F1C-0F65-47AA-A1DE-545CBF8543D1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0C178F1C-0F65-47AA-A1DE-545CBF8543D1}.Release|Any CPU.Build.0 = Release|Any CPU
{0C178F1C-0F65-47AA-A1DE-545CBF8543D1}.Release|x64.ActiveCfg = Release|Any CPU
{0C178F1C-0F65-47AA-A1DE-545CBF8543D1}.Release|x64.Build.0 = Release|Any CPU
{0C178F1C-0F65-47AA-A1DE-545CBF8543D1}.Release|x86.ActiveCfg = Release|Any CPU
{0C178F1C-0F65-47AA-A1DE-545CBF8543D1}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -862,8 +862,8 @@ Global
{329BA8B3-4139-4CCE-AFEC-4BE9B7BED317} = {2A381C57-2697-427B-9F10-55DA11FD02E4}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {089687FD-5D25-40AB-BA8A-A10D1E137F98}
RESX_PrefixTranslations = True
RESX_NeutralResourcesLanguage = en-US
RESX_PrefixTranslations = True
SolutionGuid = {089687FD-5D25-40AB-BA8A-A10D1E137F98}
EndGlobalSection
EndGlobal

View File

@@ -4291,103 +4291,103 @@
</summary>
<typeparam name="T"></typeparam>
<param name="entity"></param>
member name="M:FreeSql.IDbFirst.GetCsParse(FreeSql.DatabaseModel.DbColumnInfo)">
<summary>
反序列化
</summary>
<param name="column"></param>
<returns></returns>
</member>
<member name="M:FreeSql.ICodeFirst.ConfigEntity(System.Type,System.Action{FreeSql.DataAnnotations.TableFluent})">
<member name="M:FreeSql.IDbFirst.GetEnumsByDatabase(System.String[])">
<summary>
FreeSql FluentApi 配置实体,方法名与特性相同
</summary>
<param name="type"></param>
<param name="entity"></param>
<returns></returns>
</member>
<member name="M:FreeSql.ICodeFirst.GetConfigEntity(System.Type)">
<summary>
获取 FreeSql FluentApi 配置实体的元数据
</summary>
<param name="type"></param>
<returns>未使用ConfigEntity配置时返回null</returns>
</member>
<member name="M:FreeSql.ICodeFirst.GetTableByEntity(System.Type)">
<summary>
获取实体类核心配置
</summary>
<param name="type"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IDbFirst.GetDatabases">
<summary>
获取所有数据库
</summary>
<returns></returns>
</member>
<member name="M:FreeSql.IDbFirst.GetTablesByDatabase(System.String[])">
<summary>
获取指定数据库的表信息,包括表、列详情、主键、唯一键、索引、外键、备注
获取数据库枚举类型,适用 PostgreSQL
</summary>
<param name="database"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IDbFirst.GetTableByName(System.String,System.Boolean)">
<member name="F:FreeSql.Internal.BaseDiyMemberExpression._lambdaParameter">
<summary>
获取指定单表信息,包括列详情、主键、唯一键、索引、备注
临时 LambdaExpression.Parameter
</summary>
<param name="name">表名dbo.table1</param>
<param name="ignoreCase">是否忽略大小写</param>
</member>
<member name="M:FreeSql.Internal.CommonProvider.InsertOrUpdateProvider`1.SplitSourceByIdentityValueIsNull(System.Collections.Generic.List{`0})">
<summary>
如果实体类有自增属性,分成两个 List有值的Item1 merge无值的Item2 insert
</summary>
<param name="source"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IDbFirst.ExistsTable(System.String,System.Boolean)">
<member name="M:FreeSql.Internal.CommonProvider.InsertProvider`1.IgnoreCanInsert">
<summary>
判断表是否存在
AsType, Ctor, ClearData 三处地方需要重新加载
</summary>
<param name="name">表名dbo.table1</param>
<param name="ignoreCase">是否忽略大小写</param>
</member>
<member name="M:FreeSql.Internal.CommonProvider.UpdateProvider`1.IgnoreCanUpdate">
<summary>
AsType, Ctor, ClearData 三处地方需要重新加载
</summary>
</member>
<member name="M:FreeSql.Internal.CommonUtils.GetPropertyCommentByDescriptionAttribute(System.Type)">
<summary>
动态读取 DescriptionAttribute 注释文本
</summary>
<param name="type"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IDbFirst.GetDbType(FreeSql.DatabaseModel.DbColumnInfo)">
<member name="M:FreeSql.Internal.CommonUtils.GetProperyCommentBySummary(System.Type)">
<summary>
获取数据库枚举类型int值
通过属性的注释文本,通过 xml 读取
</summary>
<param name="column"></param>
<returns></returns>
<param name="type"></param>
<returns>Dictkey=属性名value=注释</returns>
</member>
<member name="M:FreeSql.IDbFirst.GetCsConvert(FreeSql.DatabaseModel.DbColumnInfo)">
<member name="P:FreeSql.Internal.DbUpdateVersionException.Table">
<summary>
获取c#转换,(int)、(long)
更新实体的元数据
</summary>
<param name="column"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IDbFirst.GetCsTypeValue(FreeSql.DatabaseModel.DbColumnInfo)">
<member name="P:FreeSql.Internal.DbUpdateVersionException.Sql">
<summary>
获取c#值
执行更新的 SQL
</summary>
<param name="column"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IDbFirst.GetCsType(FreeSql.DatabaseModel.DbColumnInfo)">
<member name="P:FreeSql.Internal.DbUpdateVersionException.DbParams">
<summary>
获取c#类型int、long
执行更新命令的参数
</summary>
<param name="column"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IDbFirst.GetCsTypeInfo(FreeSql.DatabaseModel.DbColumnInfo)">
<member name="P:FreeSql.Internal.DbUpdateVersionException.Affrows">
<summary>
获取c#类型对象
执行更新命令影响的行
</summary>
<param name="column"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IDbFirst.GetDataReaderMethod(FreeSql.DatabaseModel.DbColumnInfo)">
<member name="P:FreeSql.Internal.DbUpdateVersionException.EntitySourceCount">
<summary>
获取ado.net读取方法, GetBoolean、GetInt64
更新的实体数量
</summary>
<param name="column"></param>
<returns></returns>
</member>
<member name="M:FreeSql.IDbFirst.GetCsStringify(FreeSql.DatabaseModel.DbColumnInfo)">
<member name="P:FreeSql.Internal.DbUpdateVersionException.EntitySource">
<summary>
更新的实体
</summary>
</member>
<member name="T:FreeSql.Internal.MappingPriorityType">
<summary>
映射优先级,默认: Attribute > FluentApi > Aop
</summary>
</member>
<member name="F:FreeSql.Internal.MappingPriorityType.Attribute">
<summary>
实体特性<para></para>
[Table(Name = "tabname")]<para></para>
[Column(Name = "table_id")]
</summary>
</member>
<member name="F:FreeSql.Internal.MappingPriorityType.FluentApi">
<summary>
流式接口<para></para>
fsql.CodeFirst.ConfigEntity(a => a.Name("tabname"))<para></para>
fsql.CodeFirst.ConfigEntity(a => a.Property(b => b.Id).Name("table_id"))
序列化
</summary>
<param name="column"></param>
@@ -4659,118 +4659,7 @@
总批次数量
</summary>
</member>
<member name="M:FreeSql.Internal.Model.ColumnInfo.GetDbValue(System.Object)">
<summary>
获取 obj.CsName 属性值 MapType 之后的数据库值
</summary>
<param name="obj"></param>
<returns></returns>
</member>
<member name="M:FreeSql.Internal.Model.ColumnInfo.GetValue(System.Object)">
<summary>
获取 obj.CsName 属性原始值(不经过 MapType
</summary>
<param name="obj"></param>
</member>
<member name="M:FreeSql.Internal.Model.ColumnInfo.SetValue(System.Object,System.Object)">
<summary>
设置 obj.CsName 属性值
</summary>
<param name="obj"></param>
<param name="val"></param>
</member>
<member name="T:FreeSql.Internal.Model.DynamicFilterInfo">
<summary>
动态过滤条件
</summary>
</member>
<member name="P:FreeSql.Internal.Model.DynamicFilterInfo.Field">
<summary>
属性名Name<para></para>
导航属性Parent.Name<para></para>
多表b.Name<para></para>
</summary>
</member>
<member name="P:FreeSql.Internal.Model.DynamicFilterInfo.Operator">
<summary>
操作符
</summary>
</member>
<member name="P:FreeSql.Internal.Model.DynamicFilterInfo.Value">
<summary>
</summary>
</member>
<member name="P:FreeSql.Internal.Model.DynamicFilterInfo.Logic">
<summary>
Filters 下的逻辑运算符
</summary>
</member>
<member name="P:FreeSql.Internal.Model.DynamicFilterInfo.Filters">
<summary>
子过滤条件,它与当前的逻辑关系是 And<para></para>
注意:当前 Field 可以留空
</summary>
</member>
<member name="F:FreeSql.Internal.Model.DynamicFilterOperator.Contains">
<summary>
like
</summary>
</member>
<member name="F:FreeSql.Internal.Model.DynamicFilterOperator.Equal">
<summary>
=<para></para>
Equal/Equals/Eq 效果相同
</summary>
</member>
<member name="F:FreeSql.Internal.Model.DynamicFilterOperator.Equals">
<summary>
=<para></para>
Equal/Equals/Eq 效果相同
</summary>
</member>
<member name="F:FreeSql.Internal.Model.DynamicFilterOperator.Eq">
<summary>
=<para></para>
Equal/Equals/Eq 效果相同
</summary>
</member>
<member name="F:FreeSql.Internal.Model.DynamicFilterOperator.NotEqual">
<summary>
&lt;&gt;
</summary>
</member>
<member name="F:FreeSql.Internal.Model.DynamicFilterOperator.GreaterThan">
<summary>
&gt;
</summary>
</member>
<member name="F:FreeSql.Internal.Model.DynamicFilterOperator.GreaterThanOrEqual">
<summary>
&gt;=
</summary>
</member>
<member name="F:FreeSql.Internal.Model.DynamicFilterOperator.LessThan">
<summary>
&lt;
</summary>
</member>
<member name="F:FreeSql.Internal.Model.DynamicFilterOperator.LessThanOrEqual">
<summary>
&lt;=
</summary>
</member>
<member name="F:FreeSql.Internal.Model.DynamicFilterOperator.Range">
<summary>
&gt;= and &lt;<para></para>
此时 Value 的值格式为逗号分割value1,value2 或者数组
</summary>
</member>
<member name="F:FreeSql.Internal.Model.DynamicFilterOperator.DateRange">
<summary>
&gt;= and &lt;<para></para>
此时 Value 的值格式为逗号分割date1,date2 或者数组<para></para>
这是专门为日期范围查询定制的操作符,它会处理 date2 + 1比如<para></para>
<member name="M:FreeSql.Internal.Model.ColumnInfo.理 date2 + 1比如<para></para>
当 date2 选择的是 2020-05-30那查询的时候是 &lt; 2020-05-31<para></para>
当 date2 选择的是 2020-05那查询的时候是 &lt; 2020-06<para></para>
当 date2 选择的是 2020那查询的时候是 &lt; 2021<para></para>
@@ -4853,105 +4742,87 @@
<summary>
不可用时间
</summary>
</member>
<member name="M:FreeSql.Internal.ObjectPool.IObjectPool`1.SetUnavailable(System.Exception,System.DateTime)">
<summary>
将对象池设置为不可用,后续 Get/GetAsync 均会报错,同时启动后台定时检查服务恢复可用
</summary>
<param name="exception"></param>
<param name="lastGetTime"></param>
<returns>由【可用】变成【不可用】时返回true否则返回false</returns>
</member>
<member name="P:FreeSql.Internal.ObjectPool.IObjectPool`1.Statistics">
<summary>
统计对象池中的对象
lue 的值格式为逗号分割date1,date2 或者数组<para></para>
这是专门为日期范围查询定制的操作符,它会处理 date2 + 1比如<para></para>
当 date2 选择的是 2020-05-30那查询的时候是 &lt; 2020-05-31<para></para>
当 date2 选择的是 2020-05那查询的时候是 &lt; 2020-06<para></para>
当 date2 选择的是 2020那查询的时候是 &lt; 2021<para></para>
当 date2 选择的是 2020-05-30 12那查询的时候是 &lt; 2020-05-30 13<para></para>
当 date2 选择的是 2020-05-30 12:30那查询的时候是 &lt; 2020-05-30 12:31<para></para>
并且 date2 只支持以上 5 种格式 (date1 没有限制)
</summary>
</member>
<member name="P:FreeSql.Internal.ObjectPool.IObjectPool`1.StatisticsFullily">
<member name="F:FreeSql.Internal.Model.DynamicFilterOperator.Any">
<summary>
统计对象池中的对象(完整)
in (1,2,3)<para></para>
此时 Value 的值格式为逗号分割value1,value2,value3... 或者数组
</summary>
</member>
<member name="M:FreeSql.Internal.ObjectPool.IObjectPool`1.Get(System.Nullable{System.TimeSpan})">
<member name="F:FreeSql.Internal.Model.DynamicFilterOperator.NotAny">
<summary>
获取资源
</summary>
<param name="timeout">超时</param>
<returns></returns>
</member>
<member name="M:FreeSql.Internal.ObjectPool.IObjectPool`1.GetAsync">
<summary>
获取资源
</summary>
<returns></returns>
</member>
<member name="M:FreeSql.Internal.ObjectPool.IObjectPool`1.Return(FreeSql.Internal.ObjectPool.Object{`0},System.Boolean)">
<summary>
使用完毕后,归还资源
</summary>
<param name="obj">对象</param>
<param name="isReset">是否重新创建</param>
</member>
<member name="P:FreeSql.Internal.ObjectPool.IPolicy`1.Name">
<summary>
名称
not in (1,2,3)<para></para>
此时 Value 的值格式为逗号分割value1,value2,value3... 或者数组
</summary>
</member>
<member name="P:FreeSql.Internal.ObjectPool.IPolicy`1.PoolSize">
<member name="F:FreeSql.Internal.Model.DynamicFilterOperator.Custom">
<summary>
池容量
自定义解析,此时 Field 为反射信息Value 为静态方法的参数(string/Expression)<para></para>
示范:{ Operator: "Custom", Field: "RawSql webapp1.DynamicFilterCustom,webapp1", Value: "(id,name) in ((1,'k'),(2,'m'))" }<para></para>
注意:使用者自己承担【注入风险】<para></para>
静态方法定义示范:<para></para>
namespace webapp1<para></para>
{<para></para>
public class DynamicFilterCustom<para></para>
{<para></para>
[DynamicFilterCustom]<para></para>
public static string RawSql(object sender, string value) => value;<para></para>
}<para></para>
}<para></para>
</summary>
</member>
<member name="P:FreeSql.Internal.ObjectPool.IPolicy`1.SyncGetTimeout">
<member name="T:FreeSql.Internal.Model.DynamicFilterCustomAttribute">
<summary>
默认获取超时设置
授权 DynamicFilter 支持 Custom 自定义解析
</summary>
</member>
<member name="P:FreeSql.Internal.ObjectPool.IPolicy`1.IdleTimeout">
<member name="P:FreeSql.Internal.Model.FetchCallbackArgs`1.IsBreak">
<summary>
空闲时间,获取时若超出,则重新创建
是否放弃继续读取
</summary>
</member>
<member name="P:FreeSql.Internal.ObjectPool.IPolicy`1.AsyncGetCapacity">
<member name="P:FreeSql.Internal.Model.TableRef.RefMiddleEntityType">
<summary>
异步获取排队队列大小小于等于0不生效
中间表,多对多
</summary>
</member>
<member name="P:FreeSql.Internal.ObjectPool.IPolicy`1.IsThrowGetTimeoutException">
<member name="F:FreeSql.Internal.Model.TableRefType.PgArrayToMany">
<summary>
获取超时后,是否抛出异常
PostgreSQL 数组类型专属功能<para></para>
方式一select * from Role where Id in (RoleIds)<para></para>
class User {<para></para>
____public int[] RoleIds { get; set; }<para></para>
____[Navigate(nameof(RoleIds))]<para></para>
____public List&lt;Role&gt; Roles { get; set; }<para></para>
}<para></para>
方式二select * from User where RoleIds @&gt; Id<para></para>
class Role {<para></para>
____public int Id { get; set; }<para></para>
____[Navigate(nameof(User.RoleIds))]<para></para>
____public List&lt;User&gt; Users { get; set; }<para></para>
}<para></para>
</summary>
</member>
<member name="P:FreeSql.Internal.ObjectPool.IPolicy`1.IsAutoDisposeWithSystem">
<member name="P:FreeSql.Internal.ObjectPool.IObjectPool`1.IsAvailable">
<summary>
监听 AppDomain.CurrentDomain.ProcessExit/Console.CancelKeyPress 事件自动释放
是否可用
</summary>
</member>
<member name="P:FreeSql.Internal.ObjectPool.IPolicy`1.CheckAvailableInterval">
<member name="P:FreeSql.Internal.ObjectPool.IObjectPool`1.UnavailableException">
<summary>
后台定时检查可用性间隔秒数
不可用错误
</summary>
</member>
<member name="P:FreeSql.Internal.ObjectPool.IPolicy`1.Weight">
<summary>
权重
</summary>
</member>
<member name="M:FreeSql.Internal.ObjectPool.IPolicy`1.OnCreate">
<summary>
对象池的对象被创建时
</summary>
<returns>返回被创建的对象</returns>
</member>
<member name="M:FreeSql.Internal.ObjectPool.IPolicy`1.OnDestroy(`0)">
<summary>
销毁对象
</summary>
<param name="obj">资源对象</param>
</member>
<member name="M:FreeSql.Internal.ObjectPool.IPolicy`1.OnGetTimeout">
<summary>
从对象池获取对象超时的时候触发,通过该方法统计
<memb<EFBFBD>
</summary>
</member>
<member name="M:FreeSql.Internal.ObjectPool.IPolicy`1.OnGet(FreeSql.Internal.ObjectPool.Object{`0})">
@@ -5896,28 +5767,6 @@
请使用 fsql.InsertDict(dict) 方法插入字典数据
</summary>
</member>
<member name="M:FreeSqlGlobalDynamicEntityExtensions.DynamicEntity(FreeSql.ICodeFirst,System.String,System.Attribute[])">
<summary>
动态构建Class Type
</summary>
<returns></returns>
</member>
<member name="M:FreeSqlGlobalDynamicEntityExtensions.CreateInstance(FreeSql.Internal.Model.TableInfo,System.Collections.Generic.Dictionary{System.String,System.Object})">
<summary>
根据字典,创建 table 对应的实体对象
</summary>
<param name="table"></param>
<param name="dict"></param>
<returns></returns>
</member>
<member name="M:FreeSqlGlobalDynamicEntityExtensions.CreateDictionary(FreeSql.Internal.Model.TableInfo,System.Object)">
<summary>
根据实体对象,创建 table 对应的字典
</summary>
<param name="table"></param>
<param name="instance"></param>
<returns></returns>
</member>
<member name="M:FreeSqlGlobalExpressionCallExtensions.Between(System.DateTime,System.DateTime,System.DateTime)">
<summary>
C# that >= between &amp;&amp; that &lt;= and<para></para>
@@ -6454,3 +6303,126 @@
</member>
</members>
</doc>
<returns></returns>
</member>
<member name="M:IFreeSql.Insert``1(System.Collections.Generic.List{``0})">
<summary>
插入数据,传入实体集合
</summary>
<typeparam name="T1"></typeparam>
<param name="source"></param>
<returns></returns>
</member>
<member name="M:IFreeSql.Insert``1(System.Collections.Generic.IEnumerable{``0})">
<summary>
插入数据,传入实体集合
</summary>
<typeparam name="T1"></typeparam>
<param name="source"></param>
<returns></returns>
</member>
<member name="M:IFreeSql.InsertOrUpdate``1">
<summary>
插入或更新数据,此功能依赖数据库特性(低版本可能不支持),参考如下:<para></para>
MySql 5.6+: on duplicate key update<para></para>
PostgreSQL 9.4+: on conflict do update<para></para>
SqlServer 2008+: merge into<para></para>
Oracle 11+: merge into<para></para>
Sqlite: replace into<para></para>
DuckDB: on conflict do update<para></para>
达梦: merge into<para></para>
人大金仓on conflict do update<para></para>
神通merge into<para></para>
MsAccess不支持<para></para>
注意区别FreeSql.Repository 仓储也有 InsertOrUpdate 方法(不依赖数据库特性)
</summary>
<typeparam name="T1"></typeparam>
<returns></returns>
</member>
<member name="M:IFreeSql.Update``1">
<summary>
修改数据
</summary>
<typeparam name="T1"></typeparam>
<returns></returns>
</member>
<member name="M:IFreeSql.Update``1(System.Object)">
<summary>
修改数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
</summary>
<typeparam name="T1"></typeparam>
<param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param>
<returns></returns>
</member>
<member name="M:IFreeSql.Select``1">
<summary>
查询数据
</summary>
<typeparam name="T1"></typeparam>
<returns></returns>
</member>
<member name="M:IFreeSql.Select``1(System.Object)">
<summary>
查询数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
</summary>
<typeparam name="T1"></typeparam>
<param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param>
<returns></returns>
</member>
<member name="M:IFreeSql.Delete``1">
<summary>
删除数据
</summary>
<typeparam name="T1"></typeparam>
<returns></returns>
</member>
<member name="M:IFreeSql.Delete``1(System.Object)">
<summary>
删除数据,传入动态条件,如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
</summary>
<typeparam name="T1"></typeparam>
<param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param>
<returns></returns>
</member>
<member name="M:IFreeSql.Transaction(System.Action)">
<summary>
开启事务(不支持异步)<para></para>
v1.5.0 关闭了线程事务超时自动提交的机制
</summary>
<param name="handler">事务体 () => {}</param>
</member>
<member name="M:IFreeSql.Transaction(System.Data.IsolationLevel,System.Action)">
<summary>
开启事务(不支持异步)<para></para>
v1.5.0 关闭了线程事务超时自动提交的机制
</summary>
<param name="isolationLevel"></param>
<param name="handler">事务体 () => {}</param>
</member>
<member name="P:IFreeSql.Ado">
<summary>
数据库访问对象
</summary>
</member>
<member name="P:IFreeSql.Aop">
<summary>
所有拦截方法都在这里
</summary>
</member>
<member name="P:IFreeSql.CodeFirst">
<summary>
CodeFirst 模式开发相关方法
</summary>
</member>
<member name="P:IFreeSql.DbFirst">
<summary>
DbFirst 模式开发相关方法
</summary>
</member>
<member name="P:IFreeSql.GlobalFilter">
<summary>
全局过滤设置,可默认附加为 Select/Update/Delete 条件
</summary>
</member>
</members>
</doc>

View File

@@ -0,0 +1,97 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FreeSql.Internal;
namespace FreeSql.TDengine.Curd
{
internal class TDengineSelect<T1> : FreeSql.Internal.CommonProvider.Select1Provider<T1>
{
public TDengineSelect(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere)
{
}
public override ISelect<T1, T2> From<T2>(System.Linq.Expressions.Expression<Func<ISelectFromExpression<T1>, T2, ISelectFromExpression<T1>>> exp = null)
{
throw new NotImplementedException();
}
public override ISelect<T1, T2, T3> From<T2, T3>(System.Linq.Expressions.Expression<Func<ISelectFromExpression<T1>, T2, T3, ISelectFromExpression<T1>>> exp = null)
{
throw new NotImplementedException();
}
public override ISelect<T1, T2, T3, T4> From<T2, T3, T4>(System.Linq.Expressions.Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, ISelectFromExpression<T1>>> exp = null)
{
throw new NotImplementedException();
}
public override ISelect<T1, T2, T3, T4, T5> From<T2, T3, T4, T5>(System.Linq.Expressions.Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, ISelectFromExpression<T1>>> exp = null)
{
throw new NotImplementedException();
}
public override ISelect<T1, T2, T3, T4, T5, T6> From<T2, T3, T4, T5, T6>(System.Linq.Expressions.Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, ISelectFromExpression<T1>>> exp = null)
{
throw new NotImplementedException();
}
public override ISelect<T1, T2, T3, T4, T5, T6, T7> From<T2, T3, T4, T5, T6, T7>(System.Linq.Expressions.Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, ISelectFromExpression<T1>>> exp = null)
{
throw new NotImplementedException();
}
public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8> From<T2, T3, T4, T5, T6, T7, T8>(System.Linq.Expressions.Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, ISelectFromExpression<T1>>> exp = null)
{
throw new NotImplementedException();
}
public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9> From<T2, T3, T4, T5, T6, T7, T8, T9>(System.Linq.Expressions.Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, ISelectFromExpression<T1>>> exp = null)
{
throw new NotImplementedException();
}
public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> From<T2, T3, T4, T5, T6, T7, T8, T9, T10>(System.Linq.Expressions.Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, ISelectFromExpression<T1>>> exp = null)
{
throw new NotImplementedException();
}
public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> From<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(System.Linq.Expressions.Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, ISelectFromExpression<T1>>> exp = null)
{
throw new NotImplementedException();
}
public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> From<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(System.Linq.Expressions.Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, ISelectFromExpression<T1>>> exp = null)
{
throw new NotImplementedException();
}
public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> From<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(System.Linq.Expressions.Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, ISelectFromExpression<T1>>> exp = null)
{
throw new NotImplementedException();
}
public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> From<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(System.Linq.Expressions.Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, ISelectFromExpression<T1>>> exp = null)
{
throw new NotImplementedException();
}
public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> From<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(System.Linq.Expressions.Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, ISelectFromExpression<T1>>> exp = null)
{
throw new NotImplementedException();
}
public override ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> From<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>(System.Linq.Expressions.Expression<Func<ISelectFromExpression<T1>, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, ISelectFromExpression<T1>>> exp = null)
{
throw new NotImplementedException();
}
public override string ToSql(string field = null)
{
throw new NotImplementedException();
}
}
}

View File

@@ -22,6 +22,7 @@ namespace FreeSql.TDengine
{
var pool = new DbConnectionPool(DataType.TDengine, connectionFactory);
ConnectionString = pool.TestConnection?.ConnectionString;
_CreateCommandConnection = pool.TestConnection;
MasterPool = pool;
return;
}
@@ -92,8 +93,16 @@ namespace FreeSql.TDengine
return string.Concat("'", param.ToString()?.Replace("\\", "\\\\").Replace("'", "\\'"), "'");
}
DbConnection _CreateCommandConnection;
public override DbCommand CreateCommand()
{
if (_CreateCommandConnection != null)
{
_CreateCommandConnection.Open();
var cmd = _CreateCommandConnection.CreateCommand();
cmd.Connection = null;
return cmd;
}
return new TDengineCommand();
}

View File

@@ -6,6 +6,8 @@ using System.Data.Common;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using TDengine.Data.Client;
using TDengine.Driver;
using TDengine.Driver.Client;
namespace FreeSql.TDengine
{
@@ -29,9 +31,9 @@ namespace FreeSql.TDengine
policy.ConnectionString = connectionString;
}
internal void Return(Object<DbConnection> conn, Exception ex)
public void Return(Object<DbConnection> obj, Exception exception, bool isRecreate = false)
{
throw new NotImplementedException();
base.Return(obj, isRecreate);
}
}

View File

@@ -1,11 +1,21 @@
using System;
using System.Collections.Generic;
using FreeSql.DatabaseModel;
using FreeSql.Internal;
namespace FreeSql.TDengine
{
public class TDengineDbFirst : IDbFirst
{
IFreeSql _orm;
protected CommonUtils _commonUtils;
protected CommonExpression _commonExpression;
public TDengineDbFirst(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression)
{
_orm = orm;
_commonUtils = commonUtils;
_commonExpression = commonExpression;
}
public List<string> GetDatabases()
{
throw new NotImplementedException();

View File

@@ -1,6 +1,7 @@
using FreeSql.Internal.CommonProvider;
using System;
using System.Data.Common;
using FreeSql.TDengine.Curd;
namespace FreeSql.TDengine
{
@@ -9,15 +10,17 @@ namespace FreeSql.TDengine
public TDengineProvider(string masterConnectionString, string[] slaveConnectionString,
Func<DbConnection> connectionFactory = null)
{
this.InternalCommonUtils = new TDengineUtils(this);
this.InternalCommonExpression = new TDengineExpression(this.InternalCommonUtils);
this.Ado = new TDengineAdo(this.InternalCommonUtils, masterConnectionString, slaveConnectionString,
connectionFactory);
this.Aop = new AopProvider();
this.DbFirst = new TDengineDbFirst(this, this.InternalCommonUtils, this.InternalCommonExpression);
this.CodeFirst = new TDengineCodeFirst(this, this.InternalCommonUtils, this.InternalCommonExpression);
}
public override ISelect<T1> CreateSelectProvider<T1>(object dywhere)
{
throw new NotImplementedException();
}
public override ISelect<T1> CreateSelectProvider<T1>(object dywhere) => new TDengineSelect<T1>(this, this.InternalCommonUtils, this.InternalCommonExpression, dywhere);
public override IInsert<T1> CreateInsertProvider<T1>()
{

View File

@@ -2,7 +2,12 @@
using FreeSql.Internal.Model;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Numerics;
using TDengine.Data.Client;
using TDengine.Driver;
namespace FreeSql.TDengine
{
@@ -16,7 +21,8 @@ namespace FreeSql.TDengine
public override string NowUtc => throw new NotImplementedException();
public override DbParameter AppendParamter(List<DbParameter> _params, string parameterName, ColumnInfo col, Type type, object value)
public override DbParameter AppendParamter(List<DbParameter> _params, string parameterName, ColumnInfo col,
Type type, object value)
{
throw new NotImplementedException();
}
@@ -30,13 +36,67 @@ namespace FreeSql.TDengine
{
throw new NotImplementedException();
}
static Dictionary<string, Func<object, object>> dicGetParamterValue = new Dictionary<string, Func<object, object>> {
{ typeof(uint).FullName, a => long.Parse(string.Concat(a)) }, { typeof(uint[]).FullName, a => getParamterArrayValue(typeof(long), a, 0) }, { typeof(uint?[]).FullName, a => getParamterArrayValue(typeof(long?), a, null) },
{ typeof(ulong).FullName, a => decimal.Parse(string.Concat(a)) }, { typeof(ulong[]).FullName, a => getParamterArrayValue(typeof(decimal), a, 0) }, { typeof(ulong?[]).FullName, a => getParamterArrayValue(typeof(decimal?), a, null) },
{ typeof(ushort).FullName, a => int.Parse(string.Concat(a)) }, { typeof(ushort[]).FullName, a => getParamterArrayValue(typeof(int), a, 0) }, { typeof(ushort?[]).FullName, a => getParamterArrayValue(typeof(int?), a, null) },
{ typeof(byte).FullName, a => short.Parse(string.Concat(a)) }, { typeof(byte[]).FullName, a => getParamterArrayValue(typeof(short), a, 0) }, { typeof(byte?[]).FullName, a => getParamterArrayValue(typeof(short?), a, null) },
{ typeof(sbyte).FullName, a => short.Parse(string.Concat(a)) }, { typeof(sbyte[]).FullName, a => getParamterArrayValue(typeof(short), a, 0) }, { typeof(sbyte?[]).FullName, a => getParamterArrayValue(typeof(short?), a, null) },
{ typeof(char).FullName, a => string.Concat(a).Replace('\0', ' ').ToCharArray().FirstOrDefault() },
{ typeof(BigInteger).FullName, a => BigInteger.Parse(string.Concat(a), System.Globalization.NumberStyles.Any) }, { typeof(BigInteger[]).FullName, a => getParamterArrayValue(typeof(BigInteger), a, 0) }, { typeof(BigInteger?[]).FullName, a => getParamterArrayValue(typeof(BigInteger?), a, null) },
};
public override DbParameter[] GetDbParamtersByObject(string sql, object obj)
static Array getParamterArrayValue(Type arrayType, object value, object defaultValue)
{
throw new NotImplementedException();
var valueArr = value as Array;
var len = valueArr.GetLength(0);
var ret = Array.CreateInstance(arrayType, len);
for (var a = 0; a < len; a++)
{
var item = valueArr.GetValue(a);
ret.SetValue(item == null ? defaultValue : getParamterValue(item.GetType(), item, 1), a);
}
return ret;
}
public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, string specialParamFlag, ColumnInfo col, Type type, object value)
static object getParamterValue(Type type, object value, int level = 0)
{
if (type.FullName == "System.Byte[]") return value;
if (type.FullName == "System.Char[]") return value;
if (type.IsArray && level == 0)
{
var elementType = type.GetElementType();
Type enumType = null;
if (elementType.IsEnum) enumType = elementType;
else if (elementType.IsNullableType() && elementType.GenericTypeArguments.First().IsEnum) enumType = elementType.GenericTypeArguments.First();
if (enumType != null) return enumType.GetCustomAttributes(typeof(FlagsAttribute), false).Any() ?
getParamterArrayValue(typeof(long), value, elementType.IsEnum ? null : enumType.CreateInstanceGetDefaultValue()) :
getParamterArrayValue(typeof(int), value, elementType.IsEnum ? null : enumType.CreateInstanceGetDefaultValue());
return dicGetParamterValue.TryGetValue(type.FullName, out var trydicarr) ? trydicarr(value) : value;
}
if (type.IsNullableType()) type = type.GenericTypeArguments.First();
if (type.IsEnum) return (int)value;
if (dicGetParamterValue.TryGetValue(type.FullName, out var trydic)) return trydic(value);
return value;
}
public override DbParameter[] GetDbParamtersByObject(string sql, object obj)
=>
Utils.GetDbParamtersByObject<DbParameter>(sql, obj, "@", (name, type, value) =>
{
if (value != null) value = getParamterValue(type, value);
var ret = new TDengineParameter { ParameterName = $"@{name}", Value = value };
//if (value.GetType().IsEnum || value.GetType().GenericTypeArguments.FirstOrDefault()?.IsEnum == true) {
// ret.DataTypeName = "";
//} else {
var tp = _orm.CodeFirst.GetDbInfo(type)?.type;
if (tp != null) ret.DbType = (DbType)tp.Value;
//}
return ret;
});
public override string GetNoneParamaterSqlValue(List<DbParameter> specialParams, string specialParamFlag,
ColumnInfo col, Type type, object value)
{
throw new NotImplementedException();
}
@@ -51,10 +111,7 @@ namespace FreeSql.TDengine
throw new NotImplementedException();
}
public override string QuoteParamterName(string name)
{
throw new NotImplementedException();
}
public override string QuoteParamterName(string name) => $"@{name}";
public override string QuoteSqlNameAdapter(params string[] name)
{
@@ -86,4 +143,4 @@ namespace FreeSql.TDengine
throw new NotImplementedException();
}
}
}
}