/// <summary> /// Asynchronously generates a component from a report definition and filter /// </summary> /// <param name="definition">The component definition</param> /// <param name="sectionType">The report section type</param> /// <param name="filter">The report filter</param> /// <returns>The report component generated</returns> public override async Task <IReportComponent> GenerateAsync ( IReportComponentDefinition definition, ReportSectionType sectionType, ReportFilter filter ) { Validate.IsNotNull(definition); Validate.IsNotNull(filter); var repeaterDefinition = definition.As <RepeaterDefinition>(); var query = repeaterDefinition.Query; var defaultParameters = repeaterDefinition.DefaultParameterValues; var parameters = filter.GetQueryParameters ( query, defaultParameters.ToArray() ); var queryTask = query.ExecuteAsync ( parameters.ToArray() ); var results = await queryTask.ConfigureAwait ( false ); var generatedItems = new List <RepeaterItem>(); var itemTasks = new List <Task <RepeaterItem> >(); foreach (var row in results.AllRows) { itemTasks.Add ( GenerateItemAsync ( repeaterDefinition, sectionType, filter, row ) ); } await Task.WhenAll ( itemTasks.ToArray() ) .ConfigureAwait ( false ); foreach (var task in itemTasks) { generatedItems.Add ( await task.ConfigureAwait(false) ); } if (false == repeaterDefinition.DisableSorting) { var sortDirection = filter.FindSortDirection ( sectionType, definition.Name, "Item" ); // Apply the sorting direction, if it has been specified if (sortDirection != null) { if (sortDirection.Value == SortDirection.Ascending) { generatedItems = generatedItems.OrderBy ( a => a.Value ) .ToList(); } else { generatedItems = generatedItems.OrderByDescending ( a => a.Value ) .ToList(); } } } var repeater = new Repeater ( repeaterDefinition, generatedItems.ToArray() ); return(repeater); }