/// <summary> /// Парсинг параметра поиска по тексту /// </summary> private static string ParseTextParam(ArticleSearchQueryParam p, ICollection <DbParameter> sqlParams) { Ensure.NotNull(p); Ensure.That(p.SearchType == ArticleFieldSearchType.Text || p.SearchType == ArticleFieldSearchType.StringEnum); if (string.IsNullOrWhiteSpace(p.FieldColumn)) { throw new ArgumentException("FieldColumn is empty"); } // параметры не пустые и их не меньше 2х (используем 1, 2, опциоально - 3) if (p.QueryParams == null) { throw new ArgumentException("QueryParams is null"); } if (p.QueryParams.Length < 2) { throw new ArgumentException("QueryParams length < 2"); } // первый параметр должен быть bool if (!(p.QueryParams[0] is bool)) { throw new InvalidCastException("param 0"); } // второй параметр должен быть строкой или null if (p.QueryParams[1] != null && !(p.QueryParams[1] is string)) { throw new InvalidCastException("param 1"); } var dbType = QPContext.DatabaseType; var fieldId = p.FieldId ?? string.Empty; var paramName = "@field" + fieldId.Replace("-", "_"); var escapedFieldColumnName = SqlQuerySyntaxHelper.EscapeEntityName(dbType, p.FieldColumn.ToLower()); var isNull = (bool)p.QueryParams[0]; var inverse = p.QueryParams.Length > 2 && p.QueryParams[2] is bool && (bool)p.QueryParams[2]; var exactMatch = p.QueryParams.Length > 3 && p.QueryParams[3] is bool && (bool)p.QueryParams[3]; var startFromBegin = p.QueryParams.Length > 4 && p.QueryParams[4] is bool && (bool)p.QueryParams[4]; var listTexts = (p.QueryParams.Length > 5 && p.QueryParams[5] is object[]) ? (object[])p.QueryParams[5] : Array.Empty <object>(); if (listTexts.Length > 0) { sqlParams.Add(SqlQuerySyntaxHelper.GetStringsDatatableParam( paramName, listTexts.Select(n => n.ToString()?.Trim()), dbType) ); return(string.Format(inverse ? "({1}.{0} NOT IN (select value from {2}) OR {1}.{0} IS NULL)" : "({1}.{0} IN (select value from {2}))", escapedFieldColumnName, GetTableAlias(p), SqlQuerySyntaxHelper.StrList(dbType, paramName, "v"))); } // isnull == true if (isNull) { return($"({GetTableAlias(p)}.{escapedFieldColumnName} IS {(inverse ? "NOT " : "")}NULL)"); } // isnull == false строка пустая if (string.IsNullOrEmpty((string)p.QueryParams[1])) { return(null); } // Иначе формируем результат var value = exactMatch ? Cleaner.ToSafeSqlString(((string)p.QueryParams[1]).Trim()) : Cleaner.ToSafeSqlLikeCondition(dbType, ((string)p.QueryParams[1]).Trim()); if (exactMatch) { return($"({GetTableAlias(p)}.{escapedFieldColumnName} {(inverse ? "<> " : "=")} '{value}')"); } var like = dbType == DatabaseType.Postgres ? "ILIKE" : "LIKE"; return(startFromBegin ? $"({GetTableAlias(p)}.{escapedFieldColumnName} {like} '{(inverse ? "%" + value : value + "%")}')" : $"({GetTableAlias(p)}.{escapedFieldColumnName} {(inverse ? "NOT " : "")}{like} '%{value}%')"); }