1
resposta

Erro column does not exist ao utilizar uma string sql pelo Fromsql ( entity)

Tenho uma classe com as propriedades (nome, tipo , arquivo , setor). quero fazer um filtro onde o front me enviara um desses ou todos parametros via json e executarei um select de acordo com os parametros que receberei. Pra isso criei um dicionario com chave e valor e montei uma string sql atraves de um loop acrescentando os valores desse dicionario na string. ou seja: exemplo: ComandoSql = @"select * from documento where "; no loop vou acrescentando os parametros do where : exemplo: ComandoSql = ComandoSql + chave + "=" + valor ao final, a string sql podera ficar assim: select * from documento where nome_documento=quertt and id_tipo=1 and id_arquivo =1 and id_setor=1

apos o lopp eu utilizo o contexto.minhaentidade.fromsql(ComandoSql) e ele me retorna esse erro do banco dizendo que a column nao existe. levando em consideração que as propriedades da minha entidade nao tem os mesmos nomes da colunas da tabela, acredito que o erro está ai. Mas como posso resolver esse problema?

insira seu código aqui

public IEnumerable Filtro(DocumentosModel doc)

         Dictionary<string, string> listaDocumento = new Dictionary<string, string>();

         listaDocumento.Add("nome_documento", doc.NomeDocumento);
         listaDocumento.Add("id_tipo", Convert.ToString(doc.FkTipo));
         listaDocumento.Add("id_arquivo", Convert.ToString(doc.FkArquivo));
         listaDocumento.Add("id_setor", Convert.ToString(doc.FkSetor));


         ComandoSql = @"select * from documento where ";
         foreach (KeyValuePair<string, string> x in listaDocumento)
         {

             var chave = x.Key;
             var valor = x.Value;

             if (valor != null)
             {
                 CampoValido ++;

                 if (CampoValido > 1)
                 {
                     ComandoSql = ComandoSql + " and ";
                 }

                 ComandoSql = ComandoSql + chave + "=" + valor ;


             }

         }

        var consulta = contexto.documentos.FromSql(ComandoSql);



        return consulta;


   }
1 resposta

Olá Luiz, tudo certo?

Encontrei na documentação, umas anotações para fazer o binding da propriedade com o nome da coluna. Segue o exemplo:

public class Blog
{
    [Column("blog_id")]
    public int BlogId { get; set; }
    public string Url { get; set; }
}

Com isso, a propriedade BlogId será enviada na query como blog_id.

Outro modo é definir o binding diretamente no contexto da aplicação, alterando as informações fazendo o override do método OnModelCreating(). Segue o mesmo exemplo com esse modo:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Blog>()
        .Property(b => b.BlogId)
        .HasColumnName("blog_id");
}

Para mais informações, segue o link.

Espero ter ajudado!