- 增加 IFreeSql.GlobalFilter 全局过滤器;

- 移除 TableAttribute.SelectFilter 功能;
This commit is contained in:
28810 2019-10-24 02:17:22 +08:00
parent 5b0b678c27
commit b97156b482
46 changed files with 271 additions and 148 deletions

View File

@ -256,7 +256,7 @@
<param name="that"></param>
<param name="options"></param>
</member>
<member name="M:FreeSqlRepositoryExtenssions.GetRepository``2(IFreeSql,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}})">
<member name="M:FreeSqlRepositoryExtensions.GetRepository``2(IFreeSql,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}})">
<summary>
返回默认仓库类
</summary>
@ -266,7 +266,7 @@
<param name="filter">数据过滤 + 验证</param>
<returns></returns>
</member>
<member name="M:FreeSqlRepositoryExtenssions.GetRepository``1(IFreeSql,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}})">
<member name="M:FreeSqlRepositoryExtensions.GetRepository``1(IFreeSql,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}})">
<summary>
返回默认仓库类,适用联合主键的仓储类
</summary>
@ -275,7 +275,7 @@
<param name="filter">数据过滤 + 验证</param>
<returns></returns>
</member>
<member name="M:FreeSqlRepositoryExtenssions.GetGuidRepository``1(IFreeSql,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Func{System.String,System.String})">
<member name="M:FreeSqlRepositoryExtensions.GetGuidRepository``1(IFreeSql,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Func{System.String,System.String})">
<summary>
返回仓库类
</summary>
@ -285,7 +285,7 @@
<param name="asTable">分表规则,参数:旧表名;返回:新表名 https://github.com/2881099/FreeSql/wiki/Repository</param>
<returns></returns>
</member>
<member name="M:FreeSqlRepositoryExtenssions.CreateUnitOfWork(IFreeSql)">
<member name="M:FreeSqlRepositoryExtensions.CreateUnitOfWork(IFreeSql)">
<summary>
创建基于仓储功能的工作单元,务必使用 using 包含使用
</summary>

View File

