MELHORES PRÁTICAS - .NET CORE

 Tópico anterior Próximo tópico Novo tópico

MELHORES PRÁTICAS - .NET CORE

C#

 Compartilhe  Compartilhe  Compartilhe
#490776 - 16/10/2019 15:14:43

MICROSOFTP
PORTO FELIZ
Cadast. em:Outubro/2019


Boa tarde, estou começando meus estudos com webapi com .net core.
Porém, é um projeto sem orm (ou seja, direto no banco).

Uso listas para receber dados do banco (por exemplo)
  

public List<Numerador_mdfe> Numerador_Get_id()
        {
            List<DbParameter> parameterList = new List<DbParameter>();
            List<Numerador_mdfe> Numerador_Lista = new List<Numerador_mdfe>();
            Numerador_mdfe Numerador = null;

            string sql = "SELECT top 1 Numerador001,Numerador002,acesso FROM Numerador_mdfe order by Numerador001";
            using (DbDataReader dataReader = base.GetDataReader(sql,
                                                                parameterList,
                                                                CommandType.Text))
            {
                if (dataReader != null && dataReader.HasRows)
                {
                    while (dataReader.Read())
                    {
                        Numerador = new Numerador_mdfe();
                        Numerador.Numerador001 = (string)dataReader["Numerador001"].ToString().Trim();
                        Numerador.Numerador002 = Convert.ToInt32(dataReader["Numerador002"]);
                        Numerador.acesso = Convert.ToString(dataReader["acesso"].ToString().Trim());
                        Numerador_Lista.Add(Numerador);
                    }
                }
            }
            return Numerador_Lista;
        }


Porém, em uma rotina eu busco a lista:

  
      DAO_Bases Base = new DAO_Bases();
          List<Model.Numerador_mdfe> MDFE_NG;
          MDFE_NG = Base.Numerador_Get_id();


A minha dúvida, é:
Existe uma forma simples de transformar a lista do tipo  Numerador_mdfe em um objeto Numerador_mdfe?

Ou só fazendo um for each e adicionando?
Ou alguém tem uma abordagem melhor, nesse caso?



#490778 - 16/10/2019 16:01:13

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Sugiro a implementação de um ORM simplificado como o Dapper;

Quanto à sua dúvida, o que você está querendo se chama tecnicamente de "mapeamento" ou Mapping. E à mão, não existe uma maneira simples de fazer isso sem loops. Aí é que entra o Dapper, ele faz toda essa parte pra você de forma muito transparente e simples. Sugiro ao menos tentar usar, com certeza vai ser benéfico pra você. Não requer grandes mudanças no seu código, o que já está pronto, fica pronto, mas você pode usar para coisas novas.

_______________________________________________________________________
Virei Oráculo!
The end is nigh, be ready for the nukes!


#490782 - 16/10/2019 16:16:08

MICROSOFTP
PORTO FELIZ
Cadast. em:Outubro/2019


Eu sei, mas, não deixaram usar orm nesse projeto (por motivos que nem vou cair muito nisso, porque não vão mudar).

Eu estava pensando em criar uma rotina genérica que pudesse pegar a lista de um tipo e converte-se em um objeto do mesmo tipo.
Para facilitar código... mas, ainda em estudo de como fazer isso tecnicamente.

Seria viável?



#490783 - 16/10/2019 16:26:18

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Bem, eu tenho uma série de vídeos que você poderia aproveitar, ele faz mais ou menos isso que você quer.

Mas realmente não consigo entender a razão de "definitivamente não poder usar" um ORM.

_______________________________________________________________________
Virei Oráculo!
The end is nigh, be ready for the nukes!


#490784 - 16/10/2019 16:47:06

F001E
IBITINGA/SP
Cadast. em:Novembro/2004


Citação:
Sugiro a implementação de um ORM simplificado como o Dapper;


O Dapper voce pode trabalhar com ele tipado ou não tipado. Não tipado voce monta os selects na unha do jeito que quer.



