public override FdbAsyncIterator <TSource> Where(Func <TSource, bool> predicate)
 {
     return(FdbAsyncEnumerable.Filter <TSource>(
                m_source,
                m_filter.AndAlso(new AsyncFilterExpression <TSource>(predicate))
                ));
 }
        public override FdbAsyncIterator <TResult> Where(Func <TResult, bool> predicate)
        {
            if (predicate == null)
            {
                throw new ArgumentNullException("predicate");
            }

            // note: the only possible optimization here is if TSource == TResult, then we can combine both predicates
            // remember: limit/offset are applied AFTER the filtering, so can only combine if they are null
            // also, since transform is done after filtering, we can only optimize if transform is null (not allowed!) or the identity function
            if (m_limit == null &&
                (m_offset == null || m_offset.Value == 0) &&
                typeof(TSource) == typeof(TResult) &&                 //BUGBUG: type comparison maybe should check derived classes also ?
                m_transform.IsIdentity())
            {
                var filter = new AsyncFilterExpression <TSource>((Func <TSource, bool>)(Delegate) predicate);
                if (m_filter != null)
                {
                    filter = m_filter.AndAlso(filter);
                }

                //BUGBUG: if the query already has a select, it should be evaluated BEFORE the new filter,
                // but currently FdbWhereSelectAsyncIterator<> filters before transformations !

                return(new FdbWhereSelectAsyncIterator <TSource, TResult>(
                           m_source,
                           filter,
                           m_transform,
                           m_limit,
                           m_offset
                           ));
            }

            // no easy optimization...
            return(base.Where(predicate));
        }