mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 01:05:27 +08:00 
			
		
		
		
	- 补充 IFreeSql 增加与实现 IDisposable 接口(依然要保持单例的使用习惯);
- 增加 CurdBefore、CurdAfter AOP 方法,可监控执行增删查改; - 增加 SyncStructureBefore、SyncStructureAfter AOP 方法,可监控CodeFirst迁移;
This commit is contained in:
		@@ -392,7 +392,7 @@ namespace FreeSql.Internal {
 | 
			
		||||
		internal string ExpressionLambdaToSql(Expression exp, ExpTSC tsc) {
 | 
			
		||||
			if (exp == null) return "";
 | 
			
		||||
			if (tsc.isDisableDiyParse == false && _common._orm.Aop.ParseExpression != null) {
 | 
			
		||||
				var args = new AopParseExpressionEventArgs(exp, ukexp => ExpressionLambdaToSql(exp, tsc.CloneDisableDiyParse()));
 | 
			
		||||
				var args = new Aop.ParseExpressionEventArgs(exp, ukexp => ExpressionLambdaToSql(exp, tsc.CloneDisableDiyParse()));
 | 
			
		||||
				_common._orm.Aop.ParseExpression?.Invoke(this, args);
 | 
			
		||||
				if (string.IsNullOrEmpty(args.Result) == false) return args.Result;
 | 
			
		||||
			}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,14 +6,14 @@ using System.Text;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
	class AopProvider : IAop {
 | 
			
		||||
		public EventHandler<AopToListEventArgs> ToList { get; set; }
 | 
			
		||||
		public EventHandler<AopWhereEventArgs> Where { get; set; }
 | 
			
		||||
		public EventHandler<AopParseExpressionEventArgs> ParseExpression { get; set; }
 | 
			
		||||
		public EventHandler<AopConfigEntityEventArgs> ConfigEntity { get; set; }
 | 
			
		||||
		public EventHandler<AopConfigEntityPropertyEventArgs> ConfigEntityProperty { get; set; }
 | 
			
		||||
		public EventHandler<AopOnUpdatedEventArgs> OnUpdated { get; set; }
 | 
			
		||||
		public EventHandler<AopOnInsertedEventArgs> OnInserted { get; set; }
 | 
			
		||||
		public EventHandler<AopOnDeletedEventArgs> OnDeleted { get; set; }
 | 
			
		||||
		public EventHandler<AopOnSelectedEventArgs> OnSelected { get; set; }
 | 
			
		||||
		public EventHandler<Aop.ToListEventArgs> ToList { get; set; }
 | 
			
		||||
		public EventHandler<Aop.WhereEventArgs> Where { get; set; }
 | 
			
		||||
		public EventHandler<Aop.ParseExpressionEventArgs> ParseExpression { get; set; }
 | 
			
		||||
		public EventHandler<Aop.ConfigEntityEventArgs> ConfigEntity { get; set; }
 | 
			
		||||
		public EventHandler<Aop.ConfigEntityPropertyEventArgs> ConfigEntityProperty { get; set; }
 | 
			
		||||
		public EventHandler<Aop.CurdBeforeEventArgs> CurdBefore { get; set; }
 | 
			
		||||
		public EventHandler<Aop.CurdAfterEventArgs> CurdAfter { get; set; }
 | 
			
		||||
		public EventHandler<Aop.SyncStructureBeforeEventArgs> SyncStructureBefore { get; set; }
 | 
			
		||||
		public EventHandler<Aop.SyncStructureAfterEventArgs> SyncStructureAfter { get; set; }
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -51,8 +51,19 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
			var sql = this.ToSql();
 | 
			
		||||
			if (string.IsNullOrEmpty(sql)) return 0;
 | 
			
		||||
			var dbParms = _params.ToArray();
 | 
			
		||||
			var affrows = _orm.Ado.ExecuteNonQuery(_connection, _transaction, CommandType.Text, sql, dbParms);
 | 
			
		||||
			_orm.Aop.OnDeleted?.Invoke(this, new AopOnDeletedEventArgs(_table.Type, sql, dbParms, affrows, null));
 | 
			
		||||
			var before = new Aop.CurdBeforeEventArgs(_table.Type, Aop.CurdType.Delete, sql, dbParms);
 | 
			
		||||
			_orm.Aop.CurdBefore?.Invoke(this, before);
 | 
			
		||||
			var affrows = 0;
 | 
			
		||||
			Exception exception = null;
 | 
			
		||||
			try {
 | 
			
		||||
				affrows = _orm.Ado.ExecuteNonQuery(_connection, _transaction, CommandType.Text, sql, dbParms);
 | 
			
		||||
			} catch (Exception ex) {
 | 
			
		||||
				exception = ex;
 | 
			
		||||
				throw ex;
 | 
			
		||||
			} finally {
 | 
			
		||||
				var after = new Aop.CurdAfterEventArgs(before, exception, affrows);
 | 
			
		||||
				_orm.Aop.CurdAfter?.Invoke(this, after);
 | 
			
		||||
			}
 | 
			
		||||
			this.ClearData();
 | 
			
		||||
			return affrows;
 | 
			
		||||
		}
 | 
			
		||||
@@ -60,8 +71,19 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
			var sql = this.ToSql();
 | 
			
		||||
			if (string.IsNullOrEmpty(sql)) return 0;
 | 
			
		||||
			var dbParms = _params.ToArray();
 | 
			
		||||
			var affrows = await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms);
 | 
			
		||||
			_orm.Aop.OnDeleted?.Invoke(this, new AopOnDeletedEventArgs(_table.Type, sql, dbParms, affrows, null));
 | 
			
		||||
			var before = new Aop.CurdBeforeEventArgs(_table.Type, Aop.CurdType.Delete, sql, dbParms);
 | 
			
		||||
			_orm.Aop.CurdBefore?.Invoke(this, before);
 | 
			
		||||
			var affrows = 0;
 | 
			
		||||
			Exception exception = null;
 | 
			
		||||
			try {
 | 
			
		||||
				affrows = await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms);
 | 
			
		||||
			} catch (Exception ex) {
 | 
			
		||||
				exception = ex;
 | 
			
		||||
				throw ex;
 | 
			
		||||
			} finally {
 | 
			
		||||
				var after = new Aop.CurdAfterEventArgs(before, exception, affrows);
 | 
			
		||||
				_orm.Aop.CurdAfter?.Invoke(this, after);
 | 
			
		||||
			}
 | 
			
		||||
			this.ClearData();
 | 
			
		||||
			return affrows;
 | 
			
		||||
		}
 | 
			
		||||
