Example #1
0
 public virtual object Transform(object entity, Type entityType, QueryProcessingEntitiesContext context)
 {
     return(entity);
 }
Example #2
0
        private void LoadResults()
        {
            var query     = _queryContainer.Compile(out var columns);
            var dbCommand =
                _queryContainer.AccessLayer.Database
                .CreateCommandWithParameterValues(query.Query, query.Parameters.ToArray());

            foreach (var queryCommandInterceptor in _queryContainer.Interceptors)
            {
                dbCommand = queryCommandInterceptor.NonQueryExecuting(dbCommand);

                if (dbCommand == null)
                {
                    throw new InvalidOperationException($"The Command interceptor: " +
                                                        $"'{queryCommandInterceptor}' has returned null");
                }
            }
            var dataRecords = _queryContainer.AccessLayer.EnumerateDataRecordsAsync(dbCommand)
                              .ToArray();

            if (_queryContainer.PostProcessors.Any())
            {
                var context = new QueryProcessingRecordsContext(_queryContainer, _queryContainer.PostProcessors, columns);
                foreach (var queryContainerPostProcessor in _queryContainer.PostProcessors)
                {
                    dataRecords = queryContainerPostProcessor.Transform(dataRecords, _type, context);
                }

                columns = context.Columns;
            }

            var relations = new List <Tuple <QueryIdentifier, QueryIdentifier, RelationProcessor> >();

            if (_queryContainer.Joins.Any())
            {
                var queryProcessingRecordsContext = new QueryProcessingRecordsContext(_queryContainer,
                                                                                      _queryContainer.PostProcessors,
                                                                                      columns);


                foreach (var queryContainerJoin in _queryContainer.Joins)
                {
                    var relationProcessor = new RelationProcessor(queryContainerJoin);
                    relations.Add(new Tuple <QueryIdentifier, QueryIdentifier, RelationProcessor>(
                                      queryContainerJoin.Alias,
                                      queryContainerJoin.SourceTable,
                                      relationProcessor));
                    dataRecords = relationProcessor
                                  .JoinTables(dataRecords,
                                              queryContainerJoin.TargetTableType,
                                              queryProcessingRecordsContext);
                }

                foreach (var queryContainerJoin in relations)
                {
                    dataRecords = queryContainerJoin
                                  .Item3
                                  .DoJoinMapping(dataRecords,
                                                 queryContainerJoin.Item1,
                                                 queryProcessingRecordsContext,
                                                 true,
                                                 true);
                }

                columns = queryProcessingRecordsContext.Columns;
            }

            var columnNames = columns.Select(f => f.NaturalName).ToArray();

            dataRecords = dataRecords.Select(record =>
                                             new EagarDataRecord(columnNames, record.MetaHeader.ToArray()))
                          .ToArray();

            var records = Partitioner.Create(dataRecords, true)
                          .AsParallel()
                          .AsOrdered()
                          .Select((dataRecord) => _queryContainer.AccessLayer
                                  .SetPropertysViaReflection(_queryContainer.AccessLayer.GetClassInfo(_type),
                                                             dataRecord))
                          .ToArray();

            var elements = new ArrayList();

            if (_queryContainer.PostProcessors.Any())
            {
                var context = new QueryProcessingEntitiesContext(records);
                foreach (var element in records)
                {
                    var item = element;
                    foreach (var queryContainerPostProcessor in _queryContainer.PostProcessors)
                    {
                        item = queryContainerPostProcessor.Transform(item, _type, context);
                    }

                    elements.Add(item);
                }
            }
            else
            {
                elements.AddRange(records);
            }

            _elements = elements.GetEnumerator();
        }