/// <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);
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
    /// <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]);
            }