@ -3,7 +3,7 @@ using System;
using System.Linq.Expressions;
using System.Linq;
public static class FreeSqlRepositoryExtenssions
public static class FreeSqlRepositoryExtensions
{
/// <summary>

View File

@ -87,7 +87,7 @@ namespace FreeSql.Tests.MySqlConnector
public virtual ICollection<Tag> Tags { get; set; }
}
[Table(Name = "TestInfoT1", SelectFilter = " a.id > 0")]
[Table(Name = "TestInfoT1")]
class TestInfo
{
[Column(IsIdentity = true, IsPrimary = true)]

View File

@ -1003,7 +1003,7 @@ WHERE ROWNUM < 11";
}
[Table(Name = "TestInfoT1", SelectFilter = " a.id > 0")]
[Table(Name = "TestInfoT1")]
class TestInfo
{
[Column(IsIdentity = true, IsPrimary = true)]

View File

@ -68,21 +68,21 @@ namespace FreeSql.Tests.DataAnnotations
{
g.mysql.CodeFirst
//.ConfigEntity<TestFluenttb1>(a => {
// a.Name("xxdkdkdk1").SelectFilter("a.Id22 > 0");
// a.Name("xxdkdkdk1");
// a.Property(b => b.Id).Name("Id22").IsIdentity(true);
// a.Property(b => b.name).DbType("varchar(100)").IsNullable(true);
//})
.ConfigEntity(typeof(TestFluenttb1), a =>
{
a.Name("xxdkdkdk1222").SelectFilter("a.Id22dd > 1");
a.Name("xxdkdkdk1222");
a.Property("Id").Name("Id22dd").IsIdentity(true);
a.Property("Name").DbType("varchar(101)").IsNullable(true);
})
.ConfigEntity<TestFluenttb2>(a =>
{
a.Name("xxdkdkdk2").SelectFilter("a.Idx > 0");
a.Name("xxdkdkdk2");
a.Property(b => b.Id).Name("Id22").IsIdentity(true);
a.Property(b => b.name).DbType("varchar(100)").IsNullable(true);
})

View File

@ -41,21 +41,21 @@ namespace FreeSql.Tests.DataAnnotations
{
_sqlserverFixture.SqlServer.CodeFirst
//.ConfigEntity<TestFluenttb1>(a => {
// a.Name("xxdkdkdk1").SelectFilter("a.Id22 > 0");
// a.Name("xxdkdkdk1");
// a.Property(b => b.Id).Name("Id22").IsIdentity(true);
// a.Property(b => b.name).DbType("varchar(100)").IsNullable(true);
//})
.ConfigEntity(typeof(TestFluenttb1), a =>
{
a.Name("xxdkdkdk1222").SelectFilter("a.Id22dd > 1");
a.Name("xxdkdkdk1222");
a.Property("Id").Name("Id22dd").IsIdentity(true);
a.Property("Name").DbType("varchar(101)").IsNullable(true);
})
.ConfigEntity<TestFluenttb2>(a =>
{
a.Name("xxdkdkdk2").SelectFilter("a.Idx > 0");
a.Name("xxdkdkdk2");
a.Property(b => b.Id).Name("Id22").IsIdentity(true);
a.Property(b => b.name).DbType("varchar(100)").IsNullable(true);
})

View File

@ -1106,7 +1106,6 @@ namespace FreeSql.Tests.Sqlite
[Fact]
public void Include_ManyToMany()
{
var tag1 = new Tag
{
Ddd = DateTime.Now.Second,

View File

@ -15,6 +15,7 @@ using Zeus;
using Zeus.Domain.Enum;
using System.ComponentModel.DataAnnotations;
using System.Reflection;
using System.Threading;
namespace FreeSql.Tests
{
@ -415,10 +416,27 @@ namespace FreeSql.Tests
}
public enum TestAddEnumType { , }
public static AsyncLocal<Guid> TenrantId { get; set; } = new AsyncLocal<Guid>();
[Fact]
public void Test1()
{
//g.mysql.GlobalFilter
// .Apply<TestAddEnum>("test1", a => a.Id == TenrantId.Value)
// .Apply<AuthorTest>("test2", a => a.Id == 111)
// .Apply<AuthorTest>("test3", a => a.Name == "11");
TenrantId.Value = Guid.NewGuid();
g.mysql.Select<TestAddEnum>().ToList();
g.mysql.Select<TestAddEnum>().DisableGlobalFilter("test1").ToList();
g.mysql.Select<TestAddEnum>().DisableGlobalFilter().ToList();
g.mysql.Delete<TestAddEnum>().Where(a => a.Id == Guid.Empty).ExecuteAffrows();
g.mysql.Delete<TestAddEnum>().DisableGlobalFilter("test1").Where(a => a.Id == Guid.Empty).ExecuteAffrows();
g.mysql.Delete<TestAddEnum>().DisableGlobalFilter().Where(a => a.Id == Guid.Empty).ExecuteAffrows();
g.mysql.Update<TestAddEnum>().SetSource(new TestAddEnum { Id = Guid.Empty }).ExecuteAffrows();
g.mysql.Update<TestAddEnum>().DisableGlobalFilter("test1").SetSource(new TestAddEnum { Id = Guid.Empty }).ExecuteAffrows();
g.mysql.Update<TestAddEnum>().DisableGlobalFilter().SetSource(new TestAddEnum { Id = Guid.Empty }).ExecuteAffrows();
g.sqlite.Insert(new TestGuidId { xxx = "111" }).ExecuteAffrows();
g.sqlite.Insert(new TestGuidId { xxx = "222" }).ExecuteAffrows();
@ -1217,7 +1235,7 @@ namespace FreeSql.Tests
}
[Table(Name = "TestInfoT1", SelectFilter = " a.id > 0")]
[Table(Name = "TestInfoT1")]
class TestInfo
{
[Column(IsIdentity = true, IsPrimary = true)]

View File

@ -16,10 +16,6 @@ namespace FreeSql.DataAnnotations
/// 指定数据库旧的表名修改实体命名时同时设置此参数为修改之前的值CodeFirst才可以正确修改数据库表否则将视为【创建新表】
/// </summary>
public string OldName { get; set; }
/// <summary>
/// 查询过滤SQL实现类似 a.IsDeleted = 1 功能
/// </summary>
public string SelectFilter { get; set; }
internal bool? _DisableSyncStructure;
/// <summary>

View File

@ -35,14 +35,6 @@ namespace FreeSql.DataAnnotations
_table.OldName = value;
return this;
}
/// <summary>
/// 查询过滤SQL实现类似 a.IsDeleted = 1 功能
/// </summary>
public TableFluent SelectFilter(string value)
{
_table.SelectFilter = value;
return this;
}
/// <summary>
/// 禁用 CodeFirst 同步结构迁移
@ -100,14 +92,6 @@ namespace FreeSql.DataAnnotations
_table.OldName = value;
return this;
}
/// <summary>
/// 查询过滤SQL实现类似 a.IsDeleted = 1 功能
/// </summary>
public TableFluent<T> SelectFilter(string value)
{
_table.SelectFilter = value;
return this;
}
/// <summary>
/// 禁用 CodeFirst 同步结构迁移

View File

@ -192,11 +192,6 @@
指定数据库旧的表名修改实体命名时同时设置此参数为修改之前的值CodeFirst才可以正确修改数据库表否则将视为【创建新表】
</summary>
</member>
<member name="P:FreeSql.DataAnnotations.TableAttribute.SelectFilter">
<summary>
查询过滤SQL实现类似 a.IsDeleted = 1 功能
</summary>
</member>
<member name="P:FreeSql.DataAnnotations.TableAttribute.DisableSyncStructure">
<summary>
禁用 CodeFirst 同步结构迁移
@ -212,11 +207,6 @@
指定数据库旧的表名修改实体命名时同时设置此参数为修改之前的值CodeFirst才可以正确修改数据库表否则将视为【创建新表】
</summary>
</member>
<member name="M:FreeSql.DataAnnotations.TableFluent.SelectFilter(System.String)">
<summary>
查询过滤SQL实现类似 a.IsDeleted = 1 功能
</summary>
</member>
<member name="M:FreeSql.DataAnnotations.TableFluent.DisableSyncStructure(System.Boolean)">
<summary>
禁用 CodeFirst 同步结构迁移
@ -241,11 +231,6 @@
指定数据库旧的表名修改实体命名时同时设置此参数为修改之前的值CodeFirst才可以正确修改数据库表否则将视为【创建新表】
</summary>
</member>
<member name="M:FreeSql.DataAnnotations.TableFluent`1.SelectFilter(System.String)">
<summary>
查询过滤SQL实现类似 a.IsDeleted = 1 功能
</summary>
</member>
<member name="M:FreeSql.DataAnnotations.TableFluent`1.DisableSyncStructure(System.Boolean)">
<summary>
禁用 CodeFirst 同步结构迁移
@ -669,6 +654,13 @@
<param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param>
<returns></returns>
</member>
<member name="M:FreeSql.IDelete`1.DisableGlobalFilter(System.String[])">
<summary>
禁用全局过滤功能,不传参数时将禁用所有
</summary>
<param name="name">零个或多个过滤器名字</param>
<returns></returns>
</member>
<member name="M:FreeSql.IDelete`1.AsTable(System.Func{System.String,System.String})">
<summary>
设置表名规则,可用于分库/分表参数1默认表名返回值新表名
@ -1025,6 +1017,13 @@
<param name="parms">参数</param>
<returns></returns>
</member>
<member name="M:FreeSql.ISelect0`2.DisableGlobalFilter(System.String[])">
<summary>
禁用全局过滤功能,不传参数时将禁用所有
</summary>
<param name="name">零个或多个过滤器名字</param>
<returns></returns>
</member>
<member name="M:FreeSql.ISelect0`2.GroupBy(System.String,System.Object)">
<summary>
按原生sql语法分组GroupBy("concat(name, ?cc)", new { cc = 1 })
@ -1763,6 +1762,13 @@
<param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param>
<returns></returns>
</member>
<member name="M:FreeSql.IUpdate`1.DisableGlobalFilter(System.String[])">
<summary>
禁用全局过滤功能,不传参数时将禁用所有
</summary>
<param name="name">零个或多个过滤器名字</param>
<returns></returns>
</member>
<member name="M:FreeSql.IUpdate`1.AsTable(System.Func{System.String,System.String})">
<summary>
设置表名规则,可用于分库/分表参数1默认表名返回值新表名
@ -2147,7 +2153,7 @@
</member>
<member name="P:FreeSql.IAop.AuditValue">
<summary>
Insert/Update自动值处理, e.Column.SetMapValue(
Insert/Update自动值处理
</summary>
</member>
<member name="P:FreeSql.Aop.ToListEventArgs.List">
@ -2495,6 +2501,15 @@
<param name="type"></param>
<returns>Dictkey=属性名value=注释</returns>
</member>
<member name="M:FreeSql.Internal.GlobalFilter.Apply``1(System.String,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}})">
<summary>
创建一个过滤器
</summary>
<typeparam name="TEntity"></typeparam>
<param name="name">名字</param>
<param name="where">表达式</param>
<returns></returns>
</member>
<member name="P:FreeSql.Internal.Model.TableRef.RefMiddleEntityType">
<summary>
中间表,多对多
@ -2797,5 +2812,10 @@
DbFirst 模式开发相关方法
</summary>
</member>
<member name="P:IFreeSql.GlobalFilter">
<summary>
全局过滤设置,可默认附加为 Select/Update/Delete 条件
</summary>
</member>
</members>
</doc>

View File

@ -62,6 +62,13 @@ namespace FreeSql
/// <returns></returns>
IDelete<T1> WhereDynamic(object dywhere);
/// <summary>
/// 禁用全局过滤功能,不传参数时将禁用所有
/// </summary>
/// <param name="name">零个或多个过滤器名字</param>
/// <returns></returns>
IDelete<T1> DisableGlobalFilter(params string[] name);
/// <summary>
/// 设置表名规则,可用于分库/分表参数1默认表名返回值新表名
/// </summary>

View File

@ -208,6 +208,13 @@ namespace FreeSql
/// <returns></returns>
TSelect WhereIf(bool condition, string sql, object parms = null);
/// <summary>
/// 禁用全局过滤功能,不传参数时将禁用所有
/// </summary>
/// <param name="name">零个或多个过滤器名字</param>
/// <returns></returns>
TSelect DisableGlobalFilter(params string[] name);
/// <summary>
/// 按原生sql语法分组GroupBy("concat(name, ?cc)", new { cc = 1 })
/// </summary>

View File

@ -131,6 +131,13 @@ namespace FreeSql
/// <returns></returns>
IUpdate<T1> WhereDynamic(object dywhere);
/// <summary>
/// 禁用全局过滤功能,不传参数时将禁用所有
/// </summary>
/// <param name="name">零个或多个过滤器名字</param>
/// <returns></returns>
IUpdate<T1> DisableGlobalFilter(params string[] name);
/// <summary>
/// 设置表名规则,可用于分库/分表参数1默认表名返回值新表名
/// </summary>

View File

@ -56,7 +56,7 @@ namespace FreeSql
EventHandler<Aop.SyncStructureAfterEventArgs> SyncStructureAfter { get; set; }
/// <summary>
/// Insert/Update自动值处理, e.Column.SetMapValue(
/// Insert/Update自动值处理
/// </summary>
EventHandler<Aop.AuditValueEventArgs> AuditValue { get; set; }
}

View File

@ -1,6 +1,8 @@
using FreeSql;
using FreeSql.Internal;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
public interface IFreeSql<TMark> : IFreeSql { }
@ -112,4 +114,9 @@ public interface IFreeSql : IDisposable
/// DbFirst 模式开发相关方法
/// </summary>
IDbFirst DbFirst { get; }
/// <summary>
/// 全局过滤设置,可默认附加为 Select/Update/Delete 条件
/// </summary>
GlobalFilter GlobalFilter { get; }
}

View File

@ -1205,10 +1205,14 @@ namespace FreeSql.Internal
var errorKey = FreeUtil.Sha1($"{tb.Table.Type.FullName},{fl.ToString()}");
if (_dicGetWhereCascadeSqlError.ContainsKey(errorKey)) continue;
var visitor = new NewExpressionVisitor(newParameter, fl.Parameters.FirstOrDefault());
var visitor = new ReplaceVisitor();
try
{
var expExp = visitor.Replace(fl.Body);
var expExp = Expression.Lambda(
typeof(Func<,>).MakeGenericType(tb.Table.Type, typeof(bool)),
new ReplaceVisitor().Modify(fl.Body, newParameter),
newParameter
);
var whereSql = ExpressionLambdaToSql(expExp, new ExpTSC { _tables = null, _selectColumnMap = null, getSelectGroupingMapString = null, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, currentTable = tb.Table, alias001 = tb.Alias });
if (isEmpty == false)
sb.Append(" AND ");
@ -1228,10 +1232,22 @@ namespace FreeSql.Internal
}
return null;
}
public string formatSql(object obj, Type mapType)
class ReplaceVisitor : ExpressionVisitor
{
return string.Concat(_ado.AddslashesProcessParam(obj, mapType));
private ParameterExpression parameter;
public Expression Modify(Expression expression, ParameterExpression parameter)
{
this.parameter = parameter;
return Visit(expression);
}
protected override Expression VisitMember(MemberExpression node)
{
if (node.Expression?.NodeType == ExpressionType.Parameter)
return Expression.Property(parameter, node.Member.Name);
return base.VisitMember(node);
}
}
public string formatSql(object obj, Type mapType) => string.Concat(_ado.AddslashesProcessParam(obj, mapType));
}
}

