コード例 #1
0
        /// <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);
        }