From bdeb264fe9cf483cec714fd5f6c3f3959cf064df Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Fri, 28 Mar 2025 14:00:24 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20MySql8.0.30=20?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E4=BD=BF=E7=94=A8=20ExecuteInserted=20?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=9B#2001?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Program.cs | 9 ++ FreeSql.DbContext/FreeSql.DbContext.xml | 8 ++ .../CommonProvider/AdoProvider/AdoProvider.cs | 2 +- .../Internal/CommonProvider/UpdateProvider.cs | 14 +- .../CommonProvider/UpdateProviderAsync.cs | 15 +- .../MySql/Curd/CustomMySqlInsert.cs | 54 +++---- .../MySql/Curd/CustomMySqlUpdate.cs | 94 +++++++----- .../Curd/MySqlInsert.cs | 54 +++---- .../Curd/MySqlUpdate.cs | 48 +++++-- .../MySql/Curd/OdbcMySqlInsert.cs | 54 +++---- .../MySql/Curd/OdbcMySqlUpdate.cs | 136 +++++++++++------- 11 files changed, 287 insertions(+), 201 deletions(-) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 7f38c8d4a..13ef61d3d 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -621,7 +621,16 @@ namespace base_entity BaseEntity.Initialization(fsql, () => _asyncUow.Value); #endregion + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Insert(new List + { + new User1 { Nickname = "nickname11", Username = "username11", Description = "desc11" }, + new User1 { Nickname = "n2", Username = "u2", Description = "d2" }, + new User1 { Nickname = "n3", Username = "u3", Description = "d3" }, + }).ExecuteAffrows(); + fsql.Insert(new User1()).ExecuteInserted(); + fsql.Update().SetSource(new User1()).ExecuteUpdated(); fsql.InsertOrUpdate().SetSource(new AppInfoEntity { AppID = "03DN8CW8", AppName = "app_01" }).ExecuteAffrows(); var repo2211 = fsql.GetRepository(); diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index a7a94fcda..c941a15d9 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -758,5 +758,13 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs index 8a0b0d2e6..84ca94b41 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs @@ -92,7 +92,7 @@ namespace FreeSql.Internal.CommonProvider } } - internal Dictionary GetQueryTypeProperties(Type type) + public static Dictionary GetQueryTypeProperties(Type type) { return type.GetPropertiesDictIgnoreCase(); //与 ExecuteArrayRowReadClassOrTuple 顺序同步,防止【延时属性】获取到位置不对的问题 //var tb = _util.GetTableByEntity(type); diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 66d3fe650..71fd55997 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -8,6 +8,7 @@ using System.Data.Common; using System.Linq; using System.Linq.Expressions; using System.Text; +using System.Threading; using System.Threading.Tasks; namespace FreeSql.Internal.CommonProvider @@ -476,13 +477,20 @@ namespace FreeSql.Internal.CommonProvider public abstract int ExecuteAffrows(); protected abstract List ExecuteUpdated(IEnumerable columns); - public List ExecuteUpdated() => ExecuteUpdated(_table.ColumnsByPosition); + public List ExecuteUpdated() + { + var ret = ExecuteUpdated(_table.Columns.Values); + if (_table.TypeLazySetOrm != null) ret.ForEach(item => _table.TypeLazySetOrm.Invoke(item, new object[] { _orm })); + return ret; + } public List ExecuteUpdated(Expression> returnColumns) { var cols = _commonExpression.ExpressionSelectColumns_MemberAccess_New_NewArrayInit(null, null, returnColumns?.Body, false, null) .Distinct().Select(a => _table.ColumnsByCs.TryGetValue(a, out var c) ? c : null).Where(a => a != null).ToArray(); - return ExecuteUpdated(cols); - } + var ret = ExecuteUpdated(cols); + if (_table.TypeLazySetOrm != null) ret.ForEach(item => _table.TypeLazySetOrm.Invoke(item, new object[] { _orm })); + return ret; + } public IUpdate IgnoreColumns(Expression> columns) => IgnoreColumns(_commonExpression.ExpressionSelectColumns_MemberAccess_New_NewArrayInit(null, null, columns?.Body, false, null)); public IUpdate UpdateColumns(Expression> columns) => UpdateColumns(_commonExpression.ExpressionSelectColumns_MemberAccess_New_NewArrayInit(null, null, columns?.Body, false, null)); diff --git a/FreeSql/Internal/CommonProvider/UpdateProviderAsync.cs b/FreeSql/Internal/CommonProvider/UpdateProviderAsync.cs index 45bc2f898..4f999d309 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProviderAsync.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProviderAsync.cs @@ -143,13 +143,20 @@ namespace FreeSql.Internal.CommonProvider public abstract Task ExecuteAffrowsAsync(CancellationToken cancellationToken = default); protected abstract Task> ExecuteUpdatedAsync(IEnumerable columns, CancellationToken cancellationToken = default); - public Task> ExecuteUpdatedAsync(CancellationToken cancellationToken = default) => ExecuteUpdatedAsync(_table.ColumnsByPosition, cancellationToken); - public Task> ExecuteUpdatedAsync(Expression> returnColumns, CancellationToken cancellationToken = default) + async public Task> ExecuteUpdatedAsync(CancellationToken cancellationToken = default) + { + var ret = await ExecuteUpdatedAsync(_table.ColumnsByPosition, cancellationToken); + if (_table.TypeLazySetOrm != null) ret.ForEach(item => _table.TypeLazySetOrm.Invoke(item, new object[] { _orm })); + return ret; + } + async public Task> ExecuteUpdatedAsync(Expression> returnColumns, CancellationToken cancellationToken = default) { var cols = _commonExpression.ExpressionSelectColumns_MemberAccess_New_NewArrayInit(null, null, returnColumns?.Body, false, null) .Distinct().Select(a => _table.ColumnsByCs.TryGetValue(a, out var c) ? c : null).Where(a => a != null).ToArray(); - return ExecuteUpdatedAsync(cols, cancellationToken); - } + var ret = await ExecuteUpdatedAsync(cols, cancellationToken); + if (_table.TypeLazySetOrm != null) ret.ForEach(item => _table.TypeLazySetOrm.Invoke(item, new object[] { _orm })); + return ret; + } #endif } } diff --git a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlInsert.cs b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlInsert.cs index a6902fbec..fc5197df2 100644 --- a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlInsert.cs +++ b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlInsert.cs @@ -1,10 +1,12 @@ using FreeSql.Internal; +using FreeSql.Internal.CommonProvider; using FreeSql.Internal.Model; using FreeSql.Internal.ObjectPool; using System; using System.Collections.Generic; using System.Data; using System.Data.Common; +using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -89,24 +91,18 @@ namespace FreeSql.Custom.MySql sb.Append(sql).Append(" RETURNING "); var colidx = 0; - var propidx = 0; - var props = _table.Type.GetPropertiesDictIgnoreCase(); - var indexes = new int[props.Count]; - var sbflag = new StringBuilder().Append("insertedQuery"); - foreach (var prop in props) + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + foreach (var col in _table.Columns.Values) { - if (_table.ColumnsByCs.TryGetValue(prop.Key, out var col)) - { - if (colidx > 0) sb.Append(", "); - sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - indexes[propidx] = colidx; - ++colidx; - } - else - indexes[propidx] = -1; - ++propidx; + if (colidx > 0) sb.Append(", "); + sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); + ++colidx; } + var indexes = AdoProvider.GetQueryTypeProperties(_table.TypeLazy ?? _table.Type).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); var flag = sbflag.ToString(); sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); @@ -185,24 +181,18 @@ namespace FreeSql.Custom.MySql sb.Append(sql).Append(" RETURNING "); var colidx = 0; - var propidx = 0; - var props = _table.Type.GetPropertiesDictIgnoreCase(); - var indexes = new int[props.Count]; - var sbflag = new StringBuilder().Append("insertedQuery"); - foreach (var prop in props) + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + foreach (var col in _table.Columns.Values) { - if (_table.ColumnsByCs.TryGetValue(prop.Key, out var col)) - { - if (colidx > 0) sb.Append(", "); - sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - indexes[propidx] = colidx; - ++colidx; - } - else - indexes[propidx] = -1; - ++propidx; + if (colidx > 0) sb.Append(", "); + sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); + ++colidx; } + var indexes = AdoProvider.GetQueryTypeProperties(_table.TypeLazy ?? _table.Type).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); var flag = sbflag.ToString(); sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); diff --git a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlUpdate.cs b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlUpdate.cs index 65929f1c0..1dcdecb5b 100644 --- a/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlUpdate.cs +++ b/Providers/FreeSql.Provider.Custom/MySql/Curd/CustomMySqlUpdate.cs @@ -1,4 +1,5 @@ using FreeSql.Internal; +using FreeSql.Internal.CommonProvider; using FreeSql.Internal.Model; using System; using System.Collections.Generic; @@ -35,35 +36,48 @@ namespace FreeSql.Custom.MySql var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; - ToSqlFetch(sb => - { - if (dbParms == null) - { - dbParms = _params.Concat(_paramsSource).ToArray(); - sbret = new StringBuilder(); - sbret.Append(" RETURNING "); + var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; + int[] queryIndexs = null; + var queryFlag = ""; + ToSqlFetch(sb => + { + if (dbParms == null) + { + dbParms = _params.Concat(_paramsSource).ToArray(); + sbret = new StringBuilder(); + sbret.Append(" RETURNING "); - var colidx = 0; - foreach (var col in columns) - { - if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); - ++colidx; - } - } - var sql = sb.Append(sbret).ToString(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); - _orm.Aop.CurdBeforeHandler?.Invoke(this, before); + var colidx = 0; + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + foreach (var col in columns) + { + if (colidx > 0) sb.Append(", "); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); + ++colidx; + } + queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); + queryFlag = sbflag.ToString(); + } + var sql = sb.Append(sbret).ToString(); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); + _orm.Aop.CurdBeforeHandler?.Invoke(this, before); - Exception exception = null; - try - { - var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; - var rettmp = _orm.Ado.Query(queryType, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms); - ValidateVersionAndThrow(rettmp.Count, sql, dbParms); - ret.AddRange(rettmp); - } - catch (Exception ex) + Exception exception = null; + try + { + var rettmp = new List(); + _orm.Ado.ExecuteReader(_connection, _transaction, fetch => + { + rettmp.Add((TReturn)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); + }, CommandType.Text, sql, _commandTimeout, dbParms); + ValidateVersionAndThrow(rettmp.Count, sql, dbParms); + ret.AddRange(rettmp); + } + catch (Exception ex) { exception = ex; throw; @@ -125,6 +139,9 @@ namespace FreeSql.Custom.MySql var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; + var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; + int[] queryIndexs = null; + var queryFlag = ""; await ToSqlFetchAsync(async sb => { if (dbParms == null) @@ -134,12 +151,19 @@ namespace FreeSql.Custom.MySql sbret.Append(" RETURNING "); var colidx = 0; + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in columns) { - if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + if (colidx > 0) sb.Append(", "); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); ++colidx; } + queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); + queryFlag = sbflag.ToString(); } var sql = sb.Append(sbret).ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); @@ -147,10 +171,14 @@ namespace FreeSql.Custom.MySql Exception exception = null; try - { - var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; - var rettmp = await _orm.Ado.QueryAsync(queryType, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); - ValidateVersionAndThrow(rettmp.Count, sql, dbParms); + { + var rettmp = new List(); + await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch => + { + rettmp.Add((TReturn)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); + return Task.FromResult(false); + }, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); + ValidateVersionAndThrow(rettmp.Count, sql, dbParms); ret.AddRange(rettmp); } catch (Exception ex) diff --git a/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs index 33e358e92..d826397e2 100644 --- a/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs +++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlInsert.cs @@ -1,9 +1,11 @@ using FreeSql.Internal; +using FreeSql.Internal.CommonProvider; using FreeSql.Internal.Model; using System; using System.Collections.Generic; using System.Data; using System.Data.Common; +using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -77,24 +79,18 @@ namespace FreeSql.MySql.Curd sb.Append(sql).Append(" RETURNING "); var colidx = 0; - var propidx = 0; - var props = _table.Type.GetPropertiesDictIgnoreCase(); //与 ExecuteArrayRowReadClassOrTuple 顺序同步 - var indexes = new int[props.Count]; - var sbflag = new StringBuilder().Append("insertedQuery"); - foreach (var prop in props) + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + foreach (var col in _table.Columns.Values) { - if (_table.ColumnsByCs.TryGetValue(prop.Key, out var col)) - { - if (colidx > 0) sb.Append(", "); - sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - indexes[propidx] = colidx; - ++colidx; - } - else - indexes[propidx] = -1; - ++propidx; + if (colidx > 0) sb.Append(", "); + sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); + ++colidx; } + var indexes = AdoProvider.GetQueryTypeProperties(_table.TypeLazy ?? _table.Type).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); var flag = sbflag.ToString(); sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); @@ -162,24 +158,18 @@ namespace FreeSql.MySql.Curd sb.Append(sql).Append(" RETURNING "); var colidx = 0; - var propidx = 0; - var props = _table.Type.GetPropertiesDictIgnoreCase(); - var indexes = new int[props.Count]; - var sbflag = new StringBuilder().Append("insertedQuery"); - foreach (var prop in props) + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + foreach (var col in _table.Columns.Values) { - if (_table.ColumnsByCs.TryGetValue(prop.Key, out var col)) - { - if (colidx > 0) sb.Append(", "); - sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - indexes[propidx] = colidx; - ++colidx; - } - else - indexes[propidx] = -1; - ++propidx; + if (colidx > 0) sb.Append(", "); + sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); + ++colidx; } + var indexes = AdoProvider.GetQueryTypeProperties(_table.TypeLazy ?? _table.Type).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); var flag = sbflag.ToString(); sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); diff --git a/Providers/FreeSql.Provider.MySql/Curd/MySqlUpdate.cs b/Providers/FreeSql.Provider.MySql/Curd/MySqlUpdate.cs index cee1e9ef3..1b587db9c 100644 --- a/Providers/FreeSql.Provider.MySql/Curd/MySqlUpdate.cs +++ b/Providers/FreeSql.Provider.MySql/Curd/MySqlUpdate.cs @@ -1,4 +1,5 @@ using FreeSql.Internal; +using FreeSql.Internal.CommonProvider; using FreeSql.Internal.Model; using System; using System.Collections.Generic; @@ -35,6 +36,9 @@ namespace FreeSql.MySql.Curd var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; + var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; + int[] queryIndexs = null; + var queryFlag = ""; ToSqlFetch(sb => { if (dbParms == null) @@ -44,12 +48,19 @@ namespace FreeSql.MySql.Curd sbret.Append(" RETURNING "); var colidx = 0; + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in columns) { - if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + if (colidx > 0) sb.Append(", "); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); ++colidx; } + queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); + queryFlag = sbflag.ToString(); } var sql = sb.Append(sbret).ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); @@ -58,8 +69,11 @@ namespace FreeSql.MySql.Curd Exception exception = null; try { - var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; - var rettmp = _orm.Ado.Query(queryType, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms); + var rettmp = new List(); + _orm.Ado.ExecuteReader(_connection, _transaction, fetch => + { + rettmp.Add((TReturn)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); + }, CommandType.Text, sql, _commandTimeout, dbParms); ValidateVersionAndThrow(rettmp.Count, sql, dbParms); ret.AddRange(rettmp); } @@ -125,6 +139,9 @@ namespace FreeSql.MySql.Curd var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; + var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; + int[] queryIndexs = null; + var queryFlag = ""; await ToSqlFetchAsync(async sb => { if (dbParms == null) @@ -134,12 +151,19 @@ namespace FreeSql.MySql.Curd sbret.Append(" RETURNING "); var colidx = 0; + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); foreach (var col in columns) { - if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); + if (colidx > 0) sb.Append(", "); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); ++colidx; } + queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); + queryFlag = sbflag.ToString(); } var sql = sb.Append(sbret).ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); @@ -147,10 +171,14 @@ namespace FreeSql.MySql.Curd Exception exception = null; try - { - var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; - var rettmp = await _orm.Ado.QueryAsync(queryType, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); - ValidateVersionAndThrow(rettmp.Count, sql, dbParms); + { + var rettmp = new List(); + await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch => + { + rettmp.Add((TReturn)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); + return Task.FromResult(false); + }, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); + ValidateVersionAndThrow(rettmp.Count, sql, dbParms); ret.AddRange(rettmp); } catch (Exception ex) diff --git a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsert.cs b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsert.cs index 703071dbd..fa552338b 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsert.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlInsert.cs @@ -1,10 +1,12 @@ using FreeSql.Internal; +using FreeSql.Internal.CommonProvider; using FreeSql.Internal.Model; using FreeSql.Internal.ObjectPool; using System; using System.Collections.Generic; using System.Data; using System.Data.Common; +using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -89,24 +91,18 @@ namespace FreeSql.Odbc.MySql sb.Append(sql).Append(" RETURNING "); var colidx = 0; - var propidx = 0; - var props = _table.Type.GetPropertiesDictIgnoreCase(); - var indexes = new int[props.Count]; - var sbflag = new StringBuilder().Append("insertedQuery"); - foreach (var prop in props) + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + foreach (var col in _table.Columns.Values) { - if (_table.ColumnsByCs.TryGetValue(prop.Key, out var col)) - { - if (colidx > 0) sb.Append(", "); - sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - indexes[propidx] = colidx; - ++colidx; - } - else - indexes[propidx] = -1; - ++propidx; + if (colidx > 0) sb.Append(", "); + sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); + ++colidx; } + var indexes = AdoProvider.GetQueryTypeProperties(_table.TypeLazy ?? _table.Type).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); var flag = sbflag.ToString(); sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); @@ -185,24 +181,18 @@ namespace FreeSql.Odbc.MySql sb.Append(sql).Append(" RETURNING "); var colidx = 0; - var propidx = 0; - var props = _table.Type.GetPropertiesDictIgnoreCase(); - var indexes = new int[props.Count]; - var sbflag = new StringBuilder().Append("insertedQuery"); - foreach (var prop in props) + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + foreach (var col in _table.Columns.Values) { - if (_table.ColumnsByCs.TryGetValue(prop.Key, out var col)) - { - if (colidx > 0) sb.Append(", "); - sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); - sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); - indexes[propidx] = colidx; - ++colidx; - } - else - indexes[propidx] = -1; - ++propidx; + if (colidx > 0) sb.Append(", "); + sb.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); + ++colidx; } + var indexes = AdoProvider.GetQueryTypeProperties(_table.TypeLazy ?? _table.Type).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); var flag = sbflag.ToString(); sql = sb.ToString(); var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Insert, sql, _params); diff --git a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlUpdate.cs b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlUpdate.cs index a34e97dc4..8b9a496eb 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlUpdate.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/Curd/OdbcMySqlUpdate.cs @@ -1,4 +1,5 @@ using FreeSql.Internal; +using FreeSql.Internal.CommonProvider; using FreeSql.Internal.Model; using System; using System.Collections.Generic; @@ -35,35 +36,48 @@ namespace FreeSql.Odbc.MySql var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; - ToSqlFetch(sb => - { - if (dbParms == null) - { - dbParms = _params.Concat(_paramsSource).ToArray(); - sbret = new StringBuilder(); - sbret.Append(" RETURNING "); + var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; + int[] queryIndexs = null; + var queryFlag = ""; + ToSqlFetch(sb => + { + if (dbParms == null) + { + dbParms = _params.Concat(_paramsSource).ToArray(); + sbret = new StringBuilder(); + sbret.Append(" RETURNING "); - var colidx = 0; - foreach (var col in columns) - { - if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); - ++colidx; - } - } - var sql = sb.Append(sbret).ToString(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); - _orm.Aop.CurdBeforeHandler?.Invoke(this, before); + var colidx = 0; + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + foreach (var col in columns) + { + if (colidx > 0) sb.Append(", "); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); + ++colidx; + } + queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); + queryFlag = sbflag.ToString(); + } + var sql = sb.Append(sbret).ToString(); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); + _orm.Aop.CurdBeforeHandler?.Invoke(this, before); - Exception exception = null; - try - { - var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; - var rettmp = _orm.Ado.Query(queryType, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms); - ValidateVersionAndThrow(rettmp.Count, sql, dbParms); - ret.AddRange(rettmp); - } - catch (Exception ex) + Exception exception = null; + try + { + var rettmp = new List(); + _orm.Ado.ExecuteReader(_connection, _transaction, fetch => + { + rettmp.Add((TReturn)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); + }, CommandType.Text, sql, _commandTimeout, dbParms); + ValidateVersionAndThrow(rettmp.Count, sql, dbParms); + ret.AddRange(rettmp); + } + catch (Exception ex) { exception = ex; throw; @@ -125,35 +139,49 @@ namespace FreeSql.Odbc.MySql var ret = new List(); DbParameter[] dbParms = null; StringBuilder sbret = null; - await ToSqlFetchAsync(async sb => - { - if (dbParms == null) - { - dbParms = _params.Concat(_paramsSource).ToArray(); - sbret = new StringBuilder(); - sbret.Append(" RETURNING "); + var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; + int[] queryIndexs = null; + var queryFlag = ""; + await ToSqlFetchAsync(async sb => + { + if (dbParms == null) + { + dbParms = _params.Concat(_paramsSource).ToArray(); + sbret = new StringBuilder(); + sbret.Append(" RETURNING "); - var colidx = 0; - foreach (var col in columns) - { - if (colidx > 0) sbret.Append(", "); - sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))).Append(" as ").Append(_commonUtils.QuoteSqlName(col.CsName)); - ++colidx; - } - } - var sql = sb.Append(sbret).ToString(); - var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); - _orm.Aop.CurdBeforeHandler?.Invoke(this, before); + var colidx = 0; + var sbflag = new StringBuilder().Append("adoQuery(crud)"); + var dic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + foreach (var col in columns) + { + if (colidx > 0) sb.Append(", "); + sbret.Append(_commonUtils.RereadColumn(col, _commonUtils.QuoteSqlName(col.Attribute.Name))); + if (dic.ContainsKey(col.CsName)) continue; + sbflag.Append(col.Attribute.Name).Append(":").Append(colidx).Append(","); + dic.Add(col.CsName, colidx); + ++colidx; + } + queryIndexs = AdoProvider.GetQueryTypeProperties(queryType).Select(a => dic.TryGetValue(a.Key, out var tryint) ? tryint : -1).ToArray(); + queryFlag = sbflag.ToString(); + } + var sql = sb.Append(sbret).ToString(); + var before = new Aop.CurdBeforeEventArgs(_table.Type, _table, Aop.CurdType.Update, sql, dbParms); + _orm.Aop.CurdBeforeHandler?.Invoke(this, before); - Exception exception = null; - try - { - var queryType = typeof(TReturn) == typeof(T1) ? (_table.TypeLazy ?? _table.Type) : null; - var rettmp = await _orm.Ado.QueryAsync(queryType, _connection, _transaction, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); - ValidateVersionAndThrow(rettmp.Count, sql, dbParms); - ret.AddRange(rettmp); - } - catch (Exception ex) + Exception exception = null; + try + { + var rettmp = new List(); + await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, fetch => + { + rettmp.Add((TReturn)Utils.ExecuteReaderToClass(queryFlag, queryType, queryIndexs, fetch.Object, 0, _commonUtils)); + return Task.FromResult(false); + }, CommandType.Text, sql, _commandTimeout, dbParms, cancellationToken); + ValidateVersionAndThrow(rettmp.Count, sql, dbParms); + ret.AddRange(rettmp); + } + catch (Exception ex) { exception = ex; throw;