/// <inheritdoc/> public IEnumerable <EventAndEnvelope> GetFor(IApplicationResourceIdentifier eventSource, EventSourceId eventSourceId) { var partitionKeyFilter = GetPartitionKeyFilterFor(eventSource, eventSourceId); var query = new TableQuery <DynamicTableEntity>().Where(partitionKeyFilter); var events = new List <DynamicTableEntity>(); TableContinuationToken continuationToken = null; do { _table.ExecuteQuerySegmentedAsync(query, continuationToken).ContinueWith(e => { events.AddRange(e.Result.Results); continuationToken = e.Result.ContinuationToken; }).Wait(); } while (continuationToken != null); var eventsAndEnvelopes = events.OrderBy(e => long.Parse(e.RowKey)).Select(entity => { var eventResource = GetApplicationResourceIdentifierFromSanitizedString(entity.Properties[PropertiesFor <EventEnvelope> .GetPropertyName(e => e.Event)].StringValue); var eventSourceResource = GetApplicationResourceIdentifierFromSanitizedString(entity.Properties[PropertiesFor <EventEnvelope> .GetPropertyName(e => e.EventSource)].StringValue); var envelope = new EventEnvelope( PropertiesFor <EventEnvelope> .GetValue(entity, e => e.CorrelationId), PropertiesFor <EventEnvelope> .GetValue(entity, e => e.EventId), PropertiesFor <EventEnvelope> .GetValue(entity, e => e.SequenceNumber), PropertiesFor <EventEnvelope> .GetValue(entity, e => e.SequenceNumberForEventType), PropertiesFor <EventEnvelope> .GetValue(entity, e => e.Generation), eventResource, PropertiesFor <EventEnvelope> .GetValue(entity, e => e.EventSourceId), eventSourceResource, PropertiesFor <EventEnvelope> .GetValue(entity, e => e.Version), PropertiesFor <EventEnvelope> .GetValue(entity, e => e.CausedBy), PropertiesFor <EventEnvelope> .GetValue(entity, e => e.Occurred) ); var eventType = _applicationResourceResolver.Resolve(envelope.Event); var @event = Activator.CreateInstance(eventType, envelope.EventSourceId) as IEvent; eventType.GetProperties().Where(p => p.CanWrite).ForEach(p => p.SetValue(@event, PropertyHelper.GetValue(entity, p))); return(new EventAndEnvelope(envelope, @event)); }); return(eventsAndEnvelopes); }
/// <summary> /// Get a value from a <see cref="DynamicTableEntity"/> by giving the target objects property. /// From the expression given it will find the expected type and also the name of the property to /// look for in the entity from Azure Tables /// </summary> /// <typeparam name="TProperty"><see cref="Type"/> of property type - inferred</typeparam> /// <param name="entity"><see cref="DynamicTableEntity">Entity</see> to get from</param> /// <param name="property">Property expression</param> /// <returns>Value of the property from the <see cref="DynamicTableEntity">entity</see></returns> public static TProperty GetValue <TProperty>(DynamicTableEntity entity, Expression <Func <TTarget, TProperty> > property) { var propertyInfo = property.GetPropertyInfo(); return((TProperty)PropertyHelper.GetValue(entity, propertyInfo)); }