mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 17:20:49 +08:00 
			
		
		
		
	- 增加 SqlServer ISelect.WithLock 扩展方法,实现 with(nolock) 查询;
- 增加 SqlServer IFreeSql.SetGlobalSelectWithLock 扩展方法,实现全局设置 with(nock) 查询; - 移除 Aop.ToList; - 移除 Aop.Where;
This commit is contained in:
		@@ -908,6 +908,14 @@
 | 
			
		||||
            <param name="tableRule"></param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:FreeSql.ISelect0`2.AsAlias(System.Func{System.Type,System.String,System.String})">
 | 
			
		||||
            <summary>
 | 
			
		||||
            设置别名规则,可用于拦截表别名,实现类似 sqlserver 的 with(nolock) 需求<para></para>
 | 
			
		||||
            如:select.AsAlias((_, oldAlias) => oldAlias + " with(lock)")
 | 
			
		||||
            </summary>
 | 
			
		||||
            <param name="aliasRule"></param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:FreeSql.ISelect0`2.AsType(System.Type)">
 | 
			
		||||
            <summary>
 | 
			
		||||
            动态Type,在使用 Select<object> 后使用本方法,指定实体类型
 | 
			
		||||
@@ -2114,16 +2122,6 @@
 | 
			
		||||
            <param name="parms"></param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="P:FreeSql.IAop.ToList">
 | 
			
		||||
            <summary>
 | 
			
		||||
            监控 ToList 返回的的数据,用于拦截重新装饰
 | 
			
		||||
            </summary>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="P:FreeSql.IAop.Where">
 | 
			
		||||
            <summary>
 | 
			
		||||
            监视 Where,包括 select/update/delete,可控制使上层不被执行。
 | 
			
		||||
            </summary>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="P:FreeSql.IAop.ParseExpression">
 | 
			
		||||
            <summary>
 | 
			
		||||
            可自定义解析表达式
 | 
			
		||||
@@ -2164,16 +2162,6 @@
 | 
			
		||||
            Insert/Update自动值处理
 | 
			
		||||
            </summary>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="P:FreeSql.Aop.ToListEventArgs.List">
 | 
			
		||||
            <summary>
 | 
			
		||||
            可重新装饰的引用数据
 | 
			
		||||
            </summary>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="P:FreeSql.Aop.WhereEventArgs.IsCancel">
 | 
			
		||||
            <summary>
 | 
			
		||||
            可使上层不被执行这个条件
 | 
			
		||||
            </summary>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="P:FreeSql.Aop.ParseExpressionEventArgs.FreeParse">
 | 
			
		||||
            <summary>
 | 
			
		||||
            内置解析功能,可辅助您进行解析
 | 
			
		||||
 
 | 
			
		||||
@@ -118,6 +118,13 @@ namespace FreeSql
 | 
			
		||||
        /// <returns></returns>
 | 
			
		||||
        TSelect AsTable(Func<Type, string, string> tableRule);
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 设置别名规则,可用于拦截表别名,实现类似 sqlserver 的 with(nolock) 需求<para></para>
 | 
			
		||||
        /// 如:select.AsAlias((_, oldAlias) => oldAlias + " with(lock)")
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="aliasRule"></param>
 | 
			
		||||
        /// <returns></returns>
 | 
			
		||||
        TSelect AsAlias(Func<Type, string, string> aliasRule);
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 动态Type,在使用 Select<object> 后使用本方法,指定实体类型
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="entityType"></param>
 | 
			
		||||
 
 | 
			
		||||