View File

@ -3,6 +3,7 @@ using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
@ -19,6 +20,7 @@ namespace FreeSql.Internal.CommonProvider
protected Func<string, string> _tableRule;
protected StringBuilder _where = new StringBuilder();
protected int _whereTimes = 0;
protected List<GlobalFilter.Item> _whereGlobalFilter;
protected List<DbParameter> _params = new List<DbParameter>();
protected DbTransaction _transaction;
protected DbConnection _connection;
@ -31,6 +33,7 @@ namespace FreeSql.Internal.CommonProvider
_table = _commonUtils.GetTableByEntity(typeof(T1));
this.Where(_commonUtils.WhereObject(_table, "", dywhere));
if (_orm.CodeFirst.IsAutoSyncStructure && typeof(T1) != typeof(object)) _orm.CodeFirst.SyncStructure<T1>();
_whereGlobalFilter = _orm.GlobalFilter.GetFilters();
}
protected void ClearData()
@ -38,6 +41,7 @@ namespace FreeSql.Internal.CommonProvider
_where.Clear();
_whereTimes = 0;
_params.Clear();
_whereGlobalFilter = _orm.GlobalFilter.GetFilters();
}
public IDelete<T1> WithTransaction(DbTransaction transaction)
@ -99,6 +103,24 @@ namespace FreeSql.Internal.CommonProvider
public IDelete<T1> WhereExists<TEntity2>(ISelect<TEntity2> select, bool notExists = false) where TEntity2 : class => this.Where($"{(notExists ? "NOT " : "")}EXISTS({select.ToSql("1")})");
public IDelete<T1> WhereDynamic(object dywhere) => this.Where(_commonUtils.WhereObject(_table, "", dywhere));
public IDelete<T1> DisableGlobalFilter(params string[] name)
{
if (_whereGlobalFilter.Any() == false) return this;
if (name?.Any() != true)
{
_whereGlobalFilter.Clear();
return this;
}
foreach (var n in name)
{
if (n == null) continue;
var idx = _whereGlobalFilter.FindIndex(a => string.Compare(a.Name, n, true) == 0);
if (idx == -1) continue;
_whereGlobalFilter.RemoveAt(idx);
}
return this;
}
protected string TableRuleInvoke()
{
if (_tableRule == null) return _table.DbName;
@ -123,6 +145,18 @@ namespace FreeSql.Internal.CommonProvider
return this;
}
public string ToSql() => _whereTimes <= 0 ? null : new StringBuilder().Append("DELETE FROM ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(" WHERE ").Append(_where).ToString();
public string ToSql()
{
if (_whereTimes <= 0) return null;
var sb = new StringBuilder().Append("DELETE FROM ").Append(_commonUtils.QuoteSqlName(TableRuleInvoke())).Append(" WHERE ").Append(_where);
if (_whereGlobalFilter.Any())
{
var globalFilterCondi = _commonExpression.GetWhereCascadeSql(new SelectTableInfo { Table = _table }, _whereGlobalFilter.Select(a => a.Where).ToList());
if (string.IsNullOrEmpty(globalFilterCondi) == false)
sb.Append(" AND ").Append(globalFilterCondi);
}
return sb.ToString();
}
}
}

