From a023662311adb14f01c8235eda15dac593c40bc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BB=96=E5=AE=87=E6=9D=B0?= Date: Mon, 7 Jul 2025 02:39:54 +0800 Subject: [PATCH] =?UTF-8?q?feat(GlobalFilter):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E5=99=A8=E7=B1=BB=E5=9E=8B=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=B9=B6=E4=BC=98=E5=8C=96=E5=90=84=E6=93=8D=E4=BD=9C=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为全局过滤器添加类型支持(查询、更新、删除),并修改相关操作(Select/Update/Delete)的过滤逻辑,确保只应用对应类型的过滤器。同时修复了RepositoryDbSet中过滤器的禁用逻辑,使其与操作类型匹配。 --- .../Repository/ContextSet/RepositoryDbSet.cs | 27 ++++++++++--------- .../Repository/Repository/BaseRepository.cs | 1 - .../Internal/CommonProvider/DeleteProvider.cs | 18 ++++++------- .../SelectProvider/Select1Provider.cs | 2 +- .../Internal/CommonProvider/UpdateProvider.cs | 4 +-- FreeSql/Internal/GlobalFilter.cs | 12 ++++++++- 6 files changed, 38 insertions(+), 26 deletions(-) diff --git a/FreeSql.DbContext/Repository/ContextSet/RepositoryDbSet.cs b/FreeSql.DbContext/Repository/ContextSet/RepositoryDbSet.cs index 01309b80d..bbd0a18fa 100644 --- a/FreeSql.DbContext/Repository/ContextSet/RepositoryDbSet.cs +++ b/FreeSql.DbContext/Repository/ContextSet/RepositoryDbSet.cs @@ -1,4 +1,5 @@ using FreeSql.Extensions.EntityUtil; +using FreeSql.Internal; using System; using System.Collections.Generic; using System.Linq; @@ -32,7 +33,9 @@ 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(); + var disableFilter = _repo.DataFilter._filtersByOrm + .Where(a => a.Value.IsEnabled == false || (a.Value.Filter.FilterType & GlobalFilter.FilterType.Query) != GlobalFilter.FilterType.Query) + .Select(a => a.Key).ToArray(); if (disableFilter.Any()) select.DisableGlobalFilter(disableFilter); return select; } @@ -40,8 +43,8 @@ namespace FreeSql protected override IUpdate OrmUpdate(IEnumerable entitys) { 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 (_repo._asTablePriv != null) update.AsTable(old => _repo._asTablePriv(_entityType, old)); + var disableFilter = _repo.DataFilter._filtersByOrm.Where(a => a.Value.IsEnabled == false || (a.Value.Filter.FilterType & GlobalFilter.FilterType.Update) != GlobalFilter.FilterType.Update).Select(a => a.Key).ToArray(); if (disableFilter.Any()) update.DisableGlobalFilter(disableFilter); return update; } @@ -49,25 +52,25 @@ namespace FreeSql protected override IDelete OrmDelete(object dywhere) { 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 (_repo._asTablePriv != null) delete.AsTable(old => _repo._asTablePriv(_entityType, old)); + var disableFilter = _repo.DataFilter._filtersByOrm.Where(a => a.Value.IsEnabled == false || (a.Value.Filter.FilterType & GlobalFilter.FilterType.Delete) != GlobalFilter.FilterType.Delete).Select(a => a.Key).ToArray(); if (disableFilter.Any()) delete.DisableGlobalFilter(disableFilter); return delete; } internal IDelete OrmDeleteInternal(object dywhere) => OrmDelete(dywhere); - protected override IDelete OrmDeleteAsType(Type entityType) - { - var delete = base.OrmDeleteAsType(entityType); - if (_repo._asTablePriv != null) delete.AsTable(old => _repo._asTablePriv(_entityType, old)); + protected override IDelete OrmDeleteAsType(Type entityType) + { + var delete = base.OrmDeleteAsType(entityType); + if (_repo._asTablePriv != null) delete.AsTable(old => _repo._asTablePriv(_entityType, old)); return delete; - } + } - protected override IInsert OrmInsert(TEntity entity) => OrmInsert(new[] { entity }); + protected override IInsert OrmInsert(TEntity entity) => OrmInsert(new[] { entity }); protected override IInsert OrmInsert(IEnumerable entitys) { var insert = base.OrmInsert(entitys); - if (_repo._asTablePriv != null) insert.AsTable(old => _repo._asTablePriv(_entityType, old)); + if (_repo._asTablePriv != null) insert.AsTable(old => _repo._asTablePriv(_entityType, old)); return insert; } internal IInsert OrmInsertInternal(TEntity entity) => OrmInsert(entity); diff --git a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs index 6a9e81f56..bb87594d8 100644 --- a/FreeSql.DbContext/Repository/Repository/BaseRepository.cs +++ b/FreeSql.DbContext/Repository/Repository/BaseRepository.cs @@ -80,7 +80,6 @@ namespace FreeSql get => _unitOfWork; } public IUpdate UpdateDiy => _dbset.OrmUpdateInternal(null); - public virtual ISelect Select => _dbset.OrmSelectInternal(null); public ISelect Where(Expression> exp) => Select.Where(exp); public ISelect WhereIf(bool condition, Expression> exp) => Select.WhereIf(condition, exp); diff --git a/FreeSql/Internal/CommonProvider/DeleteProvider.cs b/FreeSql/Internal/CommonProvider/DeleteProvider.cs index 063317198..64b5db178 100644 --- a/FreeSql/Internal/CommonProvider/DeleteProvider.cs +++ b/FreeSql/Internal/CommonProvider/DeleteProvider.cs @@ -39,7 +39,7 @@ namespace FreeSql.Internal.CommonProvider _isAutoSyncStructure = _orm.CodeFirst.IsAutoSyncStructure; this.Where(_commonUtils.WhereObject(_table, "", dywhere, _params)); if (_isAutoSyncStructure && typeof(T1) != typeof(object)) _orm.CodeFirst.SyncStructure(); - _whereGlobalFilter = _orm.GlobalFilter.GetFilters(); + _whereGlobalFilter = _orm.GlobalFilter.GetFilters().Where(l => (l.FilterType & GlobalFilter.FilterType.Delete) == GlobalFilter.FilterType.Delete).ToList(); } protected void ClearData() @@ -47,7 +47,7 @@ namespace FreeSql.Internal.CommonProvider _where.Clear(); _whereTimes = 0; _params.Clear(); - _whereGlobalFilter = _orm.GlobalFilter.GetFilters(); + _whereGlobalFilter = _orm.GlobalFilter.GetFilters().Where(l => (l.FilterType & GlobalFilter.FilterType.Delete) == GlobalFilter.FilterType.Delete).ToList(); } public IDelete WithTransaction(DbTransaction transaction) @@ -120,21 +120,21 @@ namespace FreeSql.Internal.CommonProvider public IDelete WhereDynamic(object dywhere, bool not = false) => not == false ? this.Where(_commonUtils.WhereObject(_table, "", dywhere, _params)) : this.Where($"not({_commonUtils.WhereObject(_table, "", dywhere, _params)})"); - public IDelete WhereDynamicFilter(DynamicFilterInfo filter) + public IDelete WhereDynamicFilter(DynamicFilterInfo filter) { var alias = "t_" + Guid.NewGuid().ToString("n").Substring(0, 8); - var tempQuery = _orm.Select().AsType(_table.Type).DisableGlobalFilter().As(alias); + var tempQuery = _orm.Select().AsType(_table.Type).DisableGlobalFilter().As(alias); tempQuery.WhereDynamicFilter(filter); var where = (tempQuery as Select0Provider)._where.ToString().Replace(alias + ".", ""); if (where.StartsWith(" AND ")) { - if (++_whereTimes == 1) _where.Append(where.Substring(5)); + if (++_whereTimes == 1) _where.Append(where.Substring(5)); else _where.Append(where); } - return this; + return this; } - public IDelete DisableGlobalFilter(params string[] name) + public IDelete DisableGlobalFilter(params string[] name) { if (_whereGlobalFilter.Any() == false) return this; if (name?.Any() != true) @@ -219,7 +219,7 @@ namespace FreeSql.Internal.CommonProvider _tableRule = old => name; sb.Clear().Append("DELETE FROM ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(newwhere); _interceptSql?.Invoke(sb); - if (sb.Length > 0) fetch(sb); + if (sb.Length > 0) fetch(sb); } _tableRule = oldTableRule; return; @@ -254,7 +254,7 @@ namespace FreeSql.Internal.CommonProvider _tableRule = old => name; sb.Clear().Append("DELETE FROM ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(newwhere); _interceptSql?.Invoke(sb); - if (sb.Length > 0) await fetchAsync(sb); + if (sb.Length > 0) await fetchAsync(sb); } _tableRule = oldTableRule; return; diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs index 0ba8f43c5..a27ad6fd1 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs @@ -22,7 +22,7 @@ namespace FreeSql.Internal.CommonProvider { public Select1Provider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere) { - _whereGlobalFilter = _orm.GlobalFilter.GetFilters(); + _whereGlobalFilter = _orm.GlobalFilter.GetFilters().Where(l => (l.FilterType & GlobalFilter.FilterType.Query) == GlobalFilter.FilterType.Query).ToList(); } protected ISelect InternalFrom(LambdaExpression lambdaExp) diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 71fd55997..6aa7d3cb0 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -184,7 +184,7 @@ namespace FreeSql.Internal.CommonProvider this.Where(_commonUtils.WhereObject(_table, "", dywhere, _params)); if (_isAutoSyncStructure && typeof(T1) != typeof(object)) _orm.CodeFirst.SyncStructure(); IgnoreCanUpdate(); - _whereGlobalFilter = _orm.GlobalFilter.GetFilters(); + _whereGlobalFilter = _orm.GlobalFilter.GetFilters().Where(l => (l.FilterType & GlobalFilter.FilterType.Update) == GlobalFilter.FilterType.Update).ToList(); _sourceOld = _source; } @@ -212,7 +212,7 @@ namespace FreeSql.Internal.CommonProvider _params.Clear(); _paramsSource.Clear(); IgnoreCanUpdate(); - _whereGlobalFilter = _orm.GlobalFilter.GetFilters(); + _whereGlobalFilter = _orm.GlobalFilter.GetFilters().Where(l => (l.FilterType & GlobalFilter.FilterType.Update) == GlobalFilter.FilterType.Update).ToList(); _batchProgress = null; _interceptSql = null; _tableAlias = null; diff --git a/FreeSql/Internal/GlobalFilter.cs b/FreeSql/Internal/GlobalFilter.cs index 17fc213c7..0490f1028 100644 --- a/FreeSql/Internal/GlobalFilter.cs +++ b/FreeSql/Internal/GlobalFilter.cs @@ -12,8 +12,17 @@ namespace FreeSql.Internal ConcurrentDictionary _filters = new ConcurrentDictionary(StringComparer.CurrentCultureIgnoreCase); int _id = 0; + [Flags] + public enum FilterType + { + Query = 1, // 2^0 + Update = 2, // 2^1 + Delete = 4 // 2^2 + } + public class Item { + public FilterType FilterType { get; set; } public int Id { get; internal set; } public string Name { get; internal set; } internal Func Condition { get; set; } @@ -67,7 +76,7 @@ namespace FreeSql.Internal /// public GlobalFilter ApplyOnlyIf(string name, Func condition, Expression> where, bool before = false) => Apply(true, name, condition, where, before); - GlobalFilter Apply(bool only, string name, Func condition, Expression> where, bool before) + GlobalFilter Apply(bool only, string name, Func condition, Expression> where, bool before, FilterType filterType = FilterType.Query | FilterType.Update | FilterType.Delete) { if (name == null) throw new ArgumentNullException(nameof(name)); if (where == null) return this; @@ -84,6 +93,7 @@ namespace FreeSql.Internal item.Condition = condition; item.Only = only; item.Before = before; + item.FilterType = filterType; _filters.AddOrUpdate(name, item, (_, __) => item); return this; }