public Option <BankAccount> FindBy(Guid id) { string eventStreamId = GetEventStreamId(id); int afterVersion = 0; const int eventCount = int.MaxValue; Option <BankAccountSnapshot> latestSnapshotOption = _appendOnlyStore.GetLatestSnapshot <BankAccountSnapshot>(eventStreamId); if (latestSnapshotOption.IsSome) { afterVersion = latestSnapshotOption.Value.Version; } var storedEventsOption = _appendOnlyStore.GetStoredEvents(eventStreamId, afterVersion, eventCount); if (storedEventsOption.IsNone) { return(Option.None <BankAccount>()); } if (latestSnapshotOption.IsSome && storedEventsOption.IsSome) { var snapshot = latestSnapshotOption.Value; var domainEvents = storedEventsOption.Value.Select(x => x.Event); var bankAccount = BankAccount.ReconstructBankAccount(snapshot, domainEvents); return(Option.Some(bankAccount)); } else { var domainEvents = storedEventsOption.Value.Select(x => x.Event); var bankAccount = BankAccount.ReconstructBankAccount(id, domainEvents); return(Option.Some(bankAccount)); } }