private void _filterInternal(string currentSearch) { lock (_filterLock) { IsFiltering = true; try { if (currentSearch != _searchItemsFilter) { return; } if (_items == null) { return; } List <TValue> allItems; if (SubsetCondition != null) { allItems = _table.FastItems.Where(p => SubsetCondition(p)).ToList(); } else { allItems = _table.FastItems; } if (SetupImageDataGetter != null) { allItems.Where(p => p.GetImageData == null).ToList().ForEach(p => SetupImageDataGetter(p)); } List <string> search = _getSearch(currentSearch); if (allItems.Count == 0) { _items.Dispatch(r => r.ItemsSource = new RangeObservableCollection <TValue>(new List <TValue>())); WpfUtilities.TextBoxOk(_tbSearchItems); OnFilterFinished(new List <TValue>()); return; } WpfUtilities.TextBoxProcessing(_tbSearchItems); if (!_searchFirstTimeSet) { _entryComparer = new DatabaseItemSorter <TValue>(_settings.AttributeList); _entryComparer.SetSort(_settings.AttId.AttributeName, ListSortDirection.Ascending); _searchFirstTimeSet = true; } _items.Dispatch(p => _entryComparer.SetSort(WpfUtils.GetLastGetSearchAccessor(_items), WpfUtils.GetLastSortDirection(_items))); if (search.Count == 0 && !_attributes.Where(p => p.DataType.BaseType == typeof(Enum)).Any(p => _itemsSearchSettings[p]) && !_itemsSearchSettings[GSearchSettings.TupleAdded] && !_itemsSearchSettings[GSearchSettings.TupleModified] && !_itemsSearchSettings[GSearchSettings.TupleRange]) { allItems = allItems.OrderBy(p => p, _entryComparer).ToList(); _items.Dispatch(r => r.ItemsSource = new RangeObservableCollection <TValue>(allItems)); WpfUtilities.TextBoxOk(_tbSearchItems); OnFilterFinished(allItems); return; } if (currentSearch != _searchItemsFilter) { return; } string predicateSearch = _tbItemsRange.Dispatch(() => _tbItemsRange.Text); bool isWiden = _itemsSearchSettings.Get(GSearchSettings.Mode) == "0"; List <Func <TValue, string, bool> > generalPredicates = (from attribute in _attributes where attribute != null let attributeCopy = attribute where _itemsSearchSettings[attributeCopy] where attribute.DataType.BaseType != typeof(Enum) select new Func <TValue, string, bool>((p, s) => p.GetValue <string>(attributeCopy).IndexOf(s, StringComparison.OrdinalIgnoreCase) != -1)).ToList(); bool isAttributeRestricted = false; if (search.Any(p => p.StartsWith("[", StringComparison.Ordinal) && p.EndsWith("]", StringComparison.Ordinal))) { generalPredicates.Clear(); for (int index = 0; index < search.Count; index++) { string se = search[index]; int ival; if (se.StartsWith("[", StringComparison.Ordinal) && se.EndsWith("]", StringComparison.Ordinal)) { se = se.Substring(1, se.Length - 2); se = se.Replace("_", " "); var att = _settings.AttributeList.Attributes.FirstOrDefault(p => p.DisplayName.IndexOf(se, 0, StringComparison.OrdinalIgnoreCase) > -1); if (Int32.TryParse(se, out ival) || att != null) { if (ival < _settings.AttributeList.Attributes.Count) { DbAttribute attribute = att ?? _settings.AttributeList.Attributes[ival]; isAttributeRestricted = true; //generalPredicates.Add(new Func<TValue, string, bool>((p, s) => p.GetValue<string>(attribute).IndexOf(s, StringComparison.OrdinalIgnoreCase) != -1)); string nextSearch = index + 1 < search.Count ? search[index + 1] : ""; generalPredicates.Add(new Func <TValue, string, bool>((p, s) => String.Compare(p.GetValue <string>(attribute), nextSearch, StringComparison.OrdinalIgnoreCase) == 0)); } search.RemoveAt(index); index--; } } } } List <DbAttribute> enumAttributes = _attributes.Where(p => p.DataType.BaseType == typeof(Enum) && _itemsSearchSettings[p]).ToList(); bool hasTuplePredicates = _itemsSearchSettings[GSearchSettings.TupleAdded] || _itemsSearchSettings[GSearchSettings.TupleModified] || _itemsSearchSettings[GSearchSettings.TupleRange] || enumAttributes.Any(); Func <TValue, bool> tuplePredicate = null; if (hasTuplePredicates) { tuplePredicate = _getTuplePredicates(enumAttributes, predicateSearch); } if (currentSearch != _searchItemsFilter) { return; } List <TValue> result = _getResults(search, isAttributeRestricted, generalPredicates, allItems, tuplePredicate, isWiden); if (currentSearch != _searchItemsFilter) { WpfUtilities.TextBoxOk(_tbSearchItems); return; } _items.Dispatch(r => r.ItemsSource = new RangeObservableCollection <TValue>(result)); WpfUtilities.TextBoxOk(_tbSearchItems); OnFilterFinished(result); } catch { WpfUtilities.TextBoxOk(_tbSearchItems); } finally { IsFiltering = false; } } }