public async Task OnEvent(IAggregateEvent ev, string queryId = null) { queryId = queryId ?? ev.AggregateId; var query = await queryStore.Get(queryId); var data = query.Data; if (query.Version >= ev.SequenceId) { // event already applied return; } int originalVersion = query.Version; if (originalVersion < ev.SequenceId - 1) { // fastforward to the current event's version query = await FastForward(query, ev.SequenceId); } else { // query is sync, just apply the event query.Data = mutator.InvokeEventMutator(data, ev); query.Version = ev.SequenceId; query.DateUtc = DateTime.UtcNow; } await queryStore.Set(queryId, query, originalVersion); }