/// <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)"); }
/// <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)); } }