View File

@ -35,6 +35,7 @@ namespace FreeSql.Internal.CommonProvider
protected bool _distinct;
protected Expression _selectExpression;
protected List<LambdaExpression> _whereCascadeExpression = new List<LambdaExpression>();
protected List<GlobalFilter.Item> _whereGlobalFilter;
bool _isDisponse = false;
~Select0Provider()
@ -50,6 +51,8 @@ namespace FreeSql.Internal.CommonProvider
_includeToList.Clear();
_selectExpression = null;
_whereCascadeExpression.Clear();
_whereGlobalFilter = _orm.GlobalFilter.GetFilters();
_whereCascadeExpression.AddRange(_whereGlobalFilter.Select(a => a.Where));
}
public static void CopyData(Select0Provider<TSelect, T1> from, object to, ReadOnlyCollection<ParameterExpression> lambParms)
{
@ -93,7 +96,8 @@ namespace FreeSql.Internal.CommonProvider
toType.GetField("_includeToList", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._includeToList);
toType.GetField("_distinct", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._distinct);
toType.GetField("_selectExpression", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._selectExpression);
toType.GetField("_whereMultiExpression", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._whereCascadeExpression);
toType.GetField("_whereCascadeExpression", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._whereCascadeExpression);
toType.GetField("_whereGlobalFilter", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._whereGlobalFilter);
}
public Select0Provider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere)
@ -884,6 +888,25 @@ namespace FreeSql.Internal.CommonProvider
if (parms != null) _params.AddRange(_commonUtils.GetDbParamtersByObject(sql, parms));
return this as TSelect;
}
public TSelect DisableGlobalFilter(params string[] name)
{
if (_whereGlobalFilter.Any() == false) return this as TSelect;
if (name?.Any() != true)
{
_whereCascadeExpression.RemoveRange(0, _whereGlobalFilter.Count);
_whereGlobalFilter.Clear();
return this as TSelect;
}
foreach (var n in name)
{
if (n == null) continue;
var idx = _whereGlobalFilter.FindIndex(a => string.Compare(a.Name, n, true) == 0);
if (idx == -1) continue;
_whereCascadeExpression.RemoveAt(idx);
_whereGlobalFilter.RemoveAt(idx);
}
return this as TSelect;
}
#region common
protected TMember InternalAvg<TMember>(Expression exp) => this.ToList<TMember>($"avg({_commonExpression.ExpressionSelectColumn_MemberAccess(_tables, null, SelectTableInfoType.From, exp, true, null)})").FirstOrDefault();

