/// <inheritdoc/>
        protected override Provider VisitFilter(FilterProvider provider)
        {
            OnRecursionEntrance(provider);
            var source = VisitCompilable(provider.Source);

            OnRecursionExit(provider);
            var predicate = translate(provider, provider.Predicate);

            if (source == provider.Source && predicate == provider.Predicate)
            {
                return(provider);
            }
            return(new FilterProvider(source, (Expression <Func <Tuple, bool> >)predicate));
        }
 /// <summary>
 /// Visits <see cref="FilterProvider"/>.
 /// </summary>
 /// <param name="provider">Filter provider.</param>
 protected abstract Provider VisitFilter(FilterProvider provider);