protected virtual void ApplyContainsText(SqlQuery query, string containsText) { query.ApplyContainsText(containsText, (text, id) => { var fields = GetQuickSearchFields(Request.ContainsField.TrimToNull()); if (fields == null || !fields.Any()) { throw new ArgumentOutOfRangeException("containsField"); } var criteria = Criteria.Empty; bool orFalse = false; foreach (var field in fields) { ApplyFieldContainsText(field, containsText, id, ref criteria, ref orFalse); } if (orFalse && criteria.IsEmpty) { criteria |= new Criteria("1 = 0"); } if (!criteria.IsEmpty) { query.Where(~(criteria)); } }); }
protected virtual void ApplyContainsText(SqlQuery query, string containsText) { query.ApplyContainsText(containsText, (text, id) => { var fields = GetQuickSearchFields(Request.ContainsField.TrimToNull()); if (fields == null || !fields.Any()) { throw new ArgumentOutOfRangeException("containsField"); } var criteria = Criteria.Empty; bool orFalse = false; foreach (var field in fields) { var attr = field.CustomAttributes == null ? null : field.CustomAttributes.OfType <QuickSearchAttribute>().FirstOrDefault(); var searchType = attr == null ? SearchType.Auto : attr.SearchType; var numericOnly = attr == null ? null : attr.NumericOnly; if (numericOnly == null) { numericOnly = field is Int32Field || field is Int16Field || field is Int64Field; } if (searchType == SearchType.Auto) { if (field is Int32Field || field is Int16Field || field is Int64Field) { searchType = SearchType.Equals; } else { searchType = SearchType.Contains; } } if (numericOnly == true && (id == null)) { orFalse = true; continue; } switch (searchType) { case SearchType.Contains: criteria |= new Criteria(field).Contains(containsText); break; case SearchType.StartsWith: criteria |= new Criteria(field).StartsWith(containsText); break; case SearchType.Equals: if (field is Int32Field) { if (id == null || id < Int32.MinValue || id > Int32.MaxValue) { orFalse = true; continue; } criteria |= new Criteria(field) == (int)id; } else if (field is Int16Field) { if (id == null || id < Int16.MinValue || id > Int16.MaxValue) { orFalse = true; continue; } criteria |= new Criteria(field) == (Int16)id; } else if (field is Int64Field) { if (id == null || id < Int64.MinValue || id > Int64.MaxValue) { orFalse = true; continue; } criteria |= new Criteria(field) == id.Value; } else { criteria |= new Criteria(field) == containsText; } break; default: throw new ArgumentOutOfRangeException("searchType"); } } if (orFalse && criteria.IsEmpty) { criteria |= new Criteria("1 = 0"); } if (!criteria.IsEmpty) { query.Where(~(criteria)); } }); }