public Task <ICollection <TEventBase> > GetFeed(TFeedKey feedId, int?skip = null, int?take = null)
        {
            var query = _feed
                        .FindAs <ActivityFeedItem <TFeedKey, TEventKey, TSourceKey> >(
                Query.EQ("FeedId", BsonValue.Create(feedId))
                )
                        .SetSortOrder(SortBy.Descending("Relevancy"))
                        .SetFields(ExcludeId.Include("EventId"));

            if (skip != null)
            {
                query = query.SetSkip(skip.Value);
            }

            if (take != null)
            {
                query = query.SetLimit(take.Value);
            }

            var eventIds = query.Select(e => BsonValue.Create(e.EventId)).ToList();
            var result   = _events.FindAs <TEventBase>(Query.In("_id", eventIds))
                           .SetSortOrder(SortBy.Descending("Relevancy"))
                           .ToList();

            return(StubTask.Value((ICollection <TEventBase>)result));
        }
        private Task AddToRelatedFeeds(TEventBase @event)
        {
            var relatedFeeds = _relations.FindAs <ActivityFeedRelation <TFeedKey, TSourceKey> >(
                Query.EQ("SourceId", BsonValue.Create(@event.SourceId))
                ).SetFields(ExcludeId.Include("FeedId"));

            if (relatedFeeds.Size() == 0)
            {
                return(StubTask.Void);
            }

            var feedItems = relatedFeeds.Select(
                relation => new ActivityFeedItem <TFeedKey, TEventKey, TSourceKey> {
                FeedId    = relation.FeedId,
                EventId   = @event.Id,
                SourceId  = @event.SourceId,
                Relevancy = @event.Relevancy
            });

            _feed.InsertBatch(feedItems, _fanOutWriteConcern).ThrowIfNotOk();

            return(StubTask.Void);
        }