From e5d0b6a6a618ff525631c5d22a79aacaf86f860e Mon Sep 17 00:00:00 2001 From: skx <610262374@qq.com> Date: Fri, 29 Jan 2021 23:14:26 +0800 Subject: [PATCH] Add table filter --- .../SqlBuilderProvider/QueryBuilder.cs | 36 ++++++++++++++++--- Src/Asp.Net/SqlSugar/Entities/SqlFilter.cs | 20 +++++++++++ 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs index 6757cbf97..9c8d6bb8a 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs @@ -4,6 +4,7 @@ using System.Data.SqlClient; using System.Dynamic; using System.Linq; using System.Linq.Expressions; +using System.Reflection; using System.Text; using System.Text.RegularExpressions; @@ -296,17 +297,42 @@ namespace SqlSugar var gobalFilterList = this.Context.QueryFilter.GeFilterList.Where(it => it.FilterName.IsNullOrEmpty()).ToList(); foreach (var item in gobalFilterList.Where(it => it.IsJoinQuery == !IsSingle())) { - var filterResult = item.FilterValue(this.Context); - WhereInfos.Add(this.Builder.AppendWhereOrAnd(this.WhereInfos.IsNullOrEmpty(), filterResult.Sql + UtilConstants.Space)); - var filterParamters = this.Context.Ado.GetParameters(filterResult.Parameters); - if (filterParamters.HasValue()) + if (item.GetType().Name.StartsWith("TableFilterItem")) { - this.Parameters.AddRange(filterParamters); + AppendTableFilter(item); + } + else + { + var filterResult = item.FilterValue(this.Context); + WhereInfos.Add(this.Builder.AppendWhereOrAnd(this.WhereInfos.IsNullOrEmpty(), filterResult.Sql + UtilConstants.Space)); + var filterParamters = this.Context.Ado.GetParameters(filterResult.Parameters); + if (filterParamters.HasValue()) + { + this.Parameters.AddRange(filterParamters); + } } } } } + private void AppendTableFilter(SqlFilterItem item) + { + BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic; + Type type = item.GetType(); + PropertyInfo field = type.GetProperty("exp", flag); + Type ChildType = type.GetProperty("type", flag).GetValue(item,null) as Type; + var exp=field.GetValue(item,null) as Expression; + var isMain = ChildType == this.EntityType; + var isSingle = IsSingle(); + var expValue = GetExpressionValue(exp, isSingle ? ResolveExpressType.WhereSingle : ResolveExpressType.WhereMultiple); + var sql = expValue.GetResultString(); + if (!isSingle) + { + + } + WhereInfos.Add(sql); + } + public virtual string GetExternalOrderBy(string externalOrderBy) { return Regex.Replace(externalOrderBy, @"\[\w+\]\.", ""); diff --git a/Src/Asp.Net/SqlSugar/Entities/SqlFilter.cs b/Src/Asp.Net/SqlSugar/Entities/SqlFilter.cs index d650ac145..0cc906be9 100644 --- a/Src/Asp.Net/SqlSugar/Entities/SqlFilter.cs +++ b/Src/Asp.Net/SqlSugar/Entities/SqlFilter.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Linq.Expressions; using System.Text; namespace SqlSugar @@ -18,6 +19,25 @@ namespace SqlSugar public bool IsJoinQuery { get; set; } } + public class TableFilterItem: SqlFilterItem where T :class,new() + { + private TableFilterItem() + { + + } + private Expression exp { get; set; } + private Type type { get; set; } + public TableFilterItem(Expression> expression) + { + exp = expression; + type = typeof(T); + } + private new string FilterName { get; set; } + private new Func FilterValue { get; set; } + private new bool IsJoinQuery { get; set; } + } + + public class SqlFilterResult { public string Sql { get; set; }