/// <inheritdoc cref="IChildImportEntitiesGetter"/>
        public virtual IEnumerable <Entity> Get(ImportParameters parameters)
        {
            List <Entity> entities = new List <Entity>();

            foreach (ImportEntity importEntity in parameters.Entities)
            {
                if (importEntity.PrimaryEntity == null)
                {
                    continue;
                }
                SchemasKeyColumnsValues schemasKeyColumnsValues =
                    GetSchemasKeyColumnsValues(parameters, importEntity);
                AddChildEntitiesQueryFilters(parameters, importEntity, schemasKeyColumnsValues);
                foreach (EntitySchemaQuery esq in ChildEntitiesQueries.Values)
                {
                    if (esq.Filters.Count >= FileImporterConstants.MaxQueryChildFiltersCount)
                    {
                        EntityCollection entityCollection = esq.GetEntityCollection(UserConnection);
                        entities.AddRange(entityCollection);
                        esq.ResetSelectQuery();
                        esq.Filters.Clear();
                    }
                }
            }
            foreach (EntitySchemaQuery esq in ChildEntitiesQueries.Values)
            {
                if (esq.Filters.Any())
                {
                    EntityCollection entityCollection = esq.GetEntityCollection(UserConnection);
                    entities.AddRange(entityCollection);
                }
            }
            return(entities);
        }
        /// <summary>
        /// Gets schemas key columns values.
        /// </summary>
        /// <param name="parameters">Import parameters.</param>
        /// <param name="importEntity">Import entity.</param>
        /// <returns>Schemas key columns values.</returns>
        private SchemasKeyColumnsValues GetSchemasKeyColumnsValues(
            ImportParameters parameters, ImportEntity importEntity)
        {
            var schemasKeyColumnsValues = new SchemasKeyColumnsValues();

            foreach (ImportColumn column in parameters.Columns)
            {
                ImportColumnValue columnValue = importEntity.FindColumnValue(column);
                if (columnValue == null)
                {
                    continue;
                }
                foreach (ImportColumnDestination destination in column.Destinations)
                {
                    Guid schemaUId = destination.SchemaUId;
                    if (schemaUId.Equals(parameters.RootSchemaUId))
                    {
                        continue;
                    }
                    object valueForSave = ColumnsProcessor.FindValueForSave(destination, columnValue);
                    if (valueForSave == null)
                    {
                        continue;
                    }
                    EntitySchema             schema = UserConnection.EntitySchemaManager.GetInstanceByUId(schemaUId);
                    EntitiesKeyColumnsValues entitiesKeyColumnsValues;
                    if (!schemasKeyColumnsValues.TryGetValue(schema, out entitiesKeyColumnsValues))
                    {
                        entitiesKeyColumnsValues = new EntitiesKeyColumnsValues();
                        schemasKeyColumnsValues.Add(schema, entitiesKeyColumnsValues);
                    }
                    int              destinationIndex     = destination.GetIndex();
                    object           attributeColumnValue = destination.FindAttributeColumnValue();
                    string           destinationKey       = string.Concat(destinationIndex, attributeColumnValue);
                    KeyColumnsValues keyColumnsValues;
                    if (!entitiesKeyColumnsValues.TryGetValue(destinationKey, out keyColumnsValues))
                    {
                        keyColumnsValues = new KeyColumnsValues();
                        entitiesKeyColumnsValues.Add(destinationKey, keyColumnsValues);
                    }
                    keyColumnsValues.Add(destination.ColumnName, valueForSave);
                    string attributeColumnName = GetDestinationAttributeColumnName(destination, schema);
                    if (!keyColumnsValues.ContainsKey(attributeColumnName))
                    {
                        keyColumnsValues.Add(attributeColumnName, attributeColumnValue);
                    }
                    EntitySchemaColumn connectionColumn     = importEntity.GetReferenceColumn(schema);
                    string             connectionColumnName = connectionColumn.Name;
                    if (!keyColumnsValues.ContainsKey(connectionColumnName))
                    {
                        Guid primaryColumnValue = importEntity.PrimaryEntity.PrimaryColumnValue;
                        keyColumnsValues.Add(connectionColumnName, primaryColumnValue);
                    }
                }
            }
            return(schemasKeyColumnsValues);
        }
 /// <summary>
 /// Adds child entities query filters.
 /// </summary>
 /// <param name="parameters">Import parameters.</param>
 /// <param name="importEntity">Import entity.</param>
 /// <param name="schemasKeyColumnsValues">Schemas key columns values.</param>
 private void AddChildEntitiesQueryFilters(ImportParameters parameters, ImportEntity importEntity,
                                           SchemasKeyColumnsValues schemasKeyColumnsValues)
 {
     foreach (var schemaKeyColumnsValues in schemasKeyColumnsValues)
     {
         EntitySchema      schema = schemaKeyColumnsValues.Key;
         EntitySchemaQuery esq;
         if (!ChildEntitiesQueries.TryGetValue(schema, out esq))
         {
             esq = CreateEntitiesSearchQuery(schema);
             ChildEntitiesQueries.Add(schema, esq);
         }
         foreach (var entitiesKeyColumnsValues in schemaKeyColumnsValues.Value)
         {
             Dictionary <string, object>       keyColumnsValues = entitiesKeyColumnsValues.Value;
             EntitySchemaQueryFilterCollection filters          = CreateChildEntityFilters(esq, importEntity,
                                                                                           keyColumnsValues);
             esq.Filters.Add(filters);
         }
     }
 }