@@ -71,8 +93,8 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
		public IDelete<T1> Where(Expression<Func<T1, bool>> exp) => this.Where(_commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, null, exp?.Body, null));
 | 
			
		||||
		public IDelete<T1> Where(string sql, object parms = null) {
 | 
			
		||||
			if (string.IsNullOrEmpty(sql)) return this;
 | 
			
		||||
			var args = new AopWhereEventArgs(sql, parms);
 | 
			
		||||
			_orm.Aop.Where?.Invoke(this, new AopWhereEventArgs(sql, parms));
 | 
			
		||||
			var args = new Aop.WhereEventArgs(sql, parms);
 | 
			
		||||
			_orm.Aop.Where?.Invoke(this, new Aop.WhereEventArgs(sql, parms));
 | 
			
		||||
			if (args.IsCancel == true) return this;
 | 
			
		||||
 | 
			
		||||
			if (++_whereTimes > 1) _where.Append(" AND ");
 | 
			
		||||
 
 | 
			
		||||
@@ -325,14 +325,38 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
 | 
			
		||||
		internal int RawExecuteAffrows() {
 | 
			
		||||
			var sql = ToSql();
 | 
			
		||||
			var affrows = _orm.Ado.ExecuteNonQuery(_connection, _transaction, CommandType.Text, sql, _params);
 | 
			
		||||
			_orm.Aop.OnInserted?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, _source, sql, _params, affrows, 0, null));
 | 
			
		||||
			var before = new Aop.CurdBeforeEventArgs(_table.Type, Aop.CurdType.Insert, sql, _params);
 | 
			
		||||
			_orm.Aop.CurdBefore?.Invoke(this, before);
 | 
			
		||||
			var affrows = 0;
 | 
			
		||||
			Exception exception = null;
 | 
			
		||||
			try {
 | 
			
		||||
				affrows = _orm.Ado.ExecuteNonQuery(_connection, _transaction, CommandType.Text, sql, _params);
 | 
			
		||||
			} catch (Exception ex) {
 | 
			
		||||
				exception = ex;
 | 
			
		||||
				throw ex;
 | 
			
		||||
			} finally {
 | 
			
		||||
				var after = new Aop.CurdAfterEventArgs(before, exception, affrows);
 | 
			
		||||
				_orm.Aop.CurdAfter?.Invoke(this, after);
 | 
			
		||||
			}
 | 
			
		||||
			this.ClearData();
 | 
			
		||||
			return affrows;
 | 
			
		||||
		}
 | 
			
		||||
		async internal Task<int> RawExecuteAffrowsAsync() {
 | 
			
		||||
			var sql = ToSql();
 | 
			
		||||
			var affrows = await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, _params);
 | 
			
		||||
			_orm.Aop.OnInserted?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, _source, sql, _params, affrows, 0, null));
 | 
			
		||||
			var before = new Aop.CurdBeforeEventArgs(_table.Type, Aop.CurdType.Insert, sql, _params);
 | 
			
		||||
			_orm.Aop.CurdBefore?.Invoke(this, before);
 | 
			
		||||
			var affrows = 0;
 | 
			
		||||
			Exception exception = null;
 | 
			
		||||
			try {
 | 
			
		||||
				affrows = await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, _params);
 | 
			
		||||
			} catch (Exception ex) {
 | 
			
		||||
				exception = ex;
 | 
			
		||||
				throw ex;
 | 
			
		||||
			} finally {
 | 
			
		||||
				var after = new Aop.CurdAfterEventArgs(before, exception, affrows);
 | 
			
		||||
				_orm.Aop.CurdAfter?.Invoke(this, after);
 | 
			
		||||
			}
 | 
			
		||||
			this.ClearData();
 | 
			
		||||
			return affrows;
 | 
			
		||||
		}
 | 
			
		||||
		internal abstract long RawExecuteIdentity();
 | 
			
		||||
 
 | 
			
		||||
