Comentários

Comment RSS

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 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 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().ToList(); 
} 

 

Se alguem encontrar uma solução melhor, por favor comente!

Currently rated 4.0 by 2 people

  • Currently 4/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Feb
13
Na busca de uma arquitetura e implementações em três camada usando LINQ encontrei um exemplo no Eric Hauser?s Blog. Foi a implementação mais próximado do que eu estava querendo. O LINQ é sem duvida o futuro, mas trabalhar em três camada ainda não está legal, o nosso amigo DataContext não está ajudando.

Currently rated 2.5 by 2 people

  • Currently 2.5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

LINQ

Tags:

Feb
06

Ler um RSS sem o uso do LINQ é preciso usar algumas estruturas de repetições, que pode até deixar o algoritmo um pouco confuso. A algum tempo atrás eu fiz um leitor de RSS em PHP (está hospedado no PHP Brasil), ficou em um ótimo algoritmo, mas deve ter dado 3x mais linha do que agora com o LINQ. 

Sempre me perguntei "Como será uma linguagem sem usar as comuns estruturas de condições e repetições?", mas depois que li um RSS usando LINQ, eu percebi minha pergunta já estava sendo respondida. Acredito que o LINQ será o PAI das novas linguagens.

Mas chega de tanto blablabla, abaixo está o exemplo:

Em C#:
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
        CarregaRss(@"http://feeds.feedburner.com/magodigital");
}


protected void CarregaRss(string url)
{
    XDocument feedDoc = XDocument.Load(url);
    var query = from feed in feedDoc.Descendants("channel")
                select new
                {
                    Titulo = feed.Element("title").Value,
                    Descricao = feed.Element("description").Value,
                    Link = feed.Element("link").Value,
                    Itens = (from feedItens in feed.Descendants("item")
                             select new
                             {
                                 Titulo = feedItens.Element("title").Value,
                                 Link = feedItens.Element("link").Value,
                                 Descricao = feedItens.Element("description").Value
                             }).ToList()
                };
    var rss = query.Single();

    LblTitulo.Text = rss.Titulo;
    LblDescricao.Text = rss.Descricao;
    HypLink.Text = HypLink.NavigateUrl = rss.Link;
    GridItems.DataSource = rss.Itens;
    GridItems.DataBind();
}

Em Asp.NET:

<form id="form1" runat="server">
    Titulo :  <asp:Label ID="LblTitulo" runat="server" />
    Descricao: <asp:Label ID="LblDescricao" runat="server" />
    Link:  <asp:HyperLink ID="HypLink" runat="server" />
    <asp:GridView ID="GridItems" runat="server" />
</form> 

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

.NET | ASP.NET | LINQ

Tags: ,

Jan
30

LINQ to JavaScript

Publicado às: 08:04 Comments (0)

Encontrei no CodePlex um LINQ to JavaScript, muito legal a idéia de criar um LINQ para JavaScript, mas é claro que não fico nativo da linguagem. Na verdade é uma biblioteca com as funções From, Where, Select. Ficou bem parecido com o famoso Hibernate do Java, que você no fim acaba construindo uma query usando somente métodos estáticos.

Para falar a verdade eu achei mais interessante do que usual Laughing. Em JavaScript é bem mais comum trabalhar com objetos DOM do que com arrays, criei uma tabela bem simples em HTML para usar o JSLinq, mas no fim vi que aquilo não era tão util, talvez eu não estava inspirado. No site tem um exemplo de como utiliza-lo em arrays, ai sim, ficou muito legal brincar. Mas de todo jeito valeu a pena conferir.

Be the first to rate this post

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Designer Original Binary Bonsai | Adaptado para MagoDigital | BlogEngine.NET