View File

@ -22,7 +22,8 @@ namespace FreeSql.Internal.CommonProvider
{
public Select1Provider(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression, object dywhere) : base(orm, commonUtils, commonExpression, dywhere)
{
_whereGlobalFilter = _orm.GlobalFilter.GetFilters();
_whereCascadeExpression.AddRange(_whereGlobalFilter.Select(a => a.Where));
}
protected ISelect<T1> InternalFrom(LambdaExpression lambdaExp)
@ -575,7 +576,7 @@ namespace FreeSql.Internal.CommonProvider
foreach (var item in list)
setListValue(item, null);
var subSelect = _orm.Select<TNavigate>().WithConnection(_connection).WithTransaction(_transaction).TrackToList(_trackToList) as Select1Provider<TNavigate>;
var subSelect = _orm.Select<TNavigate>().DisableGlobalFilter().WithConnection(_connection).WithTransaction(_transaction).TrackToList(_trackToList) as Select1Provider<TNavigate>;
if (_tableRules?.Any() == true)
foreach (var tr in _tableRules) subSelect.AsTable(tr);

View File

@ -23,6 +23,7 @@ namespace FreeSql.Internal.CommonProvider
protected TableInfo _table;
protected Func<string, string> _tableRule;
protected StringBuilder _where = new StringBuilder();
protected List<GlobalFilter.Item> _whereGlobalFilter;
protected StringBuilder _set = new StringBuilder();
protected StringBuilder _setIncr = new StringBuilder();
protected List<DbParameter> _params = new List<DbParameter>();
@ -41,6 +42,7 @@ namespace FreeSql.Internal.CommonProvider
this.Where(_commonUtils.WhereObject(_table, "", dywhere));
if (_orm.CodeFirst.IsAutoSyncStructure && typeof(T1) != typeof(object)) _orm.CodeFirst.SyncStructure<T1>();
IgnoreCanUpdate();
_whereGlobalFilter = _orm.GlobalFilter.GetFilters();
}
/// <summary>
@ -63,6 +65,7 @@ namespace FreeSql.Internal.CommonProvider
_params.Clear();
_paramsSource.Clear();
IgnoreCanUpdate();
_whereGlobalFilter = _orm.GlobalFilter.GetFilters();
}
public IUpdate<T1> WithTransaction(DbTransaction transaction)
@ -428,6 +431,24 @@ namespace FreeSql.Internal.CommonProvider
public IUpdate<T1> WhereExists<TEntity2>(ISelect<TEntity2> select, bool notExists = false) where TEntity2 : class => this.Where($"{(notExists ? "NOT " : "")}EXISTS({select.ToSql("1")})");
public IUpdate<T1> WhereDynamic(object dywhere) => this.Where(_commonUtils.WhereObject(_table, "", dywhere));
public IUpdate<T1> DisableGlobalFilter(params string[] name)
{
if (_whereGlobalFilter.Any() == false) return this;
if (name?.Any() != true)
{
_whereGlobalFilter.Clear();
return this;
}
foreach (var n in name)
{
if (n == null) continue;
var idx = _whereGlobalFilter.FindIndex(a => string.Compare(a.Name, n, true) == 0);
if (idx == -1) continue;
_whereGlobalFilter.RemoveAt(idx);
}
return this;
}
protected string WhereCaseSource(string CsName, Func<string, string> thenValue)
{
if (_source.Any() == false) return null;
@ -611,6 +632,13 @@ namespace FreeSql.Internal.CommonProvider
if (_where.Length > 0)
sb.Append(_source.Any() ? _where.ToString() : _where.ToString().Substring(5));
if (_whereGlobalFilter.Any())
{
var globalFilterCondi = _commonExpression.GetWhereCascadeSql(new SelectTableInfo { Table = _table }, _whereGlobalFilter.Select(a => a.Where).ToList());
if (string.IsNullOrEmpty(globalFilterCondi) == false)
sb.Append(" AND ").Append(globalFilterCondi);
}
if (_table.VersionColumn != null)
{
var versionCondi = WhereCaseSource(_table.VersionColumn.CsName, sqlval => sqlval);

View File

@ -85,7 +85,6 @@ namespace FreeSql.Internal
{
if (!string.IsNullOrEmpty(trytb.Name)) attr.Name = trytb.Name;
if (!string.IsNullOrEmpty(trytb.OldName)) attr.OldName = trytb.OldName;
if (!string.IsNullOrEmpty(trytb.SelectFilter)) attr.SelectFilter = trytb.SelectFilter;
if (trytb._DisableSyncStructure != null) attr._DisableSyncStructure = trytb.DisableSyncStructure;
}
var attrs = type.GetCustomAttributes(typeof(TableAttribute), false);
@ -95,12 +94,10 @@ namespace FreeSql.Internal
if (tryattr == null) continue;
if (!string.IsNullOrEmpty(tryattr.Name)) attr.Name = tryattr.Name;
if (!string.IsNullOrEmpty(tryattr.OldName)) attr.OldName = tryattr.OldName;
if (!string.IsNullOrEmpty(tryattr.SelectFilter)) attr.SelectFilter = tryattr.SelectFilter;
if (tryattr._DisableSyncStructure != null) attr._DisableSyncStructure = tryattr.DisableSyncStructure;
}
if (!string.IsNullOrEmpty(attr.Name)) return attr;
if (!string.IsNullOrEmpty(attr.OldName)) return attr;
if (!string.IsNullOrEmpty(attr.SelectFilter)) return attr;
if (attr._DisableSyncStructure != null) return attr;
return null;
}