@@ -217,8 +217,19 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
 | 
			
		||||
			return _orm.Cache.Shell(_cache.key, _cache.seconds, () => {
 | 
			
		||||
				var dbParms = _params.ToArray();
 | 
			
		||||
				var ret = _orm.Ado.ExecuteDataTable(_connection, _transaction, CommandType.Text, sql, dbParms);
 | 
			
		||||
				_orm.Aop.OnSelected?.Invoke(this, new AopOnSelectedEventArgs(_tables[0].Table.Type, sql, dbParms, ret));
 | 
			
		||||
				var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms);
 | 
			
		||||
				_orm.Aop.CurdBefore?.Invoke(this, before);
 | 
			
		||||
				DataTable ret = null;
 | 
			
		||||
				Exception exception = null;
 | 
			
		||||
				try {
 | 
			
		||||
					ret = _orm.Ado.ExecuteDataTable(_connection, _transaction, CommandType.Text, sql, dbParms);
 | 
			
		||||
				} catch (Exception ex) {
 | 
			
		||||
					exception = ex;
 | 
			
		||||
					throw ex;
 | 
			
		||||
				} finally {
 | 
			
		||||
					var after = new Aop.CurdAfterEventArgs(before, exception, ret);
 | 
			
		||||
					_orm.Aop.CurdAfter?.Invoke(this, after);
 | 
			
		||||
				}
 | 
			
		||||
				return ret;
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
@@ -228,8 +239,19 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
 | 
			
		||||
			return _orm.Cache.ShellAsync(_cache.key, _cache.seconds, async () => {
 | 
			
		||||
				var dbParms = _params.ToArray();
 | 
			
		||||
				var ret = await _orm.Ado.ExecuteDataTableAsync(_connection, _transaction, CommandType.Text, sql, dbParms);
 | 
			
		||||
				_orm.Aop.OnSelected?.Invoke(this, new AopOnSelectedEventArgs(_tables[0].Table.Type, sql, dbParms, ret));
 | 
			
		||||
				var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms);
 | 
			
		||||
				_orm.Aop.CurdBefore?.Invoke(this, before);
 | 
			
		||||
				DataTable ret = null;
 | 
			
		||||
				Exception exception = null;
 | 
			
		||||
				try {
 | 
			
		||||
					ret = await _orm.Ado.ExecuteDataTableAsync(_connection, _transaction, CommandType.Text, sql, dbParms);
 | 
			
		||||
				} catch (Exception ex) {
 | 
			
		||||
					exception = ex;
 | 
			
		||||
					throw ex;
 | 
			
		||||
				} finally {
 | 
			
		||||
					var after = new Aop.CurdAfterEventArgs(before, exception, ret);
 | 
			
		||||
					_orm.Aop.CurdAfter?.Invoke(this, after);
 | 
			
		||||
				}
 | 
			
		||||
				return ret;
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
@@ -239,15 +261,25 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
			if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = sql;
 | 
			
		||||
 | 
			
		||||
			return _orm.Cache.Shell(_cache.key, _cache.seconds, () => {
 | 
			
		||||
				var ret = new List<TTuple>();
 | 
			
		||||
				var type = typeof(TTuple);
 | 
			
		||||
				var dbParms = _params.ToArray();
 | 
			
		||||
				_orm.Ado.ExecuteReader(_connection, _transaction, dr => {
 | 
			
		||||
					var read = Utils.ExecuteArrayRowReadClassOrTuple(type, null, dr, 0, _commonUtils);
 | 
			
		||||
					ret.Add((TTuple) read.Value);
 | 
			
		||||
				}, CommandType.Text, sql, dbParms);
 | 
			
		||||
				_orm.Aop.OnSelected?.Invoke(this, new AopOnSelectedEventArgs(_tables[0].Table.Type, sql, dbParms, ret));
 | 
			
		||||
				_orm.Aop.ToList?.Invoke(this, new AopToListEventArgs(ret));
 | 
			
		||||
				var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms);
 | 
			
		||||
				_orm.Aop.CurdBefore?.Invoke(this, before);
 | 
			
		||||
				var ret = new List<TTuple>();
 | 
			
		||||
				Exception exception = null;
 | 
			
		||||
				try {
 | 
			
		||||
					_orm.Ado.ExecuteReader(_connection, _transaction, dr => {
 | 
			
		||||
						var read = Utils.ExecuteArrayRowReadClassOrTuple(type, null, dr, 0, _commonUtils);
 | 
			
		||||
						ret.Add((TTuple)read.Value);
 | 
			
		||||
					}, CommandType.Text, sql, dbParms);
 | 
			
		||||
				} catch (Exception ex) {
 | 
			
		||||
					exception = ex;
 | 
			
		||||
					throw ex;
 | 
			
		||||
				} finally {
 | 
			
		||||
					var after = new Aop.CurdAfterEventArgs(before, exception, ret);
 | 
			
		||||
					_orm.Aop.CurdAfter?.Invoke(this, after);
 | 
			
		||||
				}
 | 
			
		||||
				_orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret));
 | 
			
		||||
				_trackToList?.Invoke(ret);
 | 
			
		||||
				return ret;
 | 
			
		||||
			});
 | 
			
		||||
