mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-06-19 04:18:16 +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