private async Task <IEnumerable <IDomainEvent> > Load <T>(
            Guid sourceId,
            int afterVersion,
            CancellationToken cancellationToken)
            where T : class, IEventSourced
        {
            string filter = PersistentEvent.GetFilter(typeof(T), sourceId, afterVersion);
            var    query  = new TableQuery <PersistentEvent> {
                FilterString = filter
            };

            IEnumerable <PersistentEvent> events = await _eventTable
                                                   .ExecuteQuery(query, cancellationToken)
                                                   .ConfigureAwait(false);

            return(new List <IDomainEvent>(events
                                           .Select(e => e.EventJson)
                                           .Select(_serializer.Deserialize)
                                           .Cast <IDomainEvent>()));
        }
        public async Task SaveEvents_inserts_persistent_event_entities_correctly()
        {
            // Arrange
            var fixture = new Fixture();
            var user    = new FakeUser(Guid.NewGuid(), fixture.Create <string>());

            user.ChangeUsername(fixture.Create <string>());
            IList <IDomainEvent> domainEvents = user.FlushPendingEvents().ToList();
            string operationId   = fixture.Create <string>();
            var    correlationId = Guid.NewGuid();
            string contributor   = fixture.Create <string>();

            // Act
            await _sut.SaveEvents <FakeUser>(domainEvents, operationId, correlationId, contributor);

            // Assert
            string filter = PersistentEvent.GetFilter(typeof(FakeUser), user.Id);
            var    query  = new TableQuery <PersistentEvent> {
                FilterString = filter
            };
            IEnumerable <PersistentEvent> actual = await s_eventTable.ExecuteQuerySegmentedAsync(query, default);

            actual.ShouldAllBeEquivalentTo(
                from domainEvent in domainEvents
                let envelope = new Envelope <IDomainEvent>(
                    Guid.NewGuid(),
                    domainEvent,
                    operationId,
                    correlationId,
                    contributor)
                               select PersistentEvent.Create(typeof(FakeUser), envelope, _serializer),
                opts => opts
                .Excluding(e => e.MessageId)
                .Excluding(e => e.Timestamp)
                .Excluding(e => e.ETag)
                .WithStrictOrdering());
        }