É evidente que muitas vezes precisamos realizar uma consulta no banco e trazer algumas colunas de uma única tabela. Pois bem, fazer isso é muito simples, mas infelizmente, ao realizar essa tarefa no LINQ acontece uma surpresa, surpresa não, exception mesmo, sendo mais específica a NotSupportedException.
Vamos falar e forma de código, que é bem mais simples.
Repare que no código abaixo eu busco três colunas da tabela empresa.
Ao executar o ToList(), a NotSupportedException é lançada dizendo:
Explicit construction of entity type 'ConsoleApplication1.Empresa' in query is not allowed
Certo, mas que é isso afinal? Para falar a verdade, eu não sei
, não achei nenhuma resposta “concreta”, mas o obvio, é que não da para usar o construtor de Empresa na query. Fiz vários testes o que pude perceber, é que o problema está no atributo Table da classe:
Remove-lo está fora de cogitação. Nos fóruns encontrei várias respostas que não achei legal, uma delas era usar somente o new no select, para que crie um objeto anônimo, e então fazer um for criando uma lista do objeto desejado e por fim retorná-lo. Funciona, mas imagina fazer isso em todos os métodos de busca, é viável. Então criei ate uma função “Converter” que usando reflection criava uma instancia do objeto desejado e setava as propriedades usando os valores que estava no objeto anonimo. E confesso, seu eu não fiz um POG eu cheguei perto
. Não me culpem, eu precizava de uma solução e não tinha tempo.
Então estudando mais, eu e um amigo de trabalho, conseguimos encontrar uma solução mais elegante. A solução é a seguinte:
- Para todos os objetos de persistência será criado outro objeto que o herdará
- No select da query, ele será usado para criar as instancias
- Por fim, será executado um Cast<ObjetoPersistente>(), assim agora podemos executar o ToList() e retornar a lista tipado com o objeto da persistência
Codificando a solução:
A Herença:
O método listar reescrito:
Se alguem encontrar uma solução melhor, por favor comente!
Be the first to rate this post
- Currently 0/5 Stars.
- 1
- 2
- 3
- 4
- 5