|
|
@ -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<T>(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<Func<T, bool>> CreateLambda<T>(FilterCondition filterCondition) |
|
|
@ -83,33 +87,43 @@ namespace Win.Sfs.Shared.Filter |
|
|
|
case EnumFilterAction.Equal: |
|
|
|
expression = Expression.Lambda<Func<T, bool>>(Expression.Equal(member, constant), parameter); |
|
|
|
break; |
|
|
|
|
|
|
|
case EnumFilterAction.NotEqual: |
|
|
|
expression = Expression.Lambda<Func<T, bool>>(Expression.NotEqual(member, constant), parameter); |
|
|
|
break; |
|
|
|
|
|
|
|
case EnumFilterAction.BiggerThan: |
|
|
|
expression = Expression.Lambda<Func<T, bool>>(Expression.GreaterThan(member, constant), parameter); |
|
|
|
break; |
|
|
|
|
|
|
|
case EnumFilterAction.SmallThan: |
|
|
|
expression = Expression.Lambda<Func<T, bool>>(Expression.LessThan(member, constant), parameter); |
|
|
|
break; |
|
|
|
|
|
|
|
case EnumFilterAction.BiggerThanOrEqual: |
|
|
|
expression = Expression.Lambda<Func<T, bool>>(Expression.GreaterThanOrEqual(member, constant), parameter); |
|
|
|
break; |
|
|
|
|
|
|
|
case EnumFilterAction.SmallThanOrEqual: |
|
|
|
expression = Expression.Lambda<Func<T, bool>>(Expression.LessThanOrEqual(member, constant), parameter); |
|
|
|
break; |
|
|
|
|
|
|
|
case EnumFilterAction.Like: |
|
|
|
expression = GetExpressionLikeMethod<T>("Contains", filterCondition); |
|
|
|
break; |
|
|
|
|
|
|
|
case EnumFilterAction.NotLike: |
|
|
|
expression = GetExpressionNotLikeMethod<T>("Contains", filterCondition); |
|
|
|
break; |
|
|
|
|
|
|
|
case EnumFilterAction.In: |
|
|
|
expression = GetExpressionInMethod<T>("Contains", member.Type, filterCondition); |
|
|
|
break; |
|
|
|
|
|
|
|
case EnumFilterAction.NotIn: |
|
|
|
expression = GetExpressionNotInMethod<T>("Contains", member.Type, filterCondition); |
|
|
|
break; |
|
|
|
|
|
|
|
default: |
|
|
|
break; |
|
|
|
} |
|
|
@ -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<Func<T, bool>>(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); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 生成类似于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<Func<T, bool>>(Expression.And(exp.Body, inv), exp.Parameters); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |