优化QuestDb Insert Update 相关逻辑

This commit is contained in:
d4ilys
2025-10-16 10:00:39 +08:00
parent 3b10c5f428
commit 7dec9321f6
4 changed files with 56 additions and 35 deletions

View File

@@ -10,6 +10,7 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using FreeSql.Provider.QuestDb;
namespace FreeSql.QuestDb.Curd namespace FreeSql.QuestDb.Curd
{ {
@@ -32,11 +33,12 @@ namespace FreeSql.QuestDb.Curd
internal void InternalClearData() => ClearData(); internal void InternalClearData() => ClearData();
internal string InternalTableRuleInvoke() => TableRuleInvoke(); internal string InternalTableRuleInvoke() => TableRuleInvoke();
private int InternelExecuteAffrows() private int RestApiExecuteAffrows()
{ {
//如果设置了RestAPI的Url则走HTTP //如果设置了RestAPI的Url则走HTTP
var apiFeatures = ServiceContainer.GetService<QuestResetApiFeatures>();
var sql = ToSql(); var sql = ToSql();
var execAsync = RestAPIExtension.ExecAsync(sql).GetAwaiter().GetResult(); var execAsync = apiFeatures.ExecAsync(sql).GetAwaiter().GetResult();
var resultHash = new Hashtable(); var resultHash = new Hashtable();
try try
{ {
@@ -49,18 +51,21 @@ namespace FreeSql.QuestDb.Curd
throw new Exception("请确认new FreeSqlBuilder().UseQuestDbRestAPI()中设置的用户名密码是否正确."); throw new Exception("请确认new FreeSqlBuilder().UseQuestDbRestAPI()中设置的用户名密码是否正确.");
} }
} }
var ddl = resultHash["ddl"]?.ToString(); var ddl = resultHash["ddl"]?.ToString();
return ddl?.ToLower() == "ok" ? 1 : 0; return ddl?.ToLower() == "ok" ? 1 : 0;
} }
public override int ExecuteAffrows() public override int ExecuteAffrows()
{ {
if (string.IsNullOrWhiteSpace(RestAPIExtension.BaseUrl)) var apiFeatures = ServiceContainer.GetService<QuestResetApiFeatures>();
if (apiFeatures != null && string.IsNullOrWhiteSpace(apiFeatures.BaseAddress))
{ {
return base.SplitExecuteAffrows(_batchValuesLimit > 0 ? _batchValuesLimit : 5000, return base.SplitExecuteAffrows(_batchValuesLimit > 0 ? _batchValuesLimit : 5000,
_batchParameterLimit > 0 ? _batchParameterLimit : 3000); _batchParameterLimit > 0 ? _batchParameterLimit : 3000);
} }
return InternelExecuteAffrows();
return RestApiExecuteAffrows();
} }
public override long ExecuteIdentity() => base.SplitExecuteIdentity( public override long ExecuteIdentity() => base.SplitExecuteIdentity(
@@ -170,12 +175,14 @@ namespace FreeSql.QuestDb.Curd
#else #else
public override Task<int> ExecuteAffrowsAsync(CancellationToken cancellationToken = default) public override Task<int> ExecuteAffrowsAsync(CancellationToken cancellationToken = default)
{ {
if (string.IsNullOrWhiteSpace(RestAPIExtension.BaseUrl)) var apiFeatures = ServiceContainer.GetService<QuestResetApiFeatures>();
if (apiFeatures != null && string.IsNullOrWhiteSpace(apiFeatures.BaseAddress))
{ {
return base.SplitExecuteAffrowsAsync(_batchValuesLimit > 0 ? _batchValuesLimit : 5000, return base.SplitExecuteAffrowsAsync(_batchValuesLimit > 0 ? _batchValuesLimit : 5000,
_batchParameterLimit > 0 ? _batchParameterLimit : 3000, cancellationToken); _batchParameterLimit > 0 ? _batchParameterLimit : 3000, cancellationToken);
} }
return Task.FromResult(InternelExecuteAffrows());
return Task.FromResult(RestApiExecuteAffrows());
} }
@@ -187,7 +194,7 @@ namespace FreeSql.QuestDb.Curd
base.SplitExecuteInsertedAsync(_batchValuesLimit > 0 ? _batchValuesLimit : 5000, base.SplitExecuteInsertedAsync(_batchValuesLimit > 0 ? _batchValuesLimit : 5000,
_batchParameterLimit > 0 ? _batchParameterLimit : 3000, cancellationToken); _batchParameterLimit > 0 ? _batchParameterLimit : 3000, cancellationToken);
async protected override Task<long> RawExecuteIdentityAsync(CancellationToken cancellationToken = default) protected override async Task<long> RawExecuteIdentityAsync(CancellationToken cancellationToken = default)
{ {
var sql = this.ToSql(); var sql = this.ToSql();
if (string.IsNullOrEmpty(sql)) return 0; if (string.IsNullOrEmpty(sql)) return 0;
@@ -243,7 +250,7 @@ namespace FreeSql.QuestDb.Curd
return ret; return ret;
} }
async protected override Task<List<T1>> RawExecuteInsertedAsync(CancellationToken cancellationToken = default) protected override async Task<List<T1>> RawExecuteInsertedAsync(CancellationToken cancellationToken = default)
{ {
var sql = this.ToSql(); var sql = this.ToSql();
if (string.IsNullOrEmpty(sql)) return new List<T1>(); if (string.IsNullOrEmpty(sql)) return new List<T1>();

View File

@@ -10,6 +10,7 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using FreeSql.Provider.QuestDb;
namespace FreeSql.QuestDb.Curd namespace FreeSql.QuestDb.Curd
{ {
@@ -31,10 +32,11 @@ namespace FreeSql.QuestDb.Curd
internal void InternalToSqlCaseWhenEnd(StringBuilder sb, ColumnInfo col) => ToSqlCaseWhenEnd(sb, col); internal void InternalToSqlCaseWhenEnd(StringBuilder sb, ColumnInfo col) => ToSqlCaseWhenEnd(sb, col);
private int InternelExecuteAffrows() private int RestApiExecuteAffrows()
{ {
var apiFeatures = ServiceContainer.GetService<QuestResetApiFeatures>();
var sql = ToSql(); var sql = ToSql();
var execAsync = RestAPIExtension.ExecAsync(sql).GetAwaiter().GetResult(); var execAsync = apiFeatures.ExecAsync(sql).GetAwaiter().GetResult();
var resultHash = new Hashtable(); var resultHash = new Hashtable();
try try
{ {
@@ -47,6 +49,7 @@ namespace FreeSql.QuestDb.Curd
throw new Exception("请确认new FreeSqlBuilder().UseQuestDbRestAPI()中设置的用户名密码是否正确."); throw new Exception("请确认new FreeSqlBuilder().UseQuestDbRestAPI()中设置的用户名密码是否正确.");
} }
} }
var ddl = resultHash["ddl"]?.ToString(); var ddl = resultHash["ddl"]?.ToString();
var updated = Convert.ToInt32(resultHash["updated"]); var updated = Convert.ToInt32(resultHash["updated"]);
return ddl?.ToLower() == "ok" ? updated : 0; return ddl?.ToLower() == "ok" ? updated : 0;
@@ -54,16 +57,20 @@ namespace FreeSql.QuestDb.Curd
public override int ExecuteAffrows() public override int ExecuteAffrows()
{ {
//如果设置了RestAPI中Url则走HTTP //如果设置了RestApi 则走HTTP执行Sql
if (string.IsNullOrWhiteSpace(RestAPIExtension.BaseUrl)) var apiFeatures = ServiceContainer.GetService<QuestResetApiFeatures>();
if (apiFeatures != null && string.IsNullOrWhiteSpace(apiFeatures.BaseAddress))
{ {
return base.SplitExecuteAffrows(_batchRowsLimit > 0 ? _batchRowsLimit : 500, return base.SplitExecuteAffrows(_batchRowsLimit > 0 ? _batchRowsLimit : 500,
_batchParameterLimit > 0 ? _batchParameterLimit : 3000); _batchParameterLimit > 0 ? _batchParameterLimit : 3000);
} }
return InternelExecuteAffrows();
return RestApiExecuteAffrows();
} }
protected override List<TReturn> ExecuteUpdated<TReturn>(IEnumerable<ColumnInfo> columns) => base.SplitExecuteUpdated<TReturn>(_batchRowsLimit > 0 ? _batchRowsLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 3000, columns); protected override List<TReturn> ExecuteUpdated<TReturn>(IEnumerable<ColumnInfo> columns) =>
base.SplitExecuteUpdated<TReturn>(_batchRowsLimit > 0 ? _batchRowsLimit : 500,
_batchParameterLimit > 0 ? _batchParameterLimit : 3000, columns);
protected override List<TReturn> RawExecuteUpdated<TReturn>(IEnumerable<ColumnInfo> columns) protected override List<TReturn> RawExecuteUpdated<TReturn>(IEnumerable<ColumnInfo> columns)
{ {
@@ -96,7 +103,8 @@ namespace FreeSql.QuestDb.Curd
try try
{ {
var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null;
var rettmp = _orm.Ado.Query<TReturn>(queryType, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms); var rettmp = _orm.Ado.Query<TReturn>(queryType, _connection, _transaction, CommandType.Text, sql,
_commandTimeout, dbParms);
ValidateVersionAndThrow(rettmp.Count, sql, dbParms); ValidateVersionAndThrow(rettmp.Count, sql, dbParms);
ret.AddRange(rettmp); ret.AddRange(rettmp);
} }
@@ -178,19 +186,24 @@ namespace FreeSql.QuestDb.Curd
#else #else
public override Task<int> ExecuteAffrowsAsync(CancellationToken cancellationToken = default) public override Task<int> ExecuteAffrowsAsync(CancellationToken cancellationToken = default)
{ {
if (string.IsNullOrWhiteSpace(RestAPIExtension.BaseUrl)) var apiFeatures = ServiceContainer.GetService<QuestResetApiFeatures>();
if (apiFeatures != null && string.IsNullOrWhiteSpace(apiFeatures.BaseAddress))
{ {
return base.SplitExecuteAffrowsAsync(_batchRowsLimit > 0 ? _batchRowsLimit : 500, return base.SplitExecuteAffrowsAsync(_batchRowsLimit > 0 ? _batchRowsLimit : 500,
_batchParameterLimit > 0 ? _batchParameterLimit : 3000, cancellationToken); _batchParameterLimit > 0 ? _batchParameterLimit : 3000, cancellationToken);
} }
return Task.FromResult(InternelExecuteAffrows()); return Task.FromResult(RestApiExecuteAffrows());
} }
protected override Task<List<TReturn>> ExecuteUpdatedAsync<TReturn>(IEnumerable<ColumnInfo> columns, CancellationToken cancellationToken = default) => base.SplitExecuteUpdatedAsync<TReturn>(_batchRowsLimit > 0 ? _batchRowsLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 3000, columns, cancellationToken); protected override Task<List<TReturn>> ExecuteUpdatedAsync<TReturn>(IEnumerable<ColumnInfo> columns,
CancellationToken cancellationToken = default) => base.SplitExecuteUpdatedAsync<TReturn>(
_batchRowsLimit > 0 ? _batchRowsLimit : 500, _batchParameterLimit > 0 ? _batchParameterLimit : 3000,
columns, cancellationToken);
async protected override Task<List<TReturn>> RawExecuteUpdatedAsync<TReturn>(IEnumerable<ColumnInfo> columns, CancellationToken cancellationToken = default) protected override async Task<List<TReturn>> RawExecuteUpdatedAsync<TReturn>(IEnumerable<ColumnInfo> columns,
CancellationToken cancellationToken = default)
{ {
var ret = new List<TReturn>(); var ret = new List<TReturn>();
DbParameter[] dbParms = null; DbParameter[] dbParms = null;
@@ -221,7 +234,8 @@ namespace FreeSql.QuestDb.Curd
try try
{ {
var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null;
var rettmp = await _orm.Ado.QueryAsync<TReturn>(queryType, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); var rettmp = await _orm.Ado.QueryAsync<TReturn>(queryType, _connection, _transaction,
CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken);
ValidateVersionAndThrow(rettmp.Count, sql, dbParms); ValidateVersionAndThrow(rettmp.Count, sql, dbParms);
ret.AddRange(rettmp); ret.AddRange(rettmp);
} }

View File

@@ -351,7 +351,7 @@ static class LatestOnExtension
} }
} }
class QuestResetApiFeatures internal class QuestResetApiFeatures
{ {
internal string BaseAddress { get; set; } internal string BaseAddress { get; set; }

View File

@@ -9,18 +9,18 @@ namespace FreeSql.Provider.QuestDb
internal class ServiceContainer internal class ServiceContainer
{ {
private static IServiceCollection _services; private static IServiceCollection _services;
internal static IServiceProvider ServiceProvider { get; private set; } private static IServiceProvider _serviceProvider;
internal static void Initialize(Action<IServiceCollection> service) internal static void Initialize(Action<IServiceCollection> service)
{ {
_services = new ServiceCollection(); _services = new ServiceCollection();
service?.Invoke(_services); service?.Invoke(_services);
ServiceProvider = _services.BuildServiceProvider(); _serviceProvider = _services.BuildServiceProvider();
} }
internal static T GetService<T>() internal static T GetService<T>()
{ {
return ServiceProvider.GetService<T>(); return _serviceProvider == null ? default : _serviceProvider.GetService<T>();
} }
} }
} }