private TAggregateRootState CreateState(IEventStream stream) { Contract.Requires(stream != null); Contract.Ensures(Contract.Result <TAggregateRootState>() != null); var snapshotRevision = stream.FirstOrDefault(x => x is SnapshotRevision) as SnapshotRevision; // order domain events and flatten list IReadOnlyCollection <IDomainEvent> domainEvents = stream.Where(x => x is DomainEventRevision) .OrderBy(x => x.Version) .Cast <DomainEventRevision>() .SelectMany(x => x.DomainEvents) .ToList(); var domainEventsExist = domainEvents.Any(); TAggregateRootState state; // check for valid stream if (snapshotRevision == null) { if (domainEventsExist) { // domain events only state = _aggregateRootStateBuilder.Build(domainEvents); } else { throw new InvalidOperationException("Event stream does not contain a snapshot or domain event revision."); } } else { if (domainEventsExist) { // snapshot and domain events state = _aggregateRootStateBuilder.Build(snapshotRevision.Snapshot.Data, domainEvents); } else { // snapshot only state = _aggregateRootStateBuilder.Build(snapshotRevision.Snapshot.Data); } } Contract.Assume(state != null); return(state); }