mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 01:05:27 +08:00 
			
		
		
		
	- 修复 未发布功能WhereObject/WhereItems 单条参数化;- 恢复 Repository.DataFilter Enable/Disable 功能;
This commit is contained in:
		@@ -487,6 +487,32 @@
 | 
			
		||||
            <typeparam name="TEntity"></typeparam>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:FreeSql.RepositoryDataFilter.Disable(System.String[])">
 | 
			
		||||
            <summary>
 | 
			
		||||
            开启过滤器,若使用 using 则使用完后,恢复为原有状态
 | 
			
		||||
            </summary>
 | 
			
		||||
            <param name="filterName">过滤器名称</param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:FreeSql.RepositoryDataFilter.DisableAll">
 | 
			
		||||
            <summary>
 | 
			
		||||
            开启所有过滤器,若使用 using 则使用完后,恢复为原有状态
 | 
			
		||||
            </summary>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:FreeSql.RepositoryDataFilter.Enable(System.String[])">
 | 
			
		||||
            <summary>
 | 
			
		||||
            禁用过滤器,若使用 using 则使用完后,恢复为原有状态
 | 
			
		||||
            </summary>
 | 
			
		||||
            <param name="filterName"></param>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:FreeSql.RepositoryDataFilter.EnableAll">
 | 
			
		||||
            <summary>
 | 
			
		||||
            禁用所有过滤器,若使用 using 则使用完后,恢复为原有状态
 | 
			
		||||
            </summary>
 | 
			
		||||
            <returns></returns>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:FreeSql.IBaseRepository.AsType(System.Type)">
 | 
			
		||||
            <summary>
 | 
			
		||||
            动态Type,在使用 Repository<object> 后使用本方法,指定实体类型
 | 
			
		||||
@@ -511,6 +537,11 @@
 | 
			
		||||
            设置 DbContext 选项
 | 
			
		||||
            </summary>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="P:FreeSql.IBaseRepository.DataFilter">
 | 
			
		||||
            <summary>
 | 
			
		||||
            GlobalFilter 禁用/启用控制
 | 
			
		||||
            </summary>
 | 
			
		||||
        </member>
 | 
			
		||||
        <member name="M:FreeSql.IBaseRepository`1.FlushState">
 | 
			
		||||
            <summary>
 | 
			
		||||
            清空状态数据
 | 
			
		||||
 
 | 
			
		||||
@@ -32,6 +32,8 @@ namespace FreeSql
 | 
			
		||||
        {
 | 
			
		||||
            var select = base.OrmSelect(dywhere);
 | 
			
		||||
            if (_repo._asTablePriv != null) select.AsTable(_repo._asTablePriv);
 | 
			
		||||
            var disableFilter = _repo.DataFilter._filtersByOrm.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToArray();
 | 
			
		||||
            if (disableFilter.Any()) select.DisableGlobalFilter(disableFilter);
 | 
			
		||||
            return select;
 | 
			
		||||
        }
 | 
			
		||||
        internal ISelect<TEntity> OrmSelectInternal(object dywhere) => OrmSelect(dywhere);
 | 
			
		||||
@@ -39,6 +41,8 @@ namespace FreeSql
 | 
			
		||||
        {
 | 
			
		||||
            var update = base.OrmUpdate(entitys);
 | 
			
		||||
			if (_repo._asTablePriv != null) update.AsTable(old => _repo._asTablePriv(_entityType, old));
 | 
			
		||||
            var disableFilter = _repo.DataFilter._filtersByOrm.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToArray();
 | 
			
		||||
            if (disableFilter.Any()) update.DisableGlobalFilter(disableFilter);
 | 
			
		||||
            return update;
 | 
			
		||||
        }
 | 
			
		||||
        internal IUpdate<TEntity> OrmUpdateInternal(IEnumerable<TEntity> entitys) => OrmUpdate(entitys);
 | 
			
		||||
@@ -46,6 +50,8 @@ namespace FreeSql
 | 
			
		||||
        {
 | 
			
		||||
            var delete = base.OrmDelete(dywhere);
 | 
			
		||||
			if (_repo._asTablePriv != null) delete.AsTable(old => _repo._asTablePriv(_entityType, old));
 | 
			
		||||
            var disableFilter = _repo.DataFilter._filtersByOrm.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToArray();
 | 
			
		||||
            if (disableFilter.Any()) delete.DisableGlobalFilter(disableFilter);
 | 
			
		||||
            return delete;
 | 
			
		||||
        }
 | 
			
		||||
        internal IDelete<TEntity> OrmDeleteInternal(object dywhere) => OrmDelete(dywhere);
 | 
			
		||||
 
 | 
			
		||||