@@ -257,16 +289,26 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
			if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = sql;
 | 
			
		||||
 | 
			
		||||
			return _orm.Cache.ShellAsync(_cache.key, _cache.seconds, async () => {
 | 
			
		||||
				var ret = new List<TTuple>();
 | 
			
		||||
				var type = typeof(TTuple);
 | 
			
		||||
				var dbParms = _params.ToArray();
 | 
			
		||||
				await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => {
 | 
			
		||||
					var read = Utils.ExecuteArrayRowReadClassOrTuple(type, null, dr, 0, _commonUtils);
 | 
			
		||||
					ret.Add((TTuple) read.Value);
 | 
			
		||||
					return Task.CompletedTask;
 | 
			
		||||
				}, CommandType.Text, sql, dbParms);
 | 
			
		||||
				_orm.Aop.OnSelected?.Invoke(this, new AopOnSelectedEventArgs(_tables[0].Table.Type, sql, dbParms, ret));
 | 
			
		||||
				_orm.Aop.ToList?.Invoke(this, new AopToListEventArgs(ret));
 | 
			
		||||
				var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms);
 | 
			
		||||
				_orm.Aop.CurdBefore?.Invoke(this, before);
 | 
			
		||||
				var ret = new List<TTuple>();
 | 
			
		||||
				Exception exception = null;
 | 
			
		||||
				try {
 | 
			
		||||
					await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => {
 | 
			
		||||
						var read = Utils.ExecuteArrayRowReadClassOrTuple(type, null, dr, 0, _commonUtils);
 | 
			
		||||
						ret.Add((TTuple)read.Value);
 | 
			
		||||
						return Task.CompletedTask;
 | 
			
		||||
					}, CommandType.Text, sql, dbParms);
 | 
			
		||||
				} catch (Exception ex) {
 | 
			
		||||
					exception = ex;
 | 
			
		||||
					throw ex;
 | 
			
		||||
				} finally {
 | 
			
		||||
					var after = new Aop.CurdAfterEventArgs(before, exception, ret);
 | 
			
		||||
					_orm.Aop.CurdAfter?.Invoke(this, after);
 | 
			
		||||
				}
 | 
			
		||||
				_orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret));
 | 
			
		||||
				_trackToList?.Invoke(ret);
 | 
			
		||||
				return ret;
 | 
			
		||||
			});
 | 
			
		||||
