private static string ParseIdentifierParam(ArticleSearchQueryParam p, ICollection <DbParameter> sqlParams) { Ensure.NotNull(p); Ensure.That(p.SearchType == ArticleFieldSearchType.Identifier); if (string.IsNullOrWhiteSpace(p.FieldColumn)) { throw new ArgumentException("FieldColumn"); } // параметры не пустые и их не меньше 4х (используем 1й, 2й, 3й и 4й - остальные отбрасываем) if (p.QueryParams == null || p.QueryParams.Length < 4) { throw new ArgumentException(); } // первый параметр должен быть bool if (!(p.QueryParams[0] is bool)) { throw new InvalidCastException(); } // второй параметр должен быть int или long или null if (p.QueryParams[1] != null && !(p.QueryParams[1] is int || p.QueryParams[1] is long)) { throw new InvalidCastException(); } // третий параметр должен быть int или long или null if (p.QueryParams[2] != null && !(p.QueryParams[2] is int || p.QueryParams[2] is long)) { throw new InvalidCastException(); } // четвертый параметр должен быть bool if (!(p.QueryParams[3] is bool)) { throw new InvalidCastException(); } // пятый параметр должен быть null или object[] if (p.QueryParams[4] != null && !(p.QueryParams[4] is object[])) { throw new InvalidCastException(); } // шестой параметр должен быть bool if (!(p.QueryParams[5] is bool)) { throw new InvalidCastException(); } var inverse = (bool)p.QueryParams[0]; var isByValue = (bool)p.QueryParams[3]; var isByText = (bool)p.QueryParams[5]; var dbType = QPContext.DatabaseType; var escapedFieldColumnName = SqlQuerySyntaxHelper.EscapeEntityName(dbType, p.FieldColumn.ToLower()); if (isByText) { // Если массив null или пустой - то возвращаем null if (p.QueryParams[4] == null || ((object[])p.QueryParams[4]).Length == 0) { return(null); } var fieldId = p.FieldId ?? string.Empty; var paramName = "@field" + fieldId.Replace("-", "_"); var values = ((object[])p.QueryParams[4]).Select(n => n.ToString()?.Trim()) .Where(n => !String.IsNullOrEmpty(n)).Select(int.Parse).ToArray(); if (values.Length == 1) { sqlParams.Add(SqlQuerySyntaxHelper.CreateDbParameter(dbType, paramName, values[0])); return(string.Format(inverse ? "({1}.{0} <> {2} OR {1}.{0} IS NULL)" : "({1}.{0} = {2})", escapedFieldColumnName, GetTableAlias(p), paramName)); } sqlParams.Add(SqlQuerySyntaxHelper.GetIdsDatatableParam(paramName, values, dbType)); return(string.Format(inverse ? "({1}.{0} NOT IN (select id from {2}) OR {1}.{0} IS NULL)" : "({1}.{0} IN (select id from {2}))", escapedFieldColumnName, GetTableAlias(p), SqlQuerySyntaxHelper.IdList(dbType, paramName, "i"))); } // ReSharper disable MergeSequentialChecks var numberFrom = p.QueryParams[1] is int || p.QueryParams[1] == null ? (int?)p.QueryParams[1] : (long?)p.QueryParams[1]; var numberTo = p.QueryParams[2] is int || p.QueryParams[2] == null ? (int?)p.QueryParams[2] : (long?)p.QueryParams[2]; // ReSharper restore MergeSequentialChecks if (isByValue) { return(!numberFrom.HasValue ? null : string.Format(inverse ? "({1}.{0} <> {2} OR {1}.{0} IS NULL)" : "({1}.{0} = {2})", escapedFieldColumnName, GetTableAlias(p), numberFrom)); } if (!numberFrom.HasValue && !numberTo.HasValue) { return(null); } if (numberFrom.HasValue && !numberTo.HasValue) { return(inverse ? $"({GetTableAlias(p)}.{escapedFieldColumnName} < {numberFrom})" : $"({GetTableAlias(p)}.{escapedFieldColumnName} >= {numberFrom})"); } if (!numberFrom.HasValue) { return(inverse ? $"({GetTableAlias(p)}.{escapedFieldColumnName} > {numberTo})" : $"({GetTableAlias(p)}.{escapedFieldColumnName} <= {numberTo})"); } if (numberFrom.Value < numberTo.Value) { return($"({GetTableAlias(p)}.{escapedFieldColumnName} {(inverse ? "NOT" : "")} BETWEEN {numberFrom} AND {numberTo})"); } return(numberFrom.Value > numberTo.Value ? $"({GetTableAlias(p)}.{escapedFieldColumnName} {(inverse ? "NOT" : "")} BETWEEN {numberTo} AND {numberFrom})" : inverse ? $"({GetTableAlias(p)}.{escapedFieldColumnName} <> {numberFrom})" : $"({GetTableAlias(p)}.{escapedFieldColumnName} = {numberFrom})"); }
private static string ParseO2MRelationParam(ArticleSearchQueryParam p, ICollection <DbParameter> sqlParams) { Ensure.NotNull(p); Ensure.That(p.SearchType == ArticleFieldSearchType.O2MRelation || p.SearchType == ArticleFieldSearchType.Classifier); if (string.IsNullOrWhiteSpace(p.FieldColumn)) { throw new ArgumentException("FieldColumn"); } // параметры не пустые и их не меньше 2х (используем 1й и 2й - остальные отбрасываем) if (p.QueryParams == null || p.QueryParams.Length < 3) { throw new ArgumentException(); } // первый параметр должен быть null или object[] if (p.QueryParams[0] != null && !(p.QueryParams[0] is object[])) { throw new InvalidCastException(); } // второй параметр должен быть bool if (!(p.QueryParams[1] is bool)) { throw new InvalidCastException(); } if (!(p.QueryParams[2] is bool)) { throw new InvalidCastException(); } var isNull = (bool)p.QueryParams[1]; var inverse = (bool)p.QueryParams[2]; var inverseString = inverse ? "NOT" : string.Empty; var dbType = QPContext.DatabaseType; var fieldName = SqlQuerySyntaxHelper.EscapeEntityName(dbType, p.FieldColumn.ToLower()); if (isNull) { return(string.Format("({1}.{0} IS {2} NULL)", fieldName, GetTableAlias(p), inverseString)); } // Если массив null или пустой - то возвращаем null if (p.QueryParams[0] == null || ((object[])p.QueryParams[0]).Length == 0) { return(null); } var values = ((object[])p.QueryParams[0]).Select(n => int.Parse(n.ToString())).ToArray(); var fieldId = p.FieldId ?? string.Empty; var paramName = "@field" + fieldId.Replace("-", "_"); if (values.Length == 1) { sqlParams.Add(SqlQuerySyntaxHelper.CreateDbParameter(dbType, paramName, values[0])); return(inverse ? $"({GetTableAlias(p)}.{fieldName} <> {paramName} OR {GetTableAlias(p)}.{fieldName} IS NULL)" : $"({GetTableAlias(p)}.{fieldName} = {paramName})"); } sqlParams.Add(SqlQuerySyntaxHelper.GetIdsDatatableParam(paramName, values, dbType)); return(inverse ? $"({GetTableAlias(p)}.{fieldName} NOT IN (select id from {SqlQuerySyntaxHelper.IdList(dbType, paramName, "i")}) OR {GetTableAlias(p)}.{fieldName} IS NULL)" : $"({GetTableAlias(p)}.{fieldName} IN (select id from {SqlQuerySyntaxHelper.IdList(dbType, paramName, "i")}))"); }