/// <summary>
        ///		Obtiene la consulta para una dimensión del informe
        /// </summary>
        internal QueryModel GetQuery(DimensionRequestModel dimensionRequest)
        {
            List <QueryModel> childsQueries = new List <QueryModel>();
            DimensionModel    dimension     = GetDimension(dimensionRequest);
            QueryModel        query         = GetChildQuery(dimensionRequest);

            // Obtiene las consultas de las dimensiones hija: si hay algún campo solicitado de alguna dimensión hija,
            // necesitaremos también la consulta de esta dimensión para poder hacer el JOIN posterior, por eso las
            // calculamos antes que la consulta de esta dimensión
            foreach (DimensionRequestModel childDimension in dimensionRequest.Childs)
            {
                QueryModel childQuery = GetQuery(childDimension);

                // Añade la query si realmente hay algo que añadir
                if (childQuery != null)
                {
                    childsQueries.Add(childQuery);
                }
            }
            // Añade las consultas con las dimensiones hija
            if (childsQueries.Count > 0)
            {
                foreach (QueryModel childQuery in childsQueries)
                {
                    QueryJoinModel join = new QueryJoinModel(QueryJoinModel.JoinType.Inner, childQuery, $"child_{childQuery.Alias}");

                    // Asigna las relaciones
                    foreach (DimensionRelationModel relation in dimension.Relations)
                    {
                        if (relation.Dimension.Id.Equals(childQuery.SourceId, StringComparison.CurrentCultureIgnoreCase))
                        {
                            foreach (RelationForeignKey foreignKey in relation.ForeignKeys)
                            {
                                join.Relations.Add(new QueryRelationModel(foreignKey.ColumnId, childQuery.FromAlias, foreignKey.TargetColumnId));
                            }
                        }
                    }
                    // Añade la unión
                    query.Joins.Add(join);
                }
            }
            // Devuelve la consulta
            return(query);
        }
        /// <summary>
        ///		Crea un JOIN con una dimensión
        /// </summary>
        private QueryJoinModel CreateJoin(DimensionModel dimension, DimensionRelationModel relation, List <QueryModel> dimensionQueries)
        {
            QueryModel     query        = new QueryModel(dimension.Id, QueryModel.QueryType.Dimension, dimension.Id);
            QueryJoinModel join         = new QueryJoinModel(QueryJoinModel.JoinType.Inner, query, dimension.Id);
            QueryModel     relatedQuery = dimensionQueries.FirstOrDefault(item => item.SourceId.Equals(dimension.Id, StringComparison.CurrentCultureIgnoreCase));

            // Asigna los datos apropiados a la consulta (sólo necesitamos los nombres de tabla)
            query.Prepare(dimension.Id, dimension.Id);
            // Añade las relaciones
            if (relatedQuery != null)
            {
                foreach (RelationForeignKey column in relation.ForeignKeys)
                {
                    QueryFieldModel relatedField = relatedQuery.Fields.FirstOrDefault(item => item.Field.Equals(column.TargetColumnId, StringComparison.CurrentCultureIgnoreCase));

                    if (relatedField != null)
                    {
                        join.Relations.Add(new QueryRelationModel(column.ColumnId, relatedQuery.Alias, relatedField.Alias));
                    }
                }
            }
            // Devuelve el join
            return(join);
        }