Example #1
0
        /// <summary>
        /// 包含字符串的表达式 “IsNullOrEmpty | IsNullOrWhiteSpace”.
        /// </summary>
        /// <param name="expression">表达式.</param>
        /// <returns>结果.</returns>
        protected virtual object VisitIsNullExpression(MethodCallExpression expression)
        {
            object column = null;

            if (expression.Object != null)
            {
                column = VisitExpression(expression.Object);
            }
            else
            {
                column = new BaseExpressionVisitor().Visit(expression.Arguments[0]);
            }

            object value = null;

            if (expression.Arguments.Count > 0)
            {
                value = VisitExpression(expression.Arguments[0]);
            }
            return($"({value} IS NULL OR {value} = '' OR LEN({value}) <= 0)");
        }
Example #2
0
        /// <summary>
        /// 包含字符串的表达式 “ToSting ”.
        /// </summary>
        /// <param name="expression">表达式.</param>
        /// <param name="textSearch">类型.</param>
        /// <returns>结果.</returns>
        protected virtual object VisitTostingExpression(MethodCallExpression expression, TextSearch textSearch)
        {
            //column()
            object column = null;

            if (expression.Object != null)
            {
                column = VisitExpression(expression.Object);
            }
            else
            {
                column = new BaseExpressionVisitor().Visit(expression.Arguments[0]);
            }

            //(value)
            object value = null;

            if (expression.Arguments.Count > 0)
            {
                value = VisitExpression(expression.Arguments[0]);
            }
            var textSQL = string.Empty;

            switch (textSearch)
            {
            case TextSearch.ToString:
                if (value != null)
                {
                    //.ToString("yyyy") | .ToString("yyyyMMdd") ...
                    if (typeof(TEntity).GetField(value.ToString()) == null && typeof(TEntity).GetProperty(value.ToString()) == null)
                    {
                        switch (value.ToString())
                        {
                        case "yyyy":
                            textSQL = $"CONVERT(VARCHAR(4), {column} , 23)";         //2020
                            break;

                        case "MM-dd":
                            textSQL = $"CONVERT(VARCHAR(5), {column} , 10)";         //05-08
                            break;

                        case "yyyMMdd":
                            textSQL = $"CONVERT(VARCHAR(100), {column} , 112)";         //20200508
                            break;

                        case "yyyy-MM-dd":
                            textSQL = $"CONVERT(VARCHAR(100), {column} , 23)";         //2020-05-08
                            break;

                        case "yyyy-MM-dd hh:mm:ss":
                            textSQL = $"CONVERT(VARCHAR(100), {column} , 20)";         //2020-05-08 12:20:22
                            break;

                        case "MMdd":
                            textSQL = $"SUBSTRING(CONVERT(VARCHAR(100), {column} , 112),5,10 - 5)";         //0508
                            break;

                        default:
                            throw new Exception("时间格式错误或暂不支持。");
                        }
                    }
                }
                else if (column != null)
                {
                    //.ToString()
                    if (typeof(TEntity).GetField(column.ToString()) != null || typeof(TEntity).GetProperty(column.ToString()) != null)
                    {
                        //列名
                        textSQL = $"CAST({column} AS VARCHAR(MAX))";
                    }
                    else if (typeof(TEntity).GetField(column.ToString()) == null && typeof(TEntity).GetProperty(column.ToString()) == null)
                    {
                        //非列名
                        textSQL = $"CAST('{column}' AS VARCHAR(MAX))";
                    }
                }
                else
                {
                    throw new Exception("“ToString”解析失败。");
                }
                return(textSQL);

            case TextSearch.Trim:
                if (typeof(TEntity).GetField(column.ToString()) != null || typeof(TEntity).GetProperty(column.ToString()) != null)
                {
                    textSQL = $"LTRIM(RTRIM({column}))";
                }
                else
                {
                    textSQL = $"LTRIM(RTRIM('{column}'))";
                }

                return(textSQL);

            case TextSearch.ToDateTime:
                if (value != null)
                {
                    if (typeof(TEntity).GetField(value.ToString()) != null ||
                        typeof(TEntity).GetProperty(value.ToString()) != null)
                    {
                        textSQL = $"CAST({value} AS DATETIME)";
                    }
                }

                return(textSQL);

            default:
                throw new ArgumentOutOfRangeException($"Invalid TextSearch value '{textSearch}'.", nameof(textSearch));
            }
        }