예제 #1
0
        /// <summary>
        /// Formata o texto de uma <see cref="QueryInfo" />
        /// </summary>
        /// <param name="queryInfo"></param>
        /// <param name="ignoreContainerFormat">Identifica que é para ignorar a formatação de de container para a consulta.</param>
        /// <returns></returns>
        private MySqlQueryParser Format(QueryInfo queryInfo, bool ignoreContainerFormat = false)
        {
            var parser = new MySqlQueryParser(this.Translator, this.TypeSchema)
            {
                Query            = queryInfo,
                Owner            = this,
                UseTakeParameter = true
            };

            foreach (var parameter in queryInfo.Parameters)
            {
                if (!this.Query.Parameters.Any(f => f.Name == parameter.Name))
                {
                    this.Query.Parameters.Add(parameter);
                }
            }
            if (!ignoreContainerFormat)
            {
                Append('(');
            }
            Append(parser.GetText());
            if (!ignoreContainerFormat)
            {
                Append(')');
            }
            return(this);
        }
예제 #2
0
        /// <summary>
        /// Adiciona ao campo string builder o texto correspondente a parte SELECT da query
        /// </summary>
        /// <returns>Retorna o próprio objeto</returns>
        private MySqlQueryParser SelectParser()
        {
            if (Query.IsSelectDistinct)
            {
                Append("SELECT DISTINCT ");
            }
            else
            {
                Append("SELECT ");
            }
            ITypeMetadata mainTypeMetadata = null;

            for (int i = 0; i < Query.Entities.Length; i++)
            {
                if (string.IsNullOrEmpty(Query.Entities[i].FullName))
                {
                    continue;
                }
                ITypeMetadata typeMetadata = null;
                if (!Query.IgnoreTypeSchema)
                {
                    typeMetadata = TypeSchema.GetTypeMetadata(Query.Entities[i].FullName);
                    if (typeMetadata == null)
                    {
                        throw new InvalidOperationException(ResourceMessageFormatter.Create(() => Properties.Resources.InvalidOperationException_TypeMetadataNotFoundByFullName, Query.Entities[i].FullName).Format());
                    }
                }
                if (i == 0)
                {
                    mainTypeMetadata = typeMetadata;
                    if (string.IsNullOrEmpty(Query.Entities[i].Alias))
                    {
                        Query.Entities[i].Alias = "main";
                    }
                }
                else if (string.IsNullOrEmpty(Query.Entities[i].Alias))
                {
                    Query.Entities[i].Alias = "main" + i.ToString();
                }
            }
            EntityInfo entity = Query.Entities[0];

            if (!string.IsNullOrEmpty(entity.FullName))
            {
                if (Query.Projection == null)
                {
                    if (mainTypeMetadata != null && mainTypeMetadata.IsVersioned)
                    {
                        Query.HasRowVersion = true;
                    }
                    var properties = mainTypeMetadata != null?mainTypeMetadata.Where(f => f.Direction == Data.Schema.DirectionParameter.Input || f.Direction == Data.Schema.DirectionParameter.InputOutput).ToArray() : new IPropertyMetadata[0];

                    if (properties.Length == 0)
                    {
                        throw new InvalidOperationException(ResourceMessageFormatter.Create(() => Properties.Resources.InvalidOperationException_NotFoundPropertiesForTypeMetadata, entity.FullName).Format());
                    }
                    Query.Projection = new Projection();
                    for (var i = 0; i < properties.Length; i++)
                    {
                        var prop = properties[i];
                        Query.Projection.Add(new ProjectionEntry(string.Format("{0}.{1}", entity.Alias, prop.Name), prop.Name));
                        var translateName       = Translator.GetName(entity, prop.Name, Query.IgnoreTypeSchema);
                        var translateColumnName = translateName as TranslatedColumnName;
                        if (translateColumnName != null)
                        {
                            if (!string.IsNullOrEmpty(translateColumnName.TableAlias))
                            {
                                AppendQuoteExpression(translateColumnName.TableAlias).Append('.');
                            }
                            AppendQuoteExpression(translateColumnName.Name);
                        }
                        if (prop.ColumnName != prop.Name)
                        {
                            Append(" AS ").AppendQuoteExpression(FormatProjectionAlias(prop.Name));
                        }
                        if (i + 1 < properties.Length)
                        {
                            Append(',');
                        }
                    }
                    Append(' ');
                }
                else
                {
                    ProjectionParser();
                }
                if (Query.HasRowVersion)
                {
                }
                var tableName = Translator.GetName(entity, Query.IgnoreTypeSchema);
                if (tableName == null)
                {
                    throw new InvalidOperationException(string.Format("Not found table name for entity '{0}'", entity.FullName));
                }
                Append("FROM ").AppendTranslatedName(tableName).Append(' ').AppendQuoteExpression(entity.Alias).Append(' ');
            }
            else
            {
                var sqlParser = new MySqlQueryParser(Translator, TypeSchema)
                {
                    Query            = entity.SubQuery,
                    UseTakeParameter = true
                };
                var subQueryText = sqlParser.GetText();
                if (Query.Projection == null)
                {
                    Query.Projection = new Projection();
                    foreach (var column in entity.SubQuery.Projection)
                    {
                        Query.Projection.Add(new ProjectionEntry(!string.IsNullOrEmpty(entity.Alias) ? string.Format("{0}.{1}", entity.Alias, string.IsNullOrEmpty(column.Alias) ? (string.IsNullOrEmpty(column.GetColumnInfo().Alias) ? column.GetColumnInfo().Name : column.GetColumnInfo().Alias) : column.Alias) : column.Alias, column.Alias));
                    }
                }
                ProjectionParser();
                Append("FROM (").Append(subQueryText).Append(") ").AppendQuoteExpression(entity.Alias);
            }
            return(this);
        }