@@ -276,13 +318,23 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
			if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = $"{sql}{string.Join("|", _params.Select(a => a.Value))}";
 | 
			
		||||
 | 
			
		||||
			return _orm.Cache.Shell(_cache.key, _cache.seconds, () => {
 | 
			
		||||
				var ret = new List<T1>();
 | 
			
		||||
				var dbParms = _params.ToArray();
 | 
			
		||||
				_orm.Ado.ExecuteReader(_connection, _transaction, dr => {
 | 
			
		||||
					ret.Add(af.Read(_orm, dr));
 | 
			
		||||
				}, CommandType.Text, sql, dbParms);
 | 
			
		||||
				_orm.Aop.OnSelected?.Invoke(this, new AopOnSelectedEventArgs(_tables[0].Table.Type, sql, dbParms, ret));
 | 
			
		||||
				_orm.Aop.ToList?.Invoke(this, new AopToListEventArgs(ret));
 | 
			
		||||
				var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms);
 | 
			
		||||
				_orm.Aop.CurdBefore?.Invoke(this, before);
 | 
			
		||||
				var ret = new List<T1>();
 | 
			
		||||
				Exception exception = null;
 | 
			
		||||
				try {
 | 
			
		||||
					_orm.Ado.ExecuteReader(_connection, _transaction, dr => {
 | 
			
		||||
						ret.Add(af.Read(_orm, dr));
 | 
			
		||||
					}, CommandType.Text, sql, dbParms);
 | 
			
		||||
				} catch (Exception ex) {
 | 
			
		||||
					exception = ex;
 | 
			
		||||
					throw ex;
 | 
			
		||||
				} finally {
 | 
			
		||||
					var after = new Aop.CurdAfterEventArgs(before, exception, ret);
 | 
			
		||||
					_orm.Aop.CurdAfter?.Invoke(this, after);
 | 
			
		||||
				}
 | 
			
		||||
				_orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret));
 | 
			
		||||
				_trackToList?.Invoke(ret);
 | 
			
		||||
				return ret;
 | 
			
		||||
			});
 | 
			
		||||
@@ -292,14 +344,24 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
			if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = $"{sql}{string.Join("|", _params.Select(a => a.Value))}";
 | 
			
		||||
 | 
			
		||||
			return await _orm.Cache.ShellAsync(_cache.key, _cache.seconds, async () => {
 | 
			
		||||
				var ret = new List<T1>();
 | 
			
		||||
				var dbParms = _params.ToArray();
 | 
			
		||||
				await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => {
 | 
			
		||||
					ret.Add(af.Read(_orm, dr));
 | 
			
		||||
					return Task.CompletedTask;
 | 
			
		||||
				}, CommandType.Text, sql, dbParms);
 | 
			
		||||
				_orm.Aop.OnSelected?.Invoke(this, new AopOnSelectedEventArgs(_tables[0].Table.Type, sql, dbParms, ret));
 | 
			
		||||
				_orm.Aop.ToList?.Invoke(this, new AopToListEventArgs(ret));
 | 
			
		||||
				var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms);
 | 
			
		||||
				_orm.Aop.CurdBefore?.Invoke(this, before);
 | 
			
		||||
				var ret = new List<T1>();
 | 
			
		||||
				Exception exception = null;
 | 
			
		||||
				try {
 | 
			
		||||
					await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => {
 | 
			
		||||
						ret.Add(af.Read(_orm, dr));
 | 
			
		||||
						return Task.CompletedTask;
 | 
			
		||||
					}, CommandType.Text, sql, dbParms);
 | 
			
		||||
				} catch (Exception ex) {
 | 
			
		||||
					exception = ex;
 | 
			
		||||
					throw ex;
 | 
			
		||||
				} finally {
 | 
			
		||||
					var after = new Aop.CurdAfterEventArgs(before, exception, ret);
 | 
			
		||||
					_orm.Aop.CurdAfter?.Invoke(this, after);
 | 
			
		||||
				}
 | 
			
		||||
				_orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret));
 | 
			
		||||
				_trackToList?.Invoke(ret);
 | 
			
		||||
				return ret;
 | 
			
		||||
			});
 | 
			
		||||
