mirror of
https://github.com/dotnetcore/FreeSql.git
synced 2026-02-13 03:40:57 +08:00
优化QuestDb Insert Update 相关逻辑
This commit is contained in:
@@ -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>();
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -351,7 +351,7 @@ static class LatestOnExtension
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class QuestResetApiFeatures
|
internal class QuestResetApiFeatures
|
||||||
{
|
{
|
||||||
internal string BaseAddress { get; set; }
|
internal string BaseAddress { get; set; }
|
||||||
|
|
||||||
|
|||||||
@@ -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>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user