mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 02:32:50 +08:00
- 修复 Repository.DataFilter 对 GlobalFilter 控制无效的 bug;#1028 #846
This commit is contained in:
parent
376862c1bd
commit
8ff9d69842
@ -289,6 +289,18 @@ namespace base_entity
|
|||||||
});
|
});
|
||||||
sql1 = sql1.Replace("INNER JOIN ", "FULL JOIN ");
|
sql1 = sql1.Replace("INNER JOIN ", "FULL JOIN ");
|
||||||
|
|
||||||
|
//fsql.Select<UserGroup>()
|
||||||
|
// .ToList(a => new
|
||||||
|
// {
|
||||||
|
// users1 = fsql.Select<User1>().Where(b => b.GroupId == a.Id).ToList(false),
|
||||||
|
// users2 = fsql.Select<User1>().Where(b => b.GroupId == a.Id).ToList(b => new
|
||||||
|
// {
|
||||||
|
// userid = b.Id,
|
||||||
|
// username = b.Username
|
||||||
|
// }),
|
||||||
|
// //users3 = fsql.Ado.Query<User1>("select * from user1 where groupid = @id", new { id = a.Id })
|
||||||
|
// });
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fsql.UseJsonMap();
|
fsql.UseJsonMap();
|
||||||
|
@ -559,14 +559,5 @@
|
|||||||
<param name="that"></param>
|
<param name="that"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
<member name="M:Microsoft.Extensions.DependencyInjection.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{FreeSql.FluentDataFilter},System.Reflection.Assembly[])">
|
|
||||||
<summary>
|
|
||||||
批量注入 Repository,可以参考代码自行调整
|
|
||||||
</summary>
|
|
||||||
<param name="services"></param>
|
|
||||||
<param name="globalDataFilter"></param>
|
|
||||||
<param name="assemblies"></param>
|
|
||||||
<returns></returns>
|
|
||||||
</member>
|
|
||||||
</members>
|
</members>
|
||||||
</doc>
|
</doc>
|
||||||
|
@ -22,8 +22,9 @@ namespace FreeSql
|
|||||||
|
|
||||||
var filters = (_repo.DataFilter as DataFilter<TEntity>)._filters;
|
var filters = (_repo.DataFilter as DataFilter<TEntity>)._filters;
|
||||||
foreach (var filter in filters.Where(a => a.Value.IsEnabled == true)) select.Where(filter.Value.Expression);
|
foreach (var filter in filters.Where(a => a.Value.IsEnabled == true)) select.Where(filter.Value.Expression);
|
||||||
var disableFilter = filters.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToArray();
|
var disableFilter = filters.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToList();
|
||||||
if (disableFilter.Any()) select.DisableGlobalFilter();
|
disableFilter.AddRange((_repo.DataFilter as DataFilter<TEntity>)._filtersByOrm.Where(a => a.Value.IsEnabled == false).Select(a => a.Key));
|
||||||
|
if (disableFilter.Any()) select.DisableGlobalFilter(disableFilter.ToArray());
|
||||||
return select;
|
return select;
|
||||||
}
|
}
|
||||||
internal ISelect<TEntity> OrmSelectInternal(object dywhere) => OrmSelect(dywhere);
|
internal ISelect<TEntity> OrmSelectInternal(object dywhere) => OrmSelect(dywhere);
|
||||||
@ -39,8 +40,9 @@ namespace FreeSql
|
|||||||
throw new Exception($"FreeSql.Repository Update 失败,因为设置了过滤器 {filter.Key}: {filter.Value.Expression},更新的数据不符合 {_db.OrmOriginal.GetEntityString(_entityType, entity)}");
|
throw new Exception($"FreeSql.Repository Update 失败,因为设置了过滤器 {filter.Key}: {filter.Value.Expression},更新的数据不符合 {_db.OrmOriginal.GetEntityString(_entityType, entity)}");
|
||||||
update.Where(filter.Value.Expression);
|
update.Where(filter.Value.Expression);
|
||||||
}
|
}
|
||||||
var disableFilter = filters.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToArray();
|
var disableFilter = filters.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToList();
|
||||||
if (disableFilter.Any()) update.DisableGlobalFilter();
|
disableFilter.AddRange((_repo.DataFilter as DataFilter<TEntity>)._filtersByOrm.Where(a => a.Value.IsEnabled == false).Select(a => a.Key));
|
||||||
|
if (disableFilter.Any()) update.DisableGlobalFilter(disableFilter.ToArray());
|
||||||
return update;
|
return update;
|
||||||
}
|
}
|
||||||
internal IUpdate<TEntity> OrmUpdateInternal(IEnumerable<TEntity> entitys) => OrmUpdate(entitys);
|
internal IUpdate<TEntity> OrmUpdateInternal(IEnumerable<TEntity> entitys) => OrmUpdate(entitys);
|
||||||
@ -49,8 +51,9 @@ namespace FreeSql
|
|||||||
var delete = base.OrmDelete(dywhere).AsTable(_repo.AsTableValueInternal);
|
var delete = base.OrmDelete(dywhere).AsTable(_repo.AsTableValueInternal);
|
||||||
var filters = (_repo.DataFilter as DataFilter<TEntity>)._filters;
|
var filters = (_repo.DataFilter as DataFilter<TEntity>)._filters;
|
||||||
foreach (var filter in filters.Where(a => a.Value.IsEnabled == true)) delete.Where(filter.Value.Expression);
|
foreach (var filter in filters.Where(a => a.Value.IsEnabled == true)) delete.Where(filter.Value.Expression);
|
||||||
var disableFilter = filters.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToArray();
|
var disableFilter = filters.Where(a => a.Value.IsEnabled == false).Select(a => a.Key).ToList();
|
||||||
if (disableFilter.Any()) delete.DisableGlobalFilter();
|
disableFilter.AddRange((_repo.DataFilter as DataFilter<TEntity>)._filtersByOrm.Where(a => a.Value.IsEnabled == false).Select(a => a.Key));
|
||||||
|
if (disableFilter.Any()) delete.DisableGlobalFilter(disableFilter.ToArray());
|
||||||
return delete;
|
return delete;
|
||||||
}
|
}
|
||||||
internal IDelete<TEntity> OrmDeleteInternal(object dywhere) => OrmDelete(dywhere);
|
internal IDelete<TEntity> OrmDeleteInternal(object dywhere) => OrmDelete(dywhere);
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
using System;
|
using FreeSql.Internal;
|
||||||
using System.Collections.Generic;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Linq.Expressions;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Linq.Expressions;
|
||||||
|
|
||||||
namespace FreeSql
|
namespace FreeSql
|
||||||
{
|
{
|
||||||
@ -48,8 +49,14 @@ namespace FreeSql
|
|||||||
public Func<TEntity, bool> ExpressionDelegate => _expressionDelegate ?? (_expressionDelegate = Expression?.Compile());
|
public Func<TEntity, bool> ExpressionDelegate => _expressionDelegate ?? (_expressionDelegate = Expression?.Compile());
|
||||||
public bool IsEnabled { get; set; }
|
public bool IsEnabled { get; set; }
|
||||||
}
|
}
|
||||||
|
internal class FilterItemByOrm
|
||||||
|
{
|
||||||
|
public GlobalFilter.Item Filter { get; set; }
|
||||||
|
public bool IsEnabled { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
internal ConcurrentDictionary<string, FilterItem> _filters = new ConcurrentDictionary<string, FilterItem>(StringComparer.CurrentCultureIgnoreCase);
|
internal ConcurrentDictionary<string, FilterItem> _filters = new ConcurrentDictionary<string, FilterItem>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
internal ConcurrentDictionary<string, FilterItemByOrm> _filtersByOrm = new ConcurrentDictionary<string, FilterItemByOrm>(StringComparer.CurrentCultureIgnoreCase);
|
||||||
public IDataFilter<TEntity> Apply(string filterName, Expression<Func<TEntity, bool>> filterAndValidateExp)
|
public IDataFilter<TEntity> Apply(string filterName, Expression<Func<TEntity, bool>> filterAndValidateExp)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -67,6 +74,7 @@ namespace FreeSql
|
|||||||
if (filterName == null || filterName.Any() == false) return new UsingAny(() => { });
|
if (filterName == null || filterName.Any() == false) return new UsingAny(() => { });
|
||||||
|
|
||||||
List<string> restore = new List<string>();
|
List<string> restore = new List<string>();
|
||||||
|
List<string> restoreByOrm = new List<string>();
|
||||||
foreach (var name in filterName)
|
foreach (var name in filterName)
|
||||||
{
|
{
|
||||||
if (_filters.TryGetValue(name, out var tryfi))
|
if (_filters.TryGetValue(name, out var tryfi))
|
||||||
@ -77,12 +85,33 @@ namespace FreeSql
|
|||||||
tryfi.IsEnabled = false;
|
tryfi.IsEnabled = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (_filtersByOrm.TryGetValue(name, out var tryfiByOrm))
|
||||||
|
{
|
||||||
|
if (tryfiByOrm.IsEnabled)
|
||||||
|
{
|
||||||
|
restoreByOrm.Add(name);
|
||||||
|
tryfiByOrm.IsEnabled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return new UsingAny(() => this.Enable(restore.ToArray()));
|
return new UsingAny(() =>
|
||||||
|
{
|
||||||
|
restore.ForEach(name =>
|
||||||
|
{
|
||||||
|
if (_filters.TryGetValue(name, out var tryfi) && tryfi.IsEnabled == false)
|
||||||
|
tryfi.IsEnabled = true;
|
||||||
|
});
|
||||||
|
restoreByOrm.ForEach(name =>
|
||||||
|
{
|
||||||
|
if (_filtersByOrm.TryGetValue(name, out var tryfiByOrm) && tryfiByOrm.IsEnabled == false)
|
||||||
|
tryfiByOrm.IsEnabled = true;
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
public IDisposable DisableAll()
|
public IDisposable DisableAll()
|
||||||
{
|
{
|
||||||
List<string> restore = new List<string>();
|
List<string> restore = new List<string>();
|
||||||
|
List<string> restoreByOrm = new List<string>();
|
||||||
foreach (var val in _filters)
|
foreach (var val in _filters)
|
||||||
{
|
{
|
||||||
if (val.Value.IsEnabled)
|
if (val.Value.IsEnabled)
|
||||||
@ -91,7 +120,27 @@ namespace FreeSql
|
|||||||
val.Value.IsEnabled = false;
|
val.Value.IsEnabled = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new UsingAny(() => this.Enable(restore.ToArray()));
|
foreach (var val in _filtersByOrm)
|
||||||
|
{
|
||||||
|
if (val.Value.IsEnabled)
|
||||||
|
{
|
||||||
|
restoreByOrm.Add(val.Key);
|
||||||
|
val.Value.IsEnabled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new UsingAny(() =>
|
||||||
|
{
|
||||||
|
restore.ForEach(name =>
|
||||||
|
{
|
||||||
|
if (_filters.TryGetValue(name, out var tryfi) && tryfi.IsEnabled == false)
|
||||||
|
tryfi.IsEnabled = true;
|
||||||
|
});
|
||||||
|
restoreByOrm.ForEach(name =>
|
||||||
|
{
|
||||||
|
if (_filtersByOrm.TryGetValue(name, out var tryfiByOrm) && tryfiByOrm.IsEnabled == false)
|
||||||
|
tryfiByOrm.IsEnabled = true;
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
class UsingAny : IDisposable
|
class UsingAny : IDisposable
|
||||||
{
|
{
|
||||||
@ -111,6 +160,7 @@ namespace FreeSql
|
|||||||
if (filterName == null || filterName.Any() == false) return new UsingAny(() => { });
|
if (filterName == null || filterName.Any() == false) return new UsingAny(() => { });
|
||||||
|
|
||||||
List<string> restore = new List<string>();
|
List<string> restore = new List<string>();
|
||||||
|
List<string> restoreByOrm = new List<string>();
|
||||||
foreach (var name in filterName)
|
foreach (var name in filterName)
|
||||||
{
|
{
|
||||||
if (_filters.TryGetValue(name, out var tryfi))
|
if (_filters.TryGetValue(name, out var tryfi))
|
||||||
@ -121,12 +171,33 @@ namespace FreeSql
|
|||||||
tryfi.IsEnabled = true;
|
tryfi.IsEnabled = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (_filtersByOrm.TryGetValue(name, out var tryfiByOrm))
|
||||||
|
{
|
||||||
|
if (tryfiByOrm.IsEnabled == false)
|
||||||
|
{
|
||||||
|
restoreByOrm.Add(name);
|
||||||
|
tryfiByOrm.IsEnabled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return new UsingAny(() => this.Disable(restore.ToArray()));
|
return new UsingAny(() =>
|
||||||
|
{
|
||||||
|
restore.ForEach(name =>
|
||||||
|
{
|
||||||
|
if (_filters.TryGetValue(name, out var tryfi) && tryfi.IsEnabled == true)
|
||||||
|
tryfi.IsEnabled = false;
|
||||||
|
});
|
||||||
|
restoreByOrm.ForEach(name =>
|
||||||
|
{
|
||||||
|
if (_filtersByOrm.TryGetValue(name, out var tryfiByOrm) && tryfiByOrm.IsEnabled == true)
|
||||||
|
tryfiByOrm.IsEnabled = false;
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
public IDisposable EnableAll()
|
public IDisposable EnableAll()
|
||||||
{
|
{
|
||||||
List<string> restore = new List<string>();
|
List<string> restore = new List<string>();
|
||||||
|
List<string> restoreByOrm = new List<string>();
|
||||||
foreach (var val in _filters)
|
foreach (var val in _filters)
|
||||||
{
|
{
|
||||||
if (val.Value.IsEnabled == false)
|
if (val.Value.IsEnabled == false)
|
||||||
@ -135,13 +206,34 @@ namespace FreeSql
|
|||||||
val.Value.IsEnabled = true;
|
val.Value.IsEnabled = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new UsingAny(() => this.Disable(restore.ToArray()));
|
foreach (var val in _filtersByOrm)
|
||||||
|
{
|
||||||
|
if (val.Value.IsEnabled == false)
|
||||||
|
{
|
||||||
|
restoreByOrm.Add(val.Key);
|
||||||
|
val.Value.IsEnabled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new UsingAny(() =>
|
||||||
|
{
|
||||||
|
restore.ForEach(name =>
|
||||||
|
{
|
||||||
|
if (_filters.TryGetValue(name, out var tryfi) && tryfi.IsEnabled == true)
|
||||||
|
tryfi.IsEnabled = false;
|
||||||
|
});
|
||||||
|
restoreByOrm.ForEach(name =>
|
||||||
|
{
|
||||||
|
if (_filtersByOrm.TryGetValue(name, out var tryfiByOrm) && tryfiByOrm.IsEnabled == true)
|
||||||
|
tryfiByOrm.IsEnabled = false;
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsEnabled(string filterName)
|
public bool IsEnabled(string filterName)
|
||||||
{
|
{
|
||||||
if (filterName == null) return false;
|
if (filterName == null) return false;
|
||||||
return _filters.TryGetValue(filterName, out var tryfi) ? tryfi.IsEnabled : false;
|
return _filters.TryGetValue(filterName, out var tryfi) ? tryfi.IsEnabled :
|
||||||
|
_filtersByOrm.TryGetValue(filterName, out var tryfiByOrm) ? tryfiByOrm.IsEnabled : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
~DataFilter() => this.Dispose();
|
~DataFilter() => this.Dispose();
|
||||||
|
@ -29,6 +29,15 @@ namespace FreeSql
|
|||||||
DataFilterUtil.SetRepositoryDataFilter(this, null);
|
DataFilterUtil.SetRepositoryDataFilter(this, null);
|
||||||
DataFilter.Apply("", filter);
|
DataFilter.Apply("", filter);
|
||||||
AsTable(asTable);
|
AsTable(asTable);
|
||||||
|
|
||||||
|
fsql.GlobalFilter.GetFilters().ForEach(gf =>
|
||||||
|
{
|
||||||
|
(DataFilter as DataFilter<TEntity>)._filtersByOrm.TryAdd(gf.Name, new DataFilter<TEntity>.FilterItemByOrm
|
||||||
|
{
|
||||||
|
Filter = gf,
|
||||||
|
IsEnabled = true
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
~BaseRepository() => this.Dispose();
|
~BaseRepository() => this.Dispose();
|
||||||
|
@ -382,6 +382,16 @@ namespace FreeSql.Tests
|
|||||||
var gft2 = g.mysql.Select<gf_t2>().Where(a => a.id == Guid.NewGuid()).ToList();
|
var gft2 = g.mysql.Select<gf_t2>().Where(a => a.id == Guid.NewGuid()).ToList();
|
||||||
var gft3 = g.mysql.Select<gf_t3>().Where(a => a.id == Guid.NewGuid()).ToList();
|
var gft3 = g.mysql.Select<gf_t3>().Where(a => a.id == Guid.NewGuid()).ToList();
|
||||||
|
|
||||||
|
var repo1 = g.mysql.GetRepository<gf_t1, Guid>();
|
||||||
|
using (repo1.DataFilter.Disable("gft1", "gft2", "gft3"))
|
||||||
|
repo1.Get(Guid.NewGuid());
|
||||||
|
var repo2 = g.mysql.GetRepository<gf_t2, Guid>();
|
||||||
|
using (repo2.DataFilter.Disable("gft1", "gft2", "gft3"))
|
||||||
|
repo2.Get(Guid.NewGuid());
|
||||||
|
var repo3 = g.mysql.GetRepository<gf_t3, Guid>();
|
||||||
|
using (repo3.DataFilter.Disable("gft1", "gft2", "gft3"))
|
||||||
|
repo3.Get(Guid.NewGuid());
|
||||||
|
|
||||||
g.sqlserver.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
|
g.sqlserver.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
|
||||||
g.mysql.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
|
g.mysql.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
|
||||||
g.pgsql.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
|
g.pgsql.Delete<TBatInst>().Where("1=1").ExecuteAffrows();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user