Ejemplo n.º 1
0
        /// <summary>
        /// 生成表达式
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="parameter">参数表达式</param>
        /// <param name="member">成员表达式</param>
        /// <param name="value">属性值</param>
        /// <param name="operator">操作符</param>
        /// <exception cref="ArgumentNullException"></exception>
        /// <exception cref="NotSupportedException"></exception>
        /// <returns></returns>
        public static Expression <Func <T, bool> > Create <T>(ParameterExpression parameter, MemberExpression member, object value, SQLOperator @operator)
        {
            if (parameter is null)
            {
                throw new ArgumentNullException(nameof(parameter));
            }

            if (member is null)
            {
                throw new ArgumentNullException(nameof(member));
            }

            switch (@operator)
            {
            case SQLOperator.Contains:
            case SQLOperator.EndWith:
            case SQLOperator.StartsWith:
                if (value != null && value.GetType() != typeof(string))
                {
                    throw new NotSupportedException($"{nameof(SQLOperator)}.{@operator}只适用于string类型");
                }

                var method = typeof(string).GetMethod(@operator.ToString(), new[] { typeof(string) });
                var body   = Expression.Call(member, method, ConstantExpression(value, typeof(string)));
                return(Expression.Lambda(body, parameter) as Expression <Func <T, bool> >);

            default:
                var valueExp   = ConstantExpression(value, member.Type);
                var binaryBody = Expression.MakeBinary((ExpressionType)@operator, member, valueExp);
                return(Expression.Lambda(binaryBody, parameter) as Expression <Func <T, bool> >);
            }
        }