diff --git a/code/src/Shared/Win.Sfs.Shared/Filter/FilterExtensions.cs b/code/src/Shared/Win.Sfs.Shared/Filter/FilterExtensions.cs index fec46083..51f5fdfa 100644 --- a/code/src/Shared/Win.Sfs.Shared/Filter/FilterExtensions.cs +++ b/code/src/Shared/Win.Sfs.Shared/Filter/FilterExtensions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; @@ -38,6 +38,10 @@ namespace Win.Sfs.Shared.Filter foreach (var filterCondition in filterConditionList) { + if (!typeof(T).GetProperties().Any(o => o.Name.ToLowerInvariant() == filterCondition.Column.ToLowerInvariant())) + { + break; + } var tempCondition = CreateLambda(filterCondition); if (condition == null) { @@ -59,7 +63,7 @@ namespace Win.Sfs.Shared.Filter throw new Exception($"获取筛选条件异常:{ex.Message}"); } - return condition; + return condition == null ? p => true : condition; } private static Expression> CreateLambda(FilterCondition filterCondition) @@ -83,33 +87,43 @@ namespace Win.Sfs.Shared.Filter case EnumFilterAction.Equal: expression = Expression.Lambda>(Expression.Equal(member, constant), parameter); break; + case EnumFilterAction.NotEqual: expression = Expression.Lambda>(Expression.NotEqual(member, constant), parameter); break; + case EnumFilterAction.BiggerThan: expression = Expression.Lambda>(Expression.GreaterThan(member, constant), parameter); break; + case EnumFilterAction.SmallThan: expression = Expression.Lambda>(Expression.LessThan(member, constant), parameter); break; + case EnumFilterAction.BiggerThanOrEqual: expression = Expression.Lambda>(Expression.GreaterThanOrEqual(member, constant), parameter); break; + case EnumFilterAction.SmallThanOrEqual: expression = Expression.Lambda>(Expression.LessThanOrEqual(member, constant), parameter); break; + case EnumFilterAction.Like: expression = GetExpressionLikeMethod("Contains", filterCondition); break; + case EnumFilterAction.NotLike: expression = GetExpressionNotLikeMethod("Contains", filterCondition); break; + case EnumFilterAction.In: expression = GetExpressionInMethod("Contains", member.Type, filterCondition); break; + case EnumFilterAction.NotIn: expression = GetExpressionNotInMethod("Contains", member.Type, filterCondition); break; + default: break; } @@ -123,7 +137,7 @@ namespace Win.Sfs.Shared.Filter } /// - /// + /// /// /// /// @@ -144,7 +158,6 @@ namespace Win.Sfs.Shared.Filter var enumValue = (Enum)Enum.Parse(propertyType, value, true); constant = Expression.Constant(enumValue); } - else { constant = propertyType.Name switch @@ -182,7 +195,6 @@ namespace Win.Sfs.Shared.Filter return Expression.Lambda>(notMethodExpression, parameterExpression); } - private static object GetPropertyValue(Type propertyType, string value) { Type lstType = typeof(List<>).MakeGenericType(propertyType); @@ -211,7 +223,7 @@ namespace Win.Sfs.Shared.Filter } else { - return p=>false; + return p => false; } } @@ -232,7 +244,6 @@ namespace Win.Sfs.Shared.Filter } } - private static MethodCallExpression GetListMethodExpression(string methodName, Type propertyType, string propertyName, object propertyValue, ParameterExpression parameterExpression) { var propertyExpression = Expression.Property(parameterExpression, propertyName); //p.GUID @@ -242,7 +253,6 @@ namespace Win.Sfs.Shared.Filter return Expression.Call(someValue, method, propertyExpression); } - /// /// 生成类似于p=>p.Code.Contains("xxx");的lambda表达式 /// parameterExpression标识p,propertyName表示values,propertyValue表示"Code",methodName表示Contains @@ -309,6 +319,5 @@ namespace Win.Sfs.Shared.Filter var inv = Expression.Invoke(condition, exp.Parameters); return Expression.Lambda>(Expression.And(exp.Body, inv), exp.Parameters); } - } -} \ No newline at end of file +}