@@ -22,6 +22,14 @@ namespace FreeSql
 | 
			
		||||
        protected BaseRepository(IFreeSql fsql)
 | 
			
		||||
        {
 | 
			
		||||
            _ormScoped = DbContextScopedFreeSql.Create(fsql, () => _db, () => UnitOfWork);
 | 
			
		||||
            fsql?.GlobalFilter?.GetAllFilters().ForEach(gf =>
 | 
			
		||||
            {
 | 
			
		||||
                DataFilter._filtersByOrm.TryAdd(gf.Name, new RepositoryDataFilter.FilterItemByOrm
 | 
			
		||||
                {
 | 
			
		||||
                    Filter = gf,
 | 
			
		||||
                    IsEnabled = true
 | 
			
		||||
                });
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        ~BaseRepository() => this.Dispose();
 | 
			
		||||
@@ -55,6 +63,7 @@ namespace FreeSql
 | 
			
		||||
			_asTablePriv = rule;
 | 
			
		||||
		}
 | 
			
		||||
		public DbContextOptions DbContextOptions { get => _db.Options; set => _db.Options = value; }
 | 
			
		||||
        public RepositoryDataFilter DataFilter { get; set; } = new RepositoryDataFilter();
 | 
			
		||||
 | 
			
		||||
        internal DbContextScopedFreeSql _ormScoped;
 | 
			
		||||
        internal IFreeSql OrmOriginal => _ormScoped?._originalFsql;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										148
									
								
								FreeSql.DbContext/Repository/Repository/DataFilter.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								FreeSql.DbContext/Repository/Repository/DataFilter.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,148 @@
 | 
			
		||||
using FreeSql.Internal;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Concurrent;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql
 | 
			
		||||
{
 | 
			
		||||
    public class RepositoryDataFilter
 | 
			
		||||
    {
 | 
			
		||||
        internal class FilterItemByOrm
 | 
			
		||||
        {
 | 
			
		||||
            public GlobalFilter.Item Filter { get; set; }
 | 
			
		||||
            public bool IsEnabled { get; set; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        internal ConcurrentDictionary<string, FilterItemByOrm> _filtersByOrm = new ConcurrentDictionary<string, FilterItemByOrm>(StringComparer.CurrentCultureIgnoreCase);
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 开启过滤器,若使用 using 则使用完后,恢复为原有状态
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="filterName">过滤器名称</param>
 | 
			
		||||
        /// <returns></returns>
 | 
			
		||||
        public IDisposable Disable(params string[] filterName)
 | 
			
		||||
        {
 | 
			
		||||
            if (filterName == null || filterName.Any() == false) return new UsingAny(() => { });
 | 
			
		||||
 | 
			
		||||
            List<string> restoreByOrm = new List<string>();
 | 
			
		||||
            foreach (var name in filterName)
 | 
			
		||||
            {
 | 
			
		||||
                if (_filtersByOrm.TryGetValue(name, out var tryfiByOrm))
 | 
			
		||||
                {
 | 
			
		||||
                    if (tryfiByOrm.IsEnabled)
 | 
			
		||||
                    {
 | 
			
		||||
                        restoreByOrm.Add(name);
 | 
			
		||||
                        tryfiByOrm.IsEnabled = false;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            return new UsingAny(() =>
 | 
			
		||||
            {
 | 
			
		||||
                restoreByOrm.ForEach(name =>
 | 
			
		||||
                {
 | 
			
		||||
                    if (_filtersByOrm.TryGetValue(name, out var tryfiByOrm) && tryfiByOrm.IsEnabled == false)
 | 
			
		||||
                        tryfiByOrm.IsEnabled = true;
 | 
			
		||||
                });
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 开启所有过滤器,若使用 using 则使用完后,恢复为原有状态
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <returns></returns>
 | 
			
		||||
        public IDisposable DisableAll()
 | 
			
		||||
        {
 | 
			
		||||
            List<string> restoreByOrm = new List<string>();
 | 
			
		||||
            foreach (var val in _filtersByOrm)
 | 
			
		||||
            {
 | 
			
		||||
                if (val.Value.IsEnabled)
 | 
			
		||||
                {
 | 
			
		||||
                    restoreByOrm.Add(val.Key);
 | 
			
		||||
                    val.Value.IsEnabled = false;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            return new UsingAny(() =>
 | 
			
		||||
            {
 | 
			
		||||
                restoreByOrm.ForEach(name =>
 | 
			
		||||
                {
 | 
			
		||||
                    if (_filtersByOrm.TryGetValue(name, out var tryfiByOrm) && tryfiByOrm.IsEnabled == false)
 | 
			
		||||
                        tryfiByOrm.IsEnabled = true;
 | 
			
		||||
                });
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        class UsingAny : IDisposable
 | 
			
		||||
        {
 | 
			
		||||
            Action _ondis;
 | 
			
		||||
            public UsingAny(Action ondis)
 | 
			
		||||
            {
 | 
			
		||||
                _ondis = ondis;
 | 
			
		||||
            }
 | 
			
		||||
            public void Dispose()
 | 
			
		||||
            {
 | 
			
		||||
                _ondis?.Invoke();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 禁用过滤器,若使用 using 则使用完后,恢复为原有状态
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="filterName"></param>
 | 
			
		||||
        /// <returns></returns>
 | 
			
		||||
        public IDisposable Enable(params string[] filterName)
 | 
			
		||||
        {
 | 
			
		||||
            if (filterName == null || filterName.Any() == false) return new UsingAny(() => { });
 | 
			
		||||
 | 
			
		||||
            List<string> restoreByOrm = new List<string>();
 | 
			
		||||
            foreach (var name in filterName)
 | 
			
		||||
            {
 | 
			
		||||
                if (_filtersByOrm.TryGetValue(name, out var tryfiByOrm))
 | 
			
		||||
                {
 | 
			
		||||
                    if (tryfiByOrm.IsEnabled == false)
 | 
			
		||||
                    {
 | 
			
		||||
                        restoreByOrm.Add(name);
 | 
			
		||||
                        tryfiByOrm.IsEnabled = true;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            return new UsingAny(() =>
 | 
			
		||||
            {
 | 
			
		||||
                restoreByOrm.ForEach(name =>
 | 
			
		||||
                {
 | 
			
		||||
                    if (_filtersByOrm.TryGetValue(name, out var tryfiByOrm) && tryfiByOrm.IsEnabled == true)
 | 
			
		||||
                        tryfiByOrm.IsEnabled = false;
 | 
			
		||||
                });
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 禁用所有过滤器,若使用 using 则使用完后,恢复为原有状态
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <returns></returns>
 | 
			
		||||
        public IDisposable EnableAll()
 | 
			
		||||
        {
 | 
			
		||||
            List<string> restoreByOrm = new List<string>();
 | 
			
		||||
            foreach (var val in _filtersByOrm)
 | 
			
		||||
            {
 | 
			
		||||
                if (val.Value.IsEnabled == false)
 | 
			
		||||
                {
 | 
			
		||||
                    restoreByOrm.Add(val.Key);
 | 
			
		||||
                    val.Value.IsEnabled = true;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            return new UsingAny(() =>
 | 
			
		||||
            {
 | 
			
		||||
                restoreByOrm.ForEach(name =>
 | 
			
		||||
                {
 | 
			
		||||
                    if (_filtersByOrm.TryGetValue(name, out var tryfiByOrm) && tryfiByOrm.IsEnabled == true)
 | 
			
		||||
                        tryfiByOrm.IsEnabled = false;
 | 
			
		||||
                });
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public bool IsEnabled(string filterName)
 | 
			
		||||
        {
 | 
			
		||||
            if (filterName == null) return false;
 | 
			
		||||
            return _filtersByOrm.TryGetValue(filterName, out var tryfiByOrm) ? tryfiByOrm.IsEnabled : false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -34,6 +34,10 @@ namespace FreeSql
 | 
			
		||||
		/// 设置 DbContext 选项
 | 
			
		||||
		/// </summary>
 | 
			
		||||
		DbContextOptions DbContextOptions { get; set; }
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// GlobalFilter 禁用/启用控制
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        RepositoryDataFilter DataFilter { get; }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public interface IBaseRepository<TEntity> : IBaseRepository
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user