Jul
14

É 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.

 
public List<Empresa> ListarNomeTodasEmpresas() 
    var query = from e in DBContext.Empresas 
                orderby e.RazaoSocial 
                select new Empresa 
                { 
                    EmpresaID = e.EmpresaID, 
                    RazaoSocial = e.RazaoSocial, 
                    NomeFantasia = e.NomeFantasia 
                }; 
 
    return query.ToList(); 

 

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 Embarassed, 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:

[Table(Name="dbo.Empresa")] 
public partial class Empresa : INotifyPropertyChanging, INotifyPropertyChanged 
{...} 

 

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 Embarassed. 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:

  1. Para todos os objetos de persistência será criado outro objeto que o herdará 
  2. No select da query, ele será usado para criar as instancias
  3. 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:

public class EmpresaResult : Empresa 
{} 

 

O método listar reescrito:

public List<Empresa> ListarNomeTodasEmpresas() 
    var query = from e in DBContext.Empresas 
                orderby e.RazaoSocial 
                select new EmpresaResult 
                { 
                    EmpresaID = e.EmpresaID, 
                    RazaoSocial = e.RazaoSocial, 
                    NomeFantasia = e.NomeFantasia 
                }; 
 
    return query.Cast<Empresa>().ToList(); 

 

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

Add comment


 

  Country flag

biuquote
Loading



Search


Novidades no seu e-mail


Recent posts

Recent comments

Designer Original Binary Bonsai | Adaptado para MagoDigital | BlogEngine.NET