@@ -12,17 +12,6 @@ namespace FreeSql
 | 
			
		||||
{
 | 
			
		||||
    public interface IAop
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 监控 ToList 返回的的数据,用于拦截重新装饰
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EventHandler<Aop.ToListEventArgs> ToList { get; set; }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 监视 Where,包括 select/update/delete,可控制使上层不被执行。
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        EventHandler<Aop.WhereEventArgs> Where { get; set; }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 可自定义解析表达式
 | 
			
		||||
        /// </summary>
 | 
			
		||||
@@ -64,29 +53,6 @@ namespace FreeSql
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.Aop
 | 
			
		||||
{
 | 
			
		||||
    public class ToListEventArgs : EventArgs
 | 
			
		||||
    {
 | 
			
		||||
        public ToListEventArgs(object list)
 | 
			
		||||
        {
 | 
			
		||||
            this.List = list;
 | 
			
		||||
        }
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 可重新装饰的引用数据
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public object List { get; }
 | 
			
		||||
    }
 | 
			
		||||
    public class WhereEventArgs : EventArgs
 | 
			
		||||
    {
 | 
			
		||||
        public WhereEventArgs(params object[] parameters)
 | 
			
		||||
        {
 | 
			
		||||
            this.Parameters = parameters;
 | 
			
		||||
        }
 | 
			
		||||
        public object[] Parameters { get; }
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 可使上层不被执行这个条件
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public bool IsCancel { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
    public class ParseExpressionEventArgs : EventArgs
 | 
			
		||||
    {
 | 
			
		||||
        public ParseExpressionEventArgs(Expression expression, Func<Expression, string> freeParse)
 | 
			
		||||
 
 | 
			
		||||
@@ -8,8 +8,6 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
{
 | 
			
		||||
    public class AopProvider : IAop
 | 
			
		||||
    {
 | 
			
		||||
        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; }
 | 
			
		||||
 
 | 
			
		||||
@@ -89,10 +89,6 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
        public IDelete<T1> Where(string sql, object parms = null)
 | 
			
		||||
        {
 | 
			
		||||
            if (string.IsNullOrEmpty(sql)) return this;
 | 
			
		||||
            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 ");
 | 
			
		||||
            _where.Append("(").Append(sql).Append(")");
 | 
			
		||||
            if (parms != null) _params.AddRange(_commonUtils.GetDbParamtersByObject(sql, parms));
 | 
			
		||||
 
 | 
			
		||||
@@ -24,6 +24,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
        protected List<DbParameter> _params = new List<DbParameter>();
 | 
			
		||||
        protected List<SelectTableInfo> _tables = new List<SelectTableInfo>();
 | 
			
		||||
        protected List<Func<Type, string, string>> _tableRules = new List<Func<Type, string, string>>();
 | 
			
		||||
        protected Func<Type, string, string> _aliasRule;
 | 
			
		||||
        protected StringBuilder _join = new StringBuilder();
 | 
			
		||||
        protected IFreeSql _orm;
 | 
			
		||||
        protected CommonUtils _commonUtils;
 | 
			
		||||
@@ -86,6 +87,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                    _multiTables.AddRange(from._tables.GetRange(_multiTables.Count, from._tables.Count - _multiTables.Count));
 | 
			
		||||
            }
 | 
			
		||||
            toType.GetField("_tableRules", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._tableRules);
 | 
			
		||||
            toType.GetField("_aliasRule", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._aliasRule);
 | 
			
		||||
            toType.GetField("_join", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, new StringBuilder().Append(from._join.ToString()));
 | 
			
		||||
            //toType.GetField("_orm", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._orm);
 | 
			
		||||
            //toType.GetField("_commonUtils", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._commonUtils);
 | 
			
		||||
@@ -345,7 +347,6 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                _orm.Aop.CurdAfter?.Invoke(this, after);
 | 
			
		||||
            }
 | 
			
		||||
            foreach (var include in _includeToList) include?.Invoke(ret);
 | 
			
		||||
            _orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret));
 | 
			
		||||
            _trackToList?.Invoke(ret);
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
@@ -391,7 +392,6 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                        checkDoneTimes++;
 | 
			
		||||
 | 
			
		||||
                        foreach (var include in _includeToList) include?.Invoke(ret);
 | 
			
		||||
                        _orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret));
 | 
			
		||||
                        _trackToList?.Invoke(ret);
 | 
			
		||||
                        chunkDone(ret);
 | 
			
		||||
                        
 | 
			
		||||
@@ -416,7 +416,6 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
            if (ret.Any() || checkDoneTimes == 0)
 | 
			
		||||
            {
 | 
			
		||||
                foreach (var include in _includeToList) include?.Invoke(ret);
 | 
			
		||||
                _orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret));
 | 
			
		||||
                _trackToList?.Invoke(ret);
 | 
			
		||||
                chunkDone(ret);
 | 
			
		||||
            }
 | 
			
		||||
@@ -482,7 +481,6 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                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;
 | 
			
		||||
        }
 | 
			
		||||
@@ -902,6 +900,11 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
            if (tableRule != null) _tableRules.Add(tableRule);
 | 
			
		||||
            return this as TSelect;
 | 
			
		||||
        }
 | 
			
		||||
        public TSelect AsAlias(Func<Type, string, string> aliasRule)
 | 
			
		||||
        {
 | 
			
		||||
            if (aliasRule != null) _aliasRule = aliasRule;
 | 
			
		||||
            return this as TSelect;
 | 
			
		||||
        }
 | 
			
		||||
        public TSelect AsType(Type entityType)
 | 
			
		||||
        {
 | 
			
		||||
            if (entityType == typeof(object)) throw new Exception("ISelect.AsType 参数不支持指定为 object");
 | 
			
		||||
@@ -917,10 +920,6 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
        public TSelect WhereIf(bool condition, string sql, object parms = null)
 | 
			
		||||
        {
 | 
			
		||||
            if (condition == false || string.IsNullOrEmpty(sql)) return this as TSelect;
 | 
			
		||||
            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(")");
 | 
			
		||||
            if (parms != null) _params.AddRange(_commonUtils.GetDbParamtersByObject(sql, parms));
 | 
			
		||||
            return this as TSelect;
 | 
			
		||||
@@ -1121,7 +1120,6 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                _orm.Aop.CurdAfter?.Invoke(this, after);
 | 
			
		||||
            }
 | 
			
		||||
            foreach (var include in _includeToList) include?.Invoke(ret);
 | 
			
		||||
            _orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(ret));
 | 
			
		||||
            _trackToList?.Invoke(ret);
 | 
			
		||||
            return ret;
 | 
			
		||||
        }
 | 
			
		||||
@@ -1184,7 +1182,6 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                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;
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -910,7 +910,6 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
        internal void SetList(IEnumerable<T1> list)
 | 
			
		||||
        {
 | 
			
		||||
            foreach (var include in _includeToList) include?.Invoke(list);
 | 
			
		||||
            _orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(list));
 | 
			
		||||
            _trackToList?.Invoke(list);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -428,10 +428,6 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
        public IUpdate<T1> Where(string sql, object parms = null)
 | 
			
		||||
        {
 | 
			
		||||
            if (string.IsNullOrEmpty(sql)) return this;
 | 
			
		||||
            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(")");
 | 
			
		||||
            if (parms != null) _params.AddRange(_commonUtils.GetDbParamtersByObject(sql, parms));
 | 
			
		||||
            return this;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user