View File

@ -0,0 +1,43 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
namespace FreeSql.Internal
{
public class GlobalFilter
{
ConcurrentDictionary<string, Item> _filters = new ConcurrentDictionary<string, Item>(StringComparer.CurrentCultureIgnoreCase);
int _id = 0;
public class Item
{
public int Id { get; internal set; }
public string Name { get; internal set; }
public LambdaExpression Where { get; internal set; }
}
/// <summary>
/// 创建一个过滤器
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="name">名字</param>
/// <param name="where">表达式</param>
/// <returns></returns>
public GlobalFilter Apply<TEntity>(string name, Expression<Func<TEntity, bool>> where)
{
if (name == null) throw new ArgumentNullException(nameof(name));
if (where == null) return this;
_filters.TryGetValue(name, out var item);
if (item == null) item = new Item { Id = ++_id, Name = name };
item.Where = where;
_filters.AddOrUpdate(name, item, (_, __) => item);
return this;
}
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();
}
}

View File

@ -21,7 +21,6 @@ namespace FreeSql.Internal.Model
public string CsName { get; set; }
public string DbName { get; set; }
public string DbOldName { get; set; }
public string SelectFilter { get; set; }
public bool DisableSyncStructure { get; set; }
public ColumnInfo VersionColumn { get; set; }

