public IEnumerable <TBaseMessage> Query(MessageStoreQueryCriteria criteria) { var source = this.messages.AsQueryable(); var predicate = ToExpression(criteria, this.TypeNameConverter); if (predicate != null) { source = source.Where(predicate).Cast <StoredMessage>(); } return(source.Select(x => x.Message)); }
public virtual IEnumerable <TBaseMessage> Query(MessageStoreQueryCriteria criteria) { var predicate = ToExpression(criteria, this.TypeNameConverter); var messages = this.Messages.AsQueryable(); if (predicate != null) { messages = messages.Where(predicate); } // NOTE: it's up to the serializer to actually hydrate the // right derived/concrete type from the underlying byte // array. So the <T> passed to Deserialize cannot be used // to determine that. return(messages .OrderBy(x => x.RowVersion) .AsEnumerable() .Select(x => this.serializer.Deserialize <TBaseMessage>(x.Payload))); }
private Expression <Func <MessageEntity, bool> > AddEventFilter(Expression <Func <MessageEntity, bool> > result) { var criteria = default(Expression <Func <MessageEntity, bool> >); foreach (var filter in this.criteria.MessageTypes) { var sourceType = typeNameConverter.Invoke(filter); // ORs all aggregregate filters. criteria = Or(criteria, e => e.Type == sourceType); } if (criteria == null) { return(result); } // AND the criteria built so far. return(And(result, criteria)); }
public StoredMessageCriteriaBuilder(MessageStoreQueryCriteria criteria, Func <Type, string> typeNameConverter) { this.criteria = criteria; this.typeNameConverter = typeNameConverter; }
private static Expression <Func <MessageEntity, bool> > ToExpression(MessageStoreQueryCriteria criteria, Func <Type, string> typeNameConverter) { return(new StoredMessageCriteriaBuilder(criteria, typeNameConverter).Build()); }