优化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.Threading;
using System.Threading.Tasks;
using FreeSql.Provider.QuestDb;
namespace FreeSql.QuestDb.Curd
{
@@ -32,11 +33,12 @@ namespace FreeSql.QuestDb.Curd
internal void InternalClearData() => ClearData();
internal string InternalTableRuleInvoke() => TableRuleInvoke();
private int InternelExecuteAffrows()
private int RestApiExecuteAffrows()
{
//如果设置了RestAPI的Url则走HTTP
var apiFeatures = ServiceContainer.GetService<QuestResetApiFeatures>();
var sql = ToSql();
var execAsync = RestAPIExtension.ExecAsync(sql).GetAwaiter().GetResult();
var execAsync = apiFeatures.ExecAsync(sql).GetAwaiter().GetResult();
var resultHash = new Hashtable();
try
{
@@ -49,18 +51,21 @@ namespace FreeSql.QuestDb.Curd
throw new Exception("请确认new FreeSqlBuilder().UseQuestDbRestAPI()中设置的用户名密码是否正确.");
}
}
var ddl = resultHash["ddl"]?.ToString();
return ddl?.ToLower() == "ok" ? 1 : 0;
}
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,
_batchParameterLimit > 0 ? _batchParameterLimit : 3000);
}
return InternelExecuteAffrows();
return RestApiExecuteAffrows();
}
public override long ExecuteIdentity() => base.SplitExecuteIdentity(
@@ -170,12 +175,14 @@ namespace FreeSql.QuestDb.Curd
#else
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,
_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,
_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();
if (string.IsNullOrEmpty(sql)) return 0;
@@ -243,7 +250,7 @@ namespace FreeSql.QuestDb.Curd
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();
if (string.IsNullOrEmpty(sql)) return new List<T1>();

View File

@@ -10,6 +10,7 @@ using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using FreeSql.Provider.QuestDb;
namespace FreeSql.QuestDb.Curd
{
@@ -31,10 +32,11 @@ namespace FreeSql.QuestDb.Curd
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 execAsync = RestAPIExtension.ExecAsync(sql).GetAwaiter().GetResult();
var execAsync = apiFeatures.ExecAsync(sql).GetAwaiter().GetResult();
var resultHash = new Hashtable();
try
{
@@ -47,6 +49,7 @@ namespace FreeSql.QuestDb.Curd
throw new Exception("请确认new FreeSqlBuilder().UseQuestDbRestAPI()中设置的用户名密码是否正确.");
}
}
var ddl = resultHash["ddl"]?.ToString();
var updated = Convert.ToInt32(resultHash["updated"]);
return ddl?.ToLower() == "ok" ? updated : 0;
@@ -54,16 +57,20 @@ namespace FreeSql.QuestDb.Curd
public override int ExecuteAffrows()
{
//如果设置了RestAPI中Url则走HTTP
if (string.IsNullOrWhiteSpace(RestAPIExtension.BaseUrl))
//如果设置了RestApi 则走HTTP执行Sql
var apiFeatures = ServiceContainer.GetService<QuestResetApiFeatures>();
if (apiFeatures != null && string.IsNullOrWhiteSpace(apiFeatures.BaseAddress))
{
return base.SplitExecuteAffrows(_batchRowsLimit > 0 ? _batchRowsLimit : 500,
_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)
{
@@ -96,7 +103,8 @@ namespace FreeSql.QuestDb.Curd
try
{
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);
ret.AddRange(rettmp);
}
@@ -178,19 +186,24 @@ namespace FreeSql.QuestDb.Curd
#else
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,
_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>();
DbParameter[] dbParms = null;
@@ -221,7 +234,8 @@ namespace FreeSql.QuestDb.Curd
try
{
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);
ret.AddRange(rettmp);
}

View File

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

View File

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