@@ -325,15 +387,25 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
			if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = $"{sql}{string.Join("|", _params.Select(a => a.Value))}";
 | 
			
		||||
 | 
			
		||||
			return _orm.Cache.Shell(_cache.key, _cache.seconds, () => {
 | 
			
		||||
				var ret = new List<TReturn>();
 | 
			
		||||
				var type = typeof(TReturn);
 | 
			
		||||
				var dbParms = _params.ToArray();
 | 
			
		||||
				_orm.Ado.ExecuteReader(_connection, _transaction, dr => {
 | 
			
		||||
					var index = -1;
 | 
			
		||||
					ret.Add((TReturn) _commonExpression.ReadAnonymous(af.map, dr, ref index, false));
 | 
			
		||||
				}, CommandType.Text, sql, dbParms);
 | 
			
		||||
				_orm.Aop.OnSelected?.Invoke(this, new AopOnSelectedEventArgs(_tables[0].Table.Type, sql, dbParms, ret));
 | 
			
		||||
				_orm.Aop.ToList?.Invoke(this, new AopToListEventArgs(ret));
 | 
			
		||||
				var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms);
 | 
			
		||||
				_orm.Aop.CurdBefore?.Invoke(this, before);
 | 
			
		||||
				var ret = new List<TReturn>();
 | 
			
		||||
				Exception exception = null;
 | 
			
		||||
				try {
 | 
			
		||||
					_orm.Ado.ExecuteReader(_connection, _transaction, dr => {
 | 
			
		||||
						var index = -1;
 | 
			
		||||
						ret.Add((TReturn)_commonExpression.ReadAnonymous(af.map, dr, ref index, false));
 | 
			
		||||
					}, CommandType.Text, sql, dbParms);
 | 
			
		||||
				} catch (Exception ex) {
 | 
			
		||||
					exception = ex;
 | 
			
		||||
					throw ex;
 | 
			
		||||
				} finally {
 | 
			
		||||
					var after = new Aop.CurdAfterEventArgs(before, exception, ret);
 | 
			
		||||
					_orm.Aop.CurdAfter?.Invoke(this, after);
 | 
			
		||||
				}
 | 
			
		||||
				_orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret));
 | 
			
		||||
				_trackToList?.Invoke(ret);
 | 
			
		||||
				return ret;
 | 
			
		||||
			});
 | 
			
		||||
@@ -343,16 +415,26 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
			if (_cache.seconds > 0 && string.IsNullOrEmpty(_cache.key)) _cache.key = $"{sql}{string.Join("|", _params.Select(a => a.Value))}";
 | 
			
		||||
 | 
			
		||||
			return await _orm.Cache.ShellAsync(_cache.key, _cache.seconds, async () => {
 | 
			
		||||
				var ret = new List<TReturn>();
 | 
			
		||||
				var type = typeof(TReturn);
 | 
			
		||||
				var dbParms = _params.ToArray();
 | 
			
		||||
				await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => {
 | 
			
		||||
					var index = -1;
 | 
			
		||||
					ret.Add((TReturn) _commonExpression.ReadAnonymous(af.map, dr, ref index, false));
 | 
			
		||||
					return Task.CompletedTask;
 | 
			
		||||
				}, CommandType.Text, sql, dbParms);
 | 
			
		||||
				_orm.Aop.OnSelected?.Invoke(this, new AopOnSelectedEventArgs(_tables[0].Table.Type, sql, dbParms, ret));
 | 
			
		||||
				_orm.Aop.ToList?.Invoke(this, new AopToListEventArgs(ret));
 | 
			
		||||
				var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms);
 | 
			
		||||
				_orm.Aop.CurdBefore?.Invoke(this, before);
 | 
			
		||||
				var ret = new List<TReturn>();
 | 
			
		||||
				Exception exception = null;
 | 
			
		||||
				try {
 | 
			
		||||
					await _orm.Ado.ExecuteReaderAsync(_connection, _transaction, dr => {
 | 
			
		||||
						var index = -1;
 | 
			
		||||
						ret.Add((TReturn)_commonExpression.ReadAnonymous(af.map, dr, ref index, false));
 | 
			
		||||
						return Task.CompletedTask;
 | 
			
		||||
					}, CommandType.Text, sql, dbParms);
 | 
			
		||||
				} catch (Exception ex) {
 | 
			
		||||
					exception = ex;
 | 
			
		||||
					throw ex;
 | 
			
		||||
				} finally {
 | 
			
		||||
					var after = new Aop.CurdAfterEventArgs(before, exception, ret);
 | 
			
		||||
					_orm.Aop.CurdAfter?.Invoke(this, after);
 | 
			
		||||
				}
 | 
			
		||||
				_orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret));
 | 
			
		||||
				_trackToList?.Invoke(ret);
 | 
			
		||||
				return ret;
 | 
			
		||||
			});
 | 
			
		||||
