/// <summary> /// 指定 FilterKeyValueAction 获取 Lambda 表达式 /// </summary> /// <typeparam name="TItem"></typeparam> /// <param name="filter"></param> /// <returns></returns> public static Expression <Func <TItem, bool> > GetFilterLambda <TItem>(this FilterKeyValueAction filter) { Expression <Func <TItem, bool> > ret = t => true; if (!string.IsNullOrEmpty(filter.FieldKey) && filter.FieldValue != null) { var prop = typeof(TItem).GetProperty(filter.FieldKey); if (prop != null) { var p = Expression.Parameter(typeof(TItem)); var fieldExpression = Expression.Property(p, prop); Expression eq = fieldExpression; // 可为空类型转化为具体类型 if (prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable <>)) { eq = Expression.Convert(fieldExpression, prop.PropertyType.GenericTypeArguments[0]); } eq = filter.GetExpression(eq); ret = Expression.Lambda <Func <TItem, bool> >(eq, p); } } return(ret); }
/// <summary> /// 指定 FilterKeyValueAction 获取 Lambda 表达式 /// </summary> /// <typeparam name="TItem"></typeparam> /// <param name="filter"></param> /// <returns></returns> public static Expression <Func <TItem, bool> > GetFilterLambda <TItem>(this FilterKeyValueAction filter) { Expression <Func <TItem, bool> > ret = t => true; if (!string.IsNullOrEmpty(filter.FieldKey) && filter.FieldValue != null) { var prop = typeof(TItem).GetProperty(filter.FieldKey); if (prop != null) { var p = Expression.Parameter(typeof(TItem)); var fieldExpression = Expression.Property(p, prop); // 可为空类型转化为具体类型 var eq = filter.GetExpression(Expression.Convert(fieldExpression, filter.FieldValue.GetType())); ret = Expression.Lambda <Func <TItem, bool> >(eq, p); } } return(ret); }
/// <summary> /// 指定 FilterKeyValueAction 获取 Lambda 表达式 /// </summary> /// <typeparam name="TItem"></typeparam> /// <param name="filter"></param> /// <returns></returns> public static Expression <Func <TItem, bool> > GetFilterLambda <TItem>(this FilterKeyValueAction filter) { Expression <Func <TItem, bool> > ret = t => true; var type = typeof(TItem); if (!string.IsNullOrEmpty(filter.FieldKey) && filter.FieldValue != null) { ret = filter.FieldKey.Contains(".") ? GetComplexFilterExpression() : GetSimpleFilterExpression(); } return(ret); Expression <Func <TItem, bool> > GetSimpleFilterExpression() { var prop = typeof(TItem).GetPropertyByName(filter.FieldKey) ?? throw new InvalidOperationException($"the model {type.Name} not found the property {filter.FieldKey}");; if (prop != null) { var p = Expression.Parameter(type); var fieldExpression = Expression.Property(p, prop); Expression eq = fieldExpression; // 可为空类型转化为具体类型 if (prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable <>)) { eq = Expression.Convert(fieldExpression, prop.PropertyType.GenericTypeArguments[0]); } else if (prop.PropertyType.IsEnum && filter.FieldValue is string) { eq = Expression.Call(fieldExpression, prop.PropertyType.GetMethod("ToString", Array.Empty <Type>()) !); } eq = filter.GetExpression(eq); ret = Expression.Lambda <Func <TItem, bool> >(eq, p); } return(ret); } Expression <Func <TItem, bool> > GetComplexFilterExpression() { var p = Expression.Parameter(type); var propertyNames = filter.FieldKey.Split('.'); PropertyInfo?pInfo = null; Expression? fieldExpression = null; foreach (var name in propertyNames) { if (pInfo == null) { pInfo = typeof(TItem).GetPropertyByName(name) ?? throw new InvalidOperationException($"the model {type.Name} not found the property {name}"); fieldExpression = Expression.Property(p, pInfo); } else { pInfo = pInfo.PropertyType.GetPropertyByName(name) ?? throw new InvalidOperationException($"the model {pInfo.PropertyType.Name} not found the property {name}"); fieldExpression = Expression.Property(fieldExpression, pInfo); } } // 可为空类型转化为具体类型 if (pInfo !.PropertyType.IsGenericType && pInfo.PropertyType.GetGenericTypeDefinition() == typeof(Nullable <>)) { fieldExpression = Expression.Convert(fieldExpression !, pInfo.PropertyType.GenericTypeArguments[0]); }