View File

@ -65,7 +65,6 @@ namespace FreeSql.Internal
trytb.DbName = trytb.DbName.ToUpper();
trytb.DbOldName = trytb.DbOldName?.ToUpper();
}
trytb.SelectFilter = tbattr?.SelectFilter;
if (tbattr != null) trytb.DisableSyncStructure = tbattr.DisableSyncStructure;
var propsLazy = new List<(PropertyInfo, bool, bool)>();
var propsNavObjs = new List<PropertyInfo>();

View File

@ -87,12 +87,6 @@ namespace FreeSql.MySql.Curd
if (!string.IsNullOrEmpty(_tables[0].Cascade))
sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")");
foreach (var tb in _tables)
{
if (tb.Type == SelectTableInfoType.Parent) continue;
if (string.IsNullOrEmpty(tb.Table.SelectFilter) == false)
sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")");
}
if (sbnav.Length > 0)
{
sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5));

View File

@ -69,9 +69,10 @@ namespace FreeSql.MySql
internal CommonExpression InternalCommonExpression { get; }
public void Transaction(Action handler) => Ado.Transaction(handler);
public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout);
public GlobalFilter GlobalFilter { get; } = new GlobalFilter();
~MySqlProvider()
{
this.Dispose();

View File

@ -101,12 +101,6 @@ namespace FreeSql.Odbc.Default
if (!string.IsNullOrEmpty(_tables[0].Cascade))
sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")");
foreach (var tb in _tables)
{
if (tb.Type == SelectTableInfoType.Parent) continue;
if (string.IsNullOrEmpty(tb.Table.SelectFilter) == false)
sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")");
}
if (sbnav.Length > 0)
{
sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5));

View File

@ -82,9 +82,10 @@ namespace FreeSql.Odbc.Default
internal CommonExpression InternalCommonExpression { get; }
public void Transaction(Action handler) => Ado.Transaction(handler);
public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout);
public GlobalFilter GlobalFilter { get; } = new GlobalFilter();
~OdbcProvider()
{
this.Dispose();

View File

@ -87,12 +87,6 @@ namespace FreeSql.Odbc.MySql
if (!string.IsNullOrEmpty(_tables[0].Cascade))
sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")");
foreach (var tb in _tables)
{
if (tb.Type == SelectTableInfoType.Parent) continue;
if (string.IsNullOrEmpty(tb.Table.SelectFilter) == false)
sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")");
}
if (sbnav.Length > 0)
{
sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5));

View File

@ -47,9 +47,10 @@ namespace FreeSql.Odbc.MySql
internal CommonExpression InternalCommonExpression { get; }
public void Transaction(Action handler) => Ado.Transaction(handler);
public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout);
public GlobalFilter GlobalFilter { get; } = new GlobalFilter();
~OdbcMySqlProvider()
{
this.Dispose();

View File

@ -89,12 +89,6 @@ namespace FreeSql.Odbc.Oracle
if (!string.IsNullOrEmpty(_tables[0].Cascade))
sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")");
foreach (var tb in _tables)
{
if (tb.Type == SelectTableInfoType.Parent) continue;
if (string.IsNullOrEmpty(tb.Table.SelectFilter) == false)
sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")");
}
if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0))
sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1);
if (sbnav.Length > 0)

View File

@ -48,9 +48,10 @@ namespace FreeSql.Odbc.Oracle
internal CommonExpression InternalCommonExpression { get; }
public void Transaction(Action handler) => Ado.Transaction(handler);
public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout);
public GlobalFilter GlobalFilter { get; } = new GlobalFilter();
~OdbcOracleProvider()
{
this.Dispose();

View File

@ -87,12 +87,6 @@ namespace FreeSql.Odbc.PostgreSQL
if (!string.IsNullOrEmpty(_tables[0].Cascade))
sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")");
foreach (var tb in _tables)
{
if (tb.Type == SelectTableInfoType.Parent) continue;
if (string.IsNullOrEmpty(tb.Table.SelectFilter) == false)
sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")");
}
if (sbnav.Length > 0)
{
sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5));

View File