@@ -680,8 +762,8 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
		public TSelect Where(string sql, object parms = null) => this.WhereIf(true, sql, parms);
 | 
			
		||||
		public TSelect WhereIf(bool condition, string sql, object parms = null) {
 | 
			
		||||
			if (condition == false || string.IsNullOrEmpty(sql)) return this as TSelect;
 | 
			
		||||
			var args = new AopWhereEventArgs(sql, parms);
 | 
			
		||||
			_orm.Aop.Where?.Invoke(this, new AopWhereEventArgs(sql, parms));
 | 
			
		||||
			var args = new Aop.WhereEventArgs(sql, parms);
 | 
			
		||||
			_orm.Aop.Where?.Invoke(this, new Aop.WhereEventArgs(sql, parms));
 | 
			
		||||
			if (args.IsCancel == true) return this as TSelect;
 | 
			
		||||
 | 
			
		||||
			_where.Append(" AND (").Append(sql).Append(")");
 | 
			
		||||
@@ -732,15 +814,37 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
		protected DataTable InternalToDataTable(Expression select) {
 | 
			
		||||
			var sql = this.InternalToSql<int>(select);
 | 
			
		||||
			var dbParms = _params.ToArray();
 | 
			
		||||
			var ret = _orm.Ado.ExecuteDataTable(_connection, _transaction, CommandType.Text, sql, dbParms);
 | 
			
		||||
			_orm.Aop.OnSelected?.Invoke(this, new AopOnSelectedEventArgs(_tables[0].Table.Type, sql, dbParms, ret));
 | 
			
		||||
			var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms);
 | 
			
		||||
			_orm.Aop.CurdBefore?.Invoke(this, before);
 | 
			
		||||
			DataTable ret = null;
 | 
			
		||||
			Exception exception = null;
 | 
			
		||||
			try {
 | 
			
		||||
				ret = _orm.Ado.ExecuteDataTable(_connection, _transaction, CommandType.Text, sql, dbParms);
 | 
			
		||||
			} catch (Exception ex) {
 | 
			
		||||
				exception = ex;
 | 
			
		||||
				throw ex;
 | 
			
		||||
			} finally {
 | 
			
		||||
				var after = new Aop.CurdAfterEventArgs(before, exception, ret);
 | 
			
		||||
				_orm.Aop.CurdAfter?.Invoke(this, after);
 | 
			
		||||
			}
 | 
			
		||||
			return ret;
 | 
			
		||||
		}
 | 
			
		||||
		async protected Task<DataTable> InternalToDataTableAsync(Expression select) {
 | 
			
		||||
			var sql = this.InternalToSql<int>(select);
 | 
			
		||||
			var dbParms = _params.ToArray();
 | 
			
		||||
			var ret = await _orm.Ado.ExecuteDataTableAsync(_connection, _transaction, CommandType.Text, sql, dbParms);
 | 
			
		||||
			_orm.Aop.OnSelected?.Invoke(this, new AopOnSelectedEventArgs(_tables[0].Table.Type, sql, dbParms, ret));
 | 
			
		||||
			var before = new Aop.CurdBeforeEventArgs(_tables[0].Table.Type, Aop.CurdType.Select, sql, dbParms);
 | 
			
		||||
			_orm.Aop.CurdBefore?.Invoke(this, before);
 | 
			
		||||
			DataTable ret = null;
 | 
			
		||||
			Exception exception = null;
 | 
			
		||||
			try {
 | 
			
		||||
				ret = await _orm.Ado.ExecuteDataTableAsync(_connection, _transaction, CommandType.Text, sql, dbParms);
 | 
			
		||||
			} catch (Exception ex) {
 | 
			
		||||
				exception = ex;
 | 
			
		||||
				throw ex;
 | 
			
		||||
			} finally {
 | 
			
		||||
				var after = new Aop.CurdAfterEventArgs(before, exception, ret);
 | 
			
		||||
				_orm.Aop.CurdAfter?.Invoke(this, after);
 | 
			
		||||
			}
 | 
			
		||||
			return ret;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -240,18 +240,42 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
			var sql = this.ToSql();
 | 
			
		||||
			if (string.IsNullOrEmpty(sql)) return 0;
 | 
			
		||||
			var dbParms = _params.Concat(_paramsSource).ToArray();
 | 
			
		||||
			var affrows = _orm.Ado.ExecuteNonQuery(_connection, _transaction, CommandType.Text, sql, dbParms);
 | 
			
		||||
			_orm.Aop.OnUpdated?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, null, sql, dbParms, affrows, 0, null));
 | 
			
		||||
			ValidateVersionAndThrow(affrows);
 | 
			
		||||
			var before = new Aop.CurdBeforeEventArgs(_table.Type, Aop.CurdType.Update, sql, dbParms);
 | 
			
		||||
			_orm.Aop.CurdBefore?.Invoke(this, before);
 | 
			
		||||
			var affrows = 0;
 | 
			
		||||
			Exception exception = null;
 | 
			
		||||
			try {
 | 
			
		||||
				affrows = _orm.Ado.ExecuteNonQuery(_connection, _transaction, CommandType.Text, sql, dbParms);
 | 
			
		||||
				ValidateVersionAndThrow(affrows);
 | 
			
		||||
			} catch (Exception ex) {
 | 
			
		||||
				exception = ex;
 | 
			
		||||
				throw ex;
 | 
			
		||||
			} finally {
 | 
			
		||||
				var after = new Aop.CurdAfterEventArgs(before, exception, affrows);
 | 
			
		||||
				_orm.Aop.CurdAfter?.Invoke(this, after);
 | 
			
		||||
			}
 | 
			
		||||
			this.ClearData();
 | 
			
		||||
			return affrows;
 | 
			
		||||
		}
 | 
			
		||||
		async internal Task<int> RawExecuteAffrowsAsync() {
 | 
			
		||||
			var sql = this.ToSql();
 | 
			
		||||
			if (string.IsNullOrEmpty(sql)) return 0;
 | 
			
		||||
			var dbParms = _params.Concat(_paramsSource).ToArray();
 | 
			
		||||
			var affrows = await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms);
 | 
			
		||||
			_orm.Aop.OnUpdated?.Invoke(this, new AopOnInsertedEventArgs(_table.Type, null, sql, dbParms, affrows, 0, null));
 | 
			
		||||
			ValidateVersionAndThrow(affrows);
 | 
			
		||||
			var before = new Aop.CurdBeforeEventArgs(_table.Type, Aop.CurdType.Update, sql, dbParms);
 | 
			
		||||
			_orm.Aop.CurdBefore?.Invoke(this, before);
 | 
			
		||||
			var affrows = 0;
 | 
			
		||||
			Exception exception = null;
 | 
			
		||||
			try {
 | 
			
		||||
				affrows = await _orm.Ado.ExecuteNonQueryAsync(_connection, _transaction, CommandType.Text, sql, dbParms);
 | 
			
		||||
				ValidateVersionAndThrow(affrows);
 | 
			
		||||
			} catch (Exception ex) {
 | 
			
		||||
				exception = ex;
 | 
			
		||||
				throw ex;
 | 
			
		||||
			} finally {
 | 
			
		||||
				var after = new Aop.CurdAfterEventArgs(before, exception, affrows);
 | 
			
		||||
				_orm.Aop.CurdAfter?.Invoke(this, after);
 | 
			
		||||
			}
 | 
			
		||||
			this.ClearData();
 | 
			
		||||
			return affrows;
 | 
			
		||||
		}
 | 
			
		||||
		internal abstract List<T1> RawExecuteUpdated();
 | 
			
		||||