Resposta escolhida #490786 - 16/10/2019 18:47:43

FOXMAN
BARRETOS
Cadast. em:Janeiro/2001


Membro da equipe
Citação:
:
Eu sei, mas, não deixaram usar orm nesse projeto (por motivos que nem vou cair muito nisso, porque não vão mudar).

Eu estava pensando em criar uma rotina genérica que pudesse pegar a lista de um tipo e converte-se em um objeto do mesmo tipo.
Para facilitar código... mas, ainda em estudo de como fazer isso tecnicamente.

Seria viável?


Só por curiosidade.
E se vc montar um pequeno ORM no projeto....(ou seja, sem ORM de terceiros. Na verdade um mapper)
Isso eles permitiram ???

Se permitir, da um alo, que lhe auxilio em como fazer algo simples....



Grupo DotNet.Br no FaceBook

Grupo WhatsDev



#490794 - 17/10/2019 08:09:05

MICROSOFTP
PORTO FELIZ
Cadast. em:Outubro/2019


Última edição em 17/10/2019 08:11:59 por MICROSOFTP

Citação:
:
:
Eu sei, mas, não deixaram usar orm nesse projeto (por motivos que nem vou cair muito nisso, porque não vão mudar).

Eu estava pensando em criar uma rotina genérica que pudesse pegar a lista de um tipo e converte-se em um objeto do mesmo tipo.
Para facilitar código... mas, ainda em estudo de como fazer isso tecnicamente.

Seria viável?

Só por curiosidade.
E se vc montar um pequeno ORM no projeto....(ou seja, sem ORM de terceiros. Na verdade um mapper)
Isso eles permitiram ???

Se permitir, da um alo, que lhe auxilio em como fazer algo simples....

Fox, tudo bem?
Não sei lhe dizer, tem muita coisa legada aqui e o pessoal meio que não quer mudar como era... eu nem vou ficar discutindo isso, porque isso só me stressa, então prefiro focar na solução.

A maneira como montei, meio que funciona como um orm simplificado (Seguindo meio que o padrão da casa).
O único problema mesmo, é que eu gostaria de ter um método genérico que convertese uma lista de um tipo e retornasse o obejto desse tipo.
Exemplo: Uma list do tipo 'agua' em um objeto 'agua', 'fogo' em objeto 'fogo'...  e assim vai.

Estou lendo sobre reflection... se conseguir isso, com certeza meus problemas ficam bem mais simples e vou economizar muito código.




#490796 - 17/10/2019 08:51:04

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Bem, novamente então sugiro os vídeos do meu canal, incluindo essa parte do Reflection que começa aqui

_______________________________________________________________________
Virei Oráculo!
The end is nigh, be ready for the nukes!


#490797 - 17/10/2019 09:14:16

LVFIOROT
SERRA
Cadast. em:Março/2012


Última edição em 17/10/2019 11:01:08 por LVFIOROT

Esse pessoal é engraçado né!!!
Quer usar novas tecnologias, mas com as "velhas" formas de programar/pensar....




#490807 - 17/10/2019 13:22:51

FOXMAN
BARRETOS
Cadast. em:Janeiro/2001


Membro da equipe
Citação:
:
:
:
Eu sei, mas, não deixaram usar orm nesse projeto (por motivos que nem vou cair muito nisso, porque não vão mudar).

Eu estava pensando em criar uma rotina genérica que pudesse pegar a lista de um tipo e converte-se em um objeto do mesmo tipo.
Para facilitar código... mas, ainda em estudo de como fazer isso tecnicamente.

Seria viável?

Só por curiosidade.
E se vc montar um pequeno ORM no projeto....(ou seja, sem ORM de terceiros. Na verdade um mapper)
Isso eles permitiram ???

Se permitir, da um alo, que lhe auxilio em como fazer algo simples....

