private async Task FilterBy(ICollectionView <object> collectionView, string query)
        {
            var itemType   = collectionView.GetItemType();
            var queryParts = TreatSpacesAsAndOperator ? query.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) : new string[] { query };
            FilterExpression filterExpression = null;

            foreach (var queryPart in queryParts)
            {
                var filterExpressions = new List <FilterExpression>();
                foreach (var property in CollectionView.GetItemType().GetTypeInfo().DeclaredProperties)
                {
                    try
                    {
                        var propType = property.PropertyType;
                        if (propType == typeof(string) ||
                            IsNumeric(propType) && MatchNumbers)
                        {
                            filterExpressions.Add(new FilterUnaryExpression(property.Name, FilterOperation.Contains, queryPart));
                        }
                    }
                    catch { }
                }
                var fe = FilterExpression.Combine(FilterCombination.Or, filterExpressions.ToArray());
                if (filterExpression == null)
                {
                    filterExpression = fe;
                }
                else
                {
                    filterExpression = new FilterBinaryExpression(FilterCombination.And, filterExpression, fe);
                }
            }
            await(collectionView as ISupportFiltering).FilterAsync(filterExpression);
        }