mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 10:42:52 +08:00
- 增加 GlobalFilter.ApplyIf 创建动态过滤器;
This commit is contained in:
parent
1bd4b7dbf1
commit
beb2eaada2
@ -532,14 +532,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>
|
||||||
|
@ -280,6 +280,12 @@ namespace FreeSql.Tests
|
|||||||
var kwrepo = g.sqlite.GetRepository<userinfo>();
|
var kwrepo = g.sqlite.GetRepository<userinfo>();
|
||||||
kwrepo.Insert(u1);
|
kwrepo.Insert(u1);
|
||||||
|
|
||||||
|
g.sqlite.GlobalFilter.ApplyIf<gf_t1>("random_filter", () => new Random().Next(0, 2) % 2 == 0 ? true : false, a => a.rowstate > 0);
|
||||||
|
|
||||||
|
Enumerable.Range(0, 10).ToList().ForEach(aidx =>
|
||||||
|
{
|
||||||
|
var sql1 = g.sqlite.Select<gf_t1>().ToSql();
|
||||||
|
});
|
||||||
|
|
||||||
g.sqlite.GlobalFilter.Apply<gf_t1>("gft1", a => a.rowstate > -1 && g.sqlite.Select<gf_t2>().Any(b => b.id == a.id))
|
g.sqlite.GlobalFilter.Apply<gf_t1>("gft1", a => a.rowstate > -1 && g.sqlite.Select<gf_t2>().Any(b => b.id == a.id))
|
||||||
.Apply<gf_t2>("gft2", a => a.rowstate > -2)
|
.Apply<gf_t2>("gft2", a => a.rowstate > -2)
|
||||||
|
@ -2983,6 +2983,153 @@
|
|||||||
<param name="parms"></param>
|
<param name="parms"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteConnectTestAsync">
|
||||||
|
<summary>
|
||||||
|
测试数据库是否连接正确,本方法执行如下命令:<para></para>
|
||||||
|
MySql/SqlServer/PostgreSQL/达梦/人大金仓/神通: SELECT 1<para></para>
|
||||||
|
Oracle: SELECT 1 FROM dual<para></para>
|
||||||
|
</summary>
|
||||||
|
<returns>true: 成功, false: 失败</returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteReaderAsync(System.Func{FreeSql.Internal.Model.FetchCallbackArgs{System.Data.Common.DbDataReader},System.Threading.Tasks.Task},System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
|
||||||
|
<summary>
|
||||||
|
查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】
|
||||||
|
</summary>
|
||||||
|
<param name="readerHander"></param>
|
||||||
|
<param name="cmdType"></param>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="cmdParms"></param>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteReaderAsync(System.Func{FreeSql.Internal.Model.FetchCallbackArgs{System.Data.Common.DbDataReader},System.Threading.Tasks.Task},System.String,System.Object)">
|
||||||
|
<summary>
|
||||||
|
查询,ExecuteReaderAsync(dr => {}, "select * from user where age > ?age", new { age = 25 })<para></para>
|
||||||
|
提示:parms 参数还可以传 Dictionary<string, object>
|
||||||
|
</summary>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="parms"></param>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteArrayAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
|
||||||
|
<summary>
|
||||||
|
查询
|
||||||
|
</summary>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="cmdParms"></param>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteArrayAsync(System.String,System.Object)">
|
||||||
|
<summary>
|
||||||
|
查询,ExecuteArrayAsync("select * from user where age > ?age", new { age = 25 })<para></para>
|
||||||
|
提示:parms 参数还可以传 Dictionary<string, object>
|
||||||
|
</summary>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="parms"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteDataSetAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
|
||||||
|
<summary>
|
||||||
|
查询
|
||||||
|
</summary>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="cmdParms"></param>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteDataSetAsync(System.String,System.Object)">
|
||||||
|
<summary>
|
||||||
|
查询,ExecuteDataSetAsync("select * from user where age > ?age; select 2", new { age = 25 })<para></para>
|
||||||
|
提示:parms 参数还可以传 Dictionary<string, object>
|
||||||
|
</summary>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="parms"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteDataTableAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
|
||||||
|
<summary>
|
||||||
|
查询
|
||||||
|
</summary>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="cmdParms"></param>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteDataTableAsync(System.String,System.Object)">
|
||||||
|
<summary>
|
||||||
|
查询,ExecuteDataTableAsync("select * from user where age > ?age", new { age = 25 })<para></para>
|
||||||
|
提示:parms 参数还可以传 Dictionary<string, object>
|
||||||
|
</summary>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="parms"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteNonQueryAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
|
||||||
|
<summary>
|
||||||
|
在【主库】执行
|
||||||
|
</summary>
|
||||||
|
<param name="cmdType"></param>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="cmdParms"></param>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteNonQueryAsync(System.String,System.Object)">
|
||||||
|
<summary>
|
||||||
|
在【主库】执行,ExecuteNonQueryAsync("delete from user where age > ?age", new { age = 25 })<para></para>
|
||||||
|
提示:parms 参数还可以传 Dictionary<string, object>
|
||||||
|
</summary>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="parms"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteScalarAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
|
||||||
|
<summary>
|
||||||
|
在【主库】执行
|
||||||
|
</summary>
|
||||||
|
<param name="cmdType"></param>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="cmdParms"></param>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteScalarAsync(System.String,System.Object)">
|
||||||
|
<summary>
|
||||||
|
在【主库】执行,ExecuteScalarAsync("select 1 from user where age > ?age", new { age = 25 })<para></para>
|
||||||
|
提示:parms 参数还可以传 Dictionary<string, object>
|
||||||
|
</summary>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="parms"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.QueryAsync``1(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
|
||||||
|
<summary>
|
||||||
|
执行SQL返回对象集合,QueryAsync<User>("select * from user where age > ?age", new SqlParameter { ParameterName = "age", Value = 25 })
|
||||||
|
</summary>
|
||||||
|
<typeparam name="T"></typeparam>
|
||||||
|
<param name="cmdType"></param>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="cmdParms"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.QueryAsync``1(System.String,System.Object)">
|
||||||
|
<summary>
|
||||||
|
执行SQL返回对象集合,QueryAsync<User>("select * from user where age > ?age", new { age = 25 })<para></para>
|
||||||
|
提示:parms 参数还可以传 Dictionary<string, object>
|
||||||
|
</summary>
|
||||||
|
<typeparam name="T"></typeparam>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="parms"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.QueryAsync``2(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
|
||||||
|
<summary>
|
||||||
|
执行SQL返回对象集合,Query<User>("select * from user where age > ?age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 })
|
||||||
|
</summary>
|
||||||
|
<typeparam name="T1"></typeparam>
|
||||||
|
<param name="cmdType"></param>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="cmdParms"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.QueryAsync``2(System.String,System.Object)">
|
||||||
|
<summary>
|
||||||
|
执行SQL返回对象集合,Query<User, Address>("select * from user where age > ?age; select * from address", new { age = 25 })<para></para>
|
||||||
|
提示:parms 参数还可以传 Dictionary<string, object>
|
||||||
|
</summary>
|
||||||
|
<typeparam name="T1"></typeparam>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="parms"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="E:FreeSql.IAop.ParseExpression">
|
<member name="E:FreeSql.IAop.ParseExpression">
|
||||||
<summary>
|
<summary>
|
||||||
可自定义解析表达式
|
可自定义解析表达式
|
||||||
@ -3536,13 +3683,26 @@
|
|||||||
</member>
|
</member>
|
||||||
<member name="M:FreeSql.Internal.GlobalFilter.Apply``1(System.String,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}})">
|
<member name="M:FreeSql.Internal.GlobalFilter.Apply``1(System.String,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}})">
|
||||||
<summary>
|
<summary>
|
||||||
创建一个过滤器
|
创建一个过滤器<para></para>
|
||||||
|
提示:判断登陆身份,请参考资料 AsyncLocal
|
||||||
</summary>
|
</summary>
|
||||||
<typeparam name="TEntity"></typeparam>
|
<typeparam name="TEntity"></typeparam>
|
||||||
<param name="name">名字</param>
|
<param name="name">名字</param>
|
||||||
<param name="where">表达式</param>
|
<param name="where">表达式</param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:FreeSql.Internal.GlobalFilter.ApplyIf``1(System.String,System.Func{System.Boolean},System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}})">
|
||||||
|
<summary>
|
||||||
|
创建一个动态过滤器,当 condition 返回值为 true 时才生效<para></para>
|
||||||
|
场景:当登陆身份是管理员,则过滤条件不生效<para></para>
|
||||||
|
提示:判断登陆身份,请参考资料 AsyncLocal
|
||||||
|
</summary>
|
||||||
|
<typeparam name="TEntity"></typeparam>
|
||||||
|
<param name="name">名字</param>
|
||||||
|
<param name="condition">委托,返回值为 true 时才生效</param>
|
||||||
|
<param name="where">表达式</param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="P:FreeSql.Internal.Model.BatchProgressStatus`1.Data">
|
<member name="P:FreeSql.Internal.Model.BatchProgressStatus`1.Data">
|
||||||
<summary>
|
<summary>
|
||||||
当前操作的数据
|
当前操作的数据
|
||||||
@ -3739,6 +3899,12 @@
|
|||||||
<param name="timeout">超时</param>
|
<param name="timeout">超时</param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:FreeSql.Internal.ObjectPool.IObjectPool`1.GetAsync">
|
||||||
|
<summary>
|
||||||
|
获取资源
|
||||||
|
</summary>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:FreeSql.Internal.ObjectPool.IObjectPool`1.Return(FreeSql.Internal.ObjectPool.Object{`0},System.Boolean)">
|
<member name="M:FreeSql.Internal.ObjectPool.IObjectPool`1.Return(FreeSql.Internal.ObjectPool.Object{`0},System.Boolean)">
|
||||||
<summary>
|
<summary>
|
||||||
使用完毕后,归还资源
|
使用完毕后,归还资源
|
||||||
@ -3809,6 +3975,12 @@
|
|||||||
</summary>
|
</summary>
|
||||||
<param name="obj">资源对象</param>
|
<param name="obj">资源对象</param>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:FreeSql.Internal.ObjectPool.IPolicy`1.OnGetAsync(FreeSql.Internal.ObjectPool.Object{`0})">
|
||||||
|
<summary>
|
||||||
|
从对象池获取对象成功的时候触发,通过该方法统计或初始化对象
|
||||||
|
</summary>
|
||||||
|
<param name="obj">资源对象</param>
|
||||||
|
</member>
|
||||||
<member name="M:FreeSql.Internal.ObjectPool.IPolicy`1.OnReturn(FreeSql.Internal.ObjectPool.Object{`0})">
|
<member name="M:FreeSql.Internal.ObjectPool.IPolicy`1.OnReturn(FreeSql.Internal.ObjectPool.Object{`0})">
|
||||||
<summary>
|
<summary>
|
||||||
归还对象给对象池的时候触发
|
归还对象给对象池的时候触发
|
||||||
|
@ -16,22 +16,35 @@ namespace FreeSql.Internal
|
|||||||
{
|
{
|
||||||
public int Id { get; internal set; }
|
public int Id { get; internal set; }
|
||||||
public string Name { get; internal set; }
|
public string Name { get; internal set; }
|
||||||
|
internal Func<bool> Condition { get; set; }
|
||||||
public LambdaExpression Where { get; internal set; }
|
public LambdaExpression Where { get; internal set; }
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 创建一个过滤器
|
/// 创建一个过滤器<para></para>
|
||||||
|
/// 提示:判断登陆身份,请参考资料 AsyncLocal
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="TEntity"></typeparam>
|
/// <typeparam name="TEntity"></typeparam>
|
||||||
/// <param name="name">名字</param>
|
/// <param name="name">名字</param>
|
||||||
/// <param name="where">表达式</param>
|
/// <param name="where">表达式</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public GlobalFilter Apply<TEntity>(string name, Expression<Func<TEntity, bool>> where)
|
public GlobalFilter Apply<TEntity>(string name, Expression<Func<TEntity, bool>> where) => ApplyIf(name, () => true, where);
|
||||||
|
/// <summary>
|
||||||
|
/// 创建一个动态过滤器,当 condition 返回值为 true 时才生效<para></para>
|
||||||
|
/// 场景:当登陆身份是管理员,则过滤条件不生效<para></para>
|
||||||
|
/// 提示:判断登陆身份,请参考资料 AsyncLocal
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TEntity"></typeparam>
|
||||||
|
/// <param name="name">名字</param>
|
||||||
|
/// <param name="condition">委托,返回值为 true 时才生效</param>
|
||||||
|
/// <param name="where">表达式</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public GlobalFilter ApplyIf<TEntity>(string name, Func<bool> condition, Expression<Func<TEntity, bool>> where)
|
||||||
{
|
{
|
||||||
if (name == null) throw new ArgumentNullException(nameof(name));
|
if (name == null) throw new ArgumentNullException(nameof(name));
|
||||||
if (where == null) return this;
|
if (where == null) return this;
|
||||||
|
|
||||||
_filters.TryGetValue(name, out var item);
|
_filters.TryGetValue(name, out var item);
|
||||||
if (item == null) item = new Item { Id = ++_id, Name = name };
|
if (item == null) item = new Item { Id = ++_id, Name = name, Condition = condition };
|
||||||
|
|
||||||
var newParameter = Expression.Parameter(typeof(TEntity), $"gf{_id}");
|
var newParameter = Expression.Parameter(typeof(TEntity), $"gf{_id}");
|
||||||
var newlambda = Expression.Lambda<Func<TEntity, bool>>(
|
var newlambda = Expression.Lambda<Func<TEntity, bool>>(
|
||||||
@ -44,6 +57,6 @@ namespace FreeSql.Internal
|
|||||||
}
|
}
|
||||||
public void Remove(string name) => _filters.TryRemove(name ?? throw new ArgumentNullException(nameof(name)), out var _);
|
public void Remove(string name) => _filters.TryRemove(name ?? throw new ArgumentNullException(nameof(name)), out var _);
|
||||||
|
|
||||||
public List<Item> GetFilters() => _filters.Values.OrderBy(a => a.Id).ToList();
|
public List<Item> GetFilters() => _filters.Values.Where(a => a.Condition?.Invoke() != false).OrderBy(a => a.Id).ToList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user