Fox, tudo bem?
Não sei lhe dizer, tem muita coisa legada aqui e o pessoal meio que não quer mudar como era... eu nem vou ficar discutindo isso, porque isso só me stressa, então prefiro focar na solução.

A maneira como montei, meio que funciona como um orm simplificado (Seguindo meio que o padrão da casa).
O único problema mesmo, é que eu gostaria de ter um método genérico que convertese uma lista de um tipo e retornasse o obejto desse tipo.
Exemplo: Uma list do tipo 'agua' em um objeto 'agua', 'fogo' em objeto 'fogo'...  e assim vai.

Estou lendo sobre reflection... se conseguir isso, com certeza meus problemas ficam bem mais simples e vou economizar muito código.


Então, eu tenho algo semelhante, mas dentro do que citei acima....
Por exemplo...
Tenho um Objeto do tipo PedidosProdutos.
Ao lançar um item, tenho uma função que busca as informações do Produto lançado e converte ele em um PedidosProdutos.
Algo como :

PedidosProdutos pp;
pp = Controle.RetornaProduto();


A função RetornaProduto()...faz basicamente o seguinte :

PedidosProdutos pedidosProdutos = new PedidosProdutos();
            PropertyInfo[] propertyinfos = pedidosProdutos.GetType().GetProperties();
            foreach (var item in propertyinfos)
            {
                MapearAtributo map = item.GetCustomAttribute<MapearAtributo>(true);
                if (map == null)
                {
                    continue;
                }
                var itemAtributos = item.GetCustomAttribute<MapearAtributo>(true).ColunaProduto.ToUpper();
                var produto = Controle.Produto.GetType().GetProperties().FirstOrDefault(p => p.Name.ToUpper() == item.GetCustomAttribute<MapearAtributo>(true).ColunaProduto.ToUpper());
                if (produto != null)
                {
                    if (itemAtributos != null)
                    {
                        if (itemAtributos.ToUpper() == produto.Name.ToUpper())
                        {
                            try
                            {
                                item.SetValue(pedidosProdutos, Convert.ChangeType(Controle.Produto.GetType().GetProperty(produto.Name).GetValue(Produto), item.PropertyType), null);
                            }
                            catch (Exception)
                            {
                                continue;
                            }
                        }
                    }
                }
            }
            return pedidosProdutos;


Dessa forma retorno um objeto do tipo PedidosProdutos, com base em um objeto Produto.
Obviamente, somente retornará os campos cujo os nomes são iguais. E que nesse caso.
Podes ainda fazer uma Heraça de Produtos para PedidosProdutos.

Agora no seu caso, a sua Lista genérica teria que ter dois campos, um identificando o nome da propriedade, e outro o valor.
Tendo isso em mãos vc poderia fazer um loop na lista, e ir comparando o nome do campo na lista com o nome da propriedade da classe.
Encontrado semelhança, setaria o valor da propriedade como fiz acima.














Grupo DotNet.Br no FaceBook

Grupo WhatsDev



#490808 - 17/10/2019 13:44:55

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Citação:
Dessa forma retorno um objeto do tipo PedidosProdutos, com base em um objeto Produto.
Obviamente, somente retornará os campos cujo os nomes são iguais. E que nesse caso.
Podes ainda fazer uma Heraça de Produtos para PedidosProdutos.

Agora no seu caso, a sua Lista genérica teria que ter dois campos, um identificando o nome da propriedade, e outro o valor.
Tendo isso em mãos vc poderia fazer um loop na lista, e ir comparando o nome do campo na lista com o nome da propriedade da classe.
Encontrado semelhança, setaria o valor da propriedade como fiz acima.


Bem o que você fez é praticamente fio e pavio o que faço nos meus vídeos. Do jeito que mostro com Reflection, é bem genérico, e um único método funciona para qualquer entidade que esteja corretamente decorada com os atributos.


_______________________________________________________________________
Virei Oráculo!
The end is nigh, be ready for the nukes!


 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por MICROSOFTP em 22/10/2019 10:49:57