public async Task Execute(IEnumerable <IComplexQueryEntity> entities, CancellationToken ct) { if (entities == null) { throw new ArgumentNullException(nameof(entities)); } var grouping = entities.Where(e => !(e is null)).ToList().GroupBy(e => e.QueryRequestor); foreach (var group in grouping) { // arrange var query = new ComplexQuery(group.Key); var result = new ComplexQueryResult(query); // use cache var cachedEntity = group.First() as IComplexQueryCachedEntity; if (cachedEntity != null && cachedEntity.TryReadCache(out var cache)) { result.AddRange(cache); } else { if (group.Key.RequestType == RequestType.PerType) { group.First().AdjustComplexQuery(query); } else { foreach (var entity in group) { entity.AdjustComplexQuery(query); } } // fetch foreach (var queryEntity in query) { result.AddRange(await _getListFactory(queryEntity, ct)); } // save cache cachedEntity?.SaveCache(result); } // utilize foreach (var entity in group) { entity.UtilizeComplexQueryResult(result); } } }
public ComplexQueryResult(ComplexQuery query) : this(query, Enumerable.Empty <Entity>()) { }
public ComplexQueryResult(ComplexQuery query, IEnumerable <Entity> entities) : base(entities) { Query = query ?? throw new ArgumentNullException(nameof(query)); }
public ComplexQueryResult(ComplexQuery query, params Entity[] entities) : this(query, (IEnumerable <Entity>)entities) { }