@ -45,9 +45,10 @@ namespace FreeSql.Odbc.PostgreSQL
internal CommonExpression InternalCommonExpression { get; }
public void Transaction(Action handler) => Ado.Transaction(handler);
public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout);
public GlobalFilter GlobalFilter { get; } = new GlobalFilter();
~OdbcPostgreSQLProvider()
{
this.Dispose();

View File

@ -105,12 +105,6 @@ namespace FreeSql.Odbc.SqlServer
if (!string.IsNullOrEmpty(_tables[0].Cascade))
sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")");
foreach (var tb in _tables)
{
if (tb.Type == SelectTableInfoType.Parent) continue;
if (string.IsNullOrEmpty(tb.Table.SelectFilter) == false)
sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")");
}
if (sbnav.Length > 0)
{
sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5));
@ -211,12 +205,6 @@ namespace FreeSql.Odbc.SqlServer
if (!string.IsNullOrEmpty(_tables[0].Cascade))
sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")");
foreach (var tb in _tables)
{
if (tb.Type == SelectTableInfoType.Parent) continue;
if (string.IsNullOrEmpty(tb.Table.SelectFilter) == false)
sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")");
}
if (sbnav.Length > 0)
{
sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5));

View File

@ -53,9 +53,10 @@ namespace FreeSql.Odbc.SqlServer
internal CommonExpression InternalCommonExpression { get; }
public void Transaction(Action handler) => Ado.Transaction(handler);
public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout);
public GlobalFilter GlobalFilter { get; } = new GlobalFilter();
~OdbcSqlServerProvider()
{
this.Dispose();

View File

@ -89,12 +89,6 @@ namespace FreeSql.Oracle.Curd
if (!string.IsNullOrEmpty(_tables[0].Cascade))
sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")");
foreach (var tb in _tables)
{
if (tb.Type == SelectTableInfoType.Parent) continue;
if (string.IsNullOrEmpty(tb.Table.SelectFilter) == false)
sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")");
}
if (string.IsNullOrEmpty(_orderby) && (_skip > 0 || _limit > 0))
sbnav.Append(" AND ROWNUM < ").Append(_skip + _limit + 1);
if (sbnav.Length > 0)

View File

@ -43,9 +43,10 @@ namespace FreeSql.Oracle
internal CommonExpression InternalCommonExpression { get; }
public void Transaction(Action handler) => Ado.Transaction(handler);
public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout);
public GlobalFilter GlobalFilter { get; } = new GlobalFilter();
~OracleProvider()
{
this.Dispose();

View File

@ -87,12 +87,6 @@ namespace FreeSql.PostgreSQL.Curd
if (!string.IsNullOrEmpty(_tables[0].Cascade))
sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")");
foreach (var tb in _tables)
{
if (tb.Type == SelectTableInfoType.Parent) continue;
if (string.IsNullOrEmpty(tb.Table.SelectFilter) == false)
sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")");
}
if (sbnav.Length > 0)
{
sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5));

View File

@ -96,9 +96,10 @@ namespace FreeSql.PostgreSQL
internal CommonExpression InternalCommonExpression { get; }
public void Transaction(Action handler) => Ado.Transaction(handler);
public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout);
public GlobalFilter GlobalFilter { get; } = new GlobalFilter();
~PostgreSQLProvider()
{
this.Dispose();

View File

@ -105,12 +105,6 @@ namespace FreeSql.SqlServer.Curd
if (!string.IsNullOrEmpty(_tables[0].Cascade))
sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")");
foreach (var tb in _tables)
{
if (tb.Type == SelectTableInfoType.Parent) continue;
if (string.IsNullOrEmpty(tb.Table.SelectFilter) == false)
sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")");
}
if (sbnav.Length > 0)
{
sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5));
@ -211,12 +205,6 @@ namespace FreeSql.SqlServer.Curd
if (!string.IsNullOrEmpty(_tables[0].Cascade))
sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")");
foreach (var tb in _tables)
{
if (tb.Type == SelectTableInfoType.Parent) continue;
if (string.IsNullOrEmpty(tb.Table.SelectFilter) == false)
sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")");
}
if (sbnav.Length > 0)
{
sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5));

View File

@ -54,9 +54,10 @@ namespace FreeSql.SqlServer
internal CommonExpression InternalCommonExpression { get; }
public void Transaction(Action handler) => Ado.Transaction(handler);
public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout);
public GlobalFilter GlobalFilter { get; } = new GlobalFilter();
~SqlServerProvider()
{
this.Dispose();

View File

@ -87,12 +87,6 @@ namespace FreeSql.Sqlite.Curd
if (!string.IsNullOrEmpty(_tables[0].Cascade))
sbnav.Append(" AND (").Append(_tables[0].Cascade).Append(")");
foreach (var tb in _tables)
{
if (tb.Type == SelectTableInfoType.Parent) continue;
if (string.IsNullOrEmpty(tb.Table.SelectFilter) == false)
sbnav.Append(" AND (").Append(tb.Table.SelectFilter.Replace("a.", $"{tb.Alias}.")).Append(")");
}
if (sbnav.Length > 0)
{
sb.Append(" \r\nWHERE ").Append(sbnav.Remove(0, 5));

View File

@ -42,9 +42,10 @@ namespace FreeSql.Sqlite
internal CommonExpression InternalCommonExpression { get; }
public void Transaction(Action handler) => Ado.Transaction(handler);
public void Transaction(Action handler, TimeSpan timeout) => Ado.Transaction(handler, timeout);
public GlobalFilter GlobalFilter { get; } = new GlobalFilter();
~SqliteProvider()
{
this.Dispose();