@@ -343,8 +367,8 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
		public IUpdate<T1> Where(Expression<Func<T1, bool>> expression) => this.Where(_commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, null, expression?.Body, null));
 | 
			
		||||
		public IUpdate<T1> Where(string sql, object parms = null) {
 | 
			
		||||
			if (string.IsNullOrEmpty(sql)) return this;
 | 
			
		||||
			var args = new AopWhereEventArgs(sql, parms);
 | 
			
		||||
			_orm.Aop.Where?.Invoke(this, new AopWhereEventArgs(sql, parms));
 | 
			
		||||
			var args = new Aop.WhereEventArgs(sql, parms);
 | 
			
		||||
			_orm.Aop.Where?.Invoke(this, new Aop.WhereEventArgs(sql, parms));
 | 
			
		||||
			if (args.IsCancel == true) return this;
 | 
			
		||||
 | 
			
		||||
			_where.Append(" AND (").Append(sql).Append(")");
 | 
			
		||||
 
 | 
			
		||||
@@ -61,7 +61,7 @@ namespace FreeSql.Internal {
 | 
			
		||||
		internal TableAttribute GetEntityTableAttribute(Type type) {
 | 
			
		||||
			TableAttribute attr = null;
 | 
			
		||||
			if (_orm.Aop.ConfigEntity != null) {
 | 
			
		||||
				var aope = new AopConfigEntityEventArgs(type);
 | 
			
		||||
				var aope = new Aop.ConfigEntityEventArgs(type);
 | 
			
		||||
				_orm.Aop.ConfigEntity(_orm, aope);
 | 
			
		||||
				attr = aope.ModifyResult;
 | 
			
		||||
			}
 | 
			
		||||
@@ -87,7 +87,7 @@ namespace FreeSql.Internal {
 | 
			
		||||
		internal ColumnAttribute GetEntityColumnAttribute(Type type, PropertyInfo proto) {
 | 
			
		||||
			ColumnAttribute attr = null;
 | 
			
		||||
			if (_orm.Aop.ConfigEntityProperty != null) {
 | 
			
		||||
				var aope = new AopConfigEntityPropertyEventArgs(type, proto);
 | 
			
		||||
				var aope = new Aop.ConfigEntityPropertyEventArgs(type, proto);
 | 
			
		||||
				_orm.Aop.ConfigEntityProperty(_orm, aope);
 | 
			
		||||
				attr = aope.ModifyResult;
 | 
			
		||||
			}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user