Dev (Back & Front)ARTIGO

Apresentando novos recursos do Entity Framework 4.0: Contains, Single, SingleOrDefault e DefaultEmpty

Existem muitos recursos novos no Entity Framework 4.0, sem contar que uma nova atualização já esta prevista para breve, mas vamos devagar e sempre.

Neste artigo, quero abordar quatro novos métodos que podemos usar no Entity Framework 4.0:

  • Contains(),
  • Single(),
  • SingleOrDefault()
  • DefaultIfEmpty().

Para isso, eu vou usar o Visual Web Developer 2010 Express Edition (poderia ter usado qualquer ferramenta da nova versão da plataforma .NET) e criar um projeto Web chamado EF4_NovosrRecursos (poderia criar um projeto console, ou Windows application, fique à vontade).

Em seguida, vamos definir um Entity Data Model(EDM) para o banco de dados Northwind.mdf do SQL Server 2005 apenas para testarmos os novos recursos. No menu Project -> Add New Item, selecione ADO .NET Entity Data Model, informe o nome Northwind.edmx e clique em Add.

A seguir, selecione a opção Generate from database e clique em Next>. Selecione a conexão com o banco de dados Northwind.mdf e aceite a opção para salvar a entity connection no arquivo Web.Config com o nome NorthwindEntities e clique em Next>.

A seguir, vamos selecionar uma tabela para realizar o mapeamento ORM. No nosso exemplo, eu vou usar a tabela Products. Marque as opções conforme indicado abaixo e aceite o nome padrão para o Model: NorthwindModel.

Ao final, veremos a entidade Product gerada pelo EDM mapeando os campos da tabela Products na figura 1.0. Na figura 2.0, vemos o Model Browser com as respectivas entidades e tabelas, bem como o nome do Context gerado: NorthwindEntities.

Figura 1.0

Figura 2.0

Agora já temos tudo pronto para mostrar os novos recursos do EF4.

Vamos incluir uma página Web no projeto, menu Project -> Add New Item -> Web Form com o nome Default.aspx. A seguir, inclua no formulário web os controles: TextBox, Button, ListBox e Label, conforme o layout abaixo:

A idéia básica é permitir a execução de consultas usando a entidade mapeada e exibir o resultado no controle ListBox(lstbDados) do formulário web. No arquivo code-behind Default.aspx.vb, vamos definir primeiro o contexto que vamos usar declarando: Dim contexto As New NorthwindEntities.

Em seguida, vamos usar cada evento Click dos botões para incluir o código correspondente. Vejamos cada um deles:

  • Contains()

O método Contains() realiza uma comparação case insensitive (não leva em conta maiúsculas e minúsculas) com partes da palavra no campo. Como o método retorna uma coleção, temos que usar o .First() mesmo se existir somente um único item na coleção.

A seguir, temos o código do evento Click que recebe o texto informado pelo usuário em txtContains.Text a ser comparado com o nome do produto. Em seguida, verificamos se foi selecionada a exibição de somente um elemento ou de todos os elementos para exibir o resultado usando ou não o método First().

Protected Sub btnContais_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnContais.Click<br /><br />        Using (contexto)<br /><br />            'executa uma consulta usando Contains que retorna uma coleção<br /><strong>   Dim containsExemplo = From f In contexto.Products<br />                                                 Where f.ProductName.Contains(txtContains.Text)<br />                                                Select f.ProductName</strong><br /><br />            'limpa o listbox<br />            lstbDados.Items.Clear()<br /><br />            'lista todos ou somente o primeiro<br />            If rdbExibirPrimeiro.Checked = True Then<br /><strong> lstbDados.Items.Add(containsExemplo.First())</strong><br />            Else<br /><strong> For Each a In containsExemplo<br />                    lstbDados.Items.Add(a)<br />                Next</strong><br />            End If<br />        End Using<br /><br />    End Sub
  • Single()

O método Single() é usado no exemplo na mesma consulta, mas desta vez somente retorna um único item, logo não precisamos usar o método. First(). Se houver mais de um item retornado, irá ocorrer uma exceção.

Protected Sub btnSingle_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSingle.Click<br />        Using (contexto)<br /><br />            Try<br />                'executa uma consulta usando Single<br />                'retorna o unico elemento da sequencia<br />                'retorna uma exceção se não existir somente um elemento<br /><strong>  Dim SingleExemplo = (From f In contexto.Products<br />                                                 Where f.ProductName.Contains(txtSingle.Text)<br />                                                  Select f.ProductName).Single</strong><br /><br /><br />                'limpa o listbox<br />                lstbDados.Items.Clear()<br /><br />                'lista o único retornado<br />                lstbDados.Items.Add(SingleExemplo)<br /><br />            Catch ex As Exception<br />                lblmsg.Text = ex.Message<br />            End Try<br />        End Using<br /><br />    End Sub
  • SingleOrDefault

A documentação declara que SingleOrDefault retorna um único elemento, um elemento específico de uma sequência de valores, ou o valor padrão se o tal elemento não for encontrado – isso significa que se o mesmo for um tipo complexo, você pode obter um valor null.

Protected Sub btnSingleOrDefault_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnSingleOrDefault.Click<br />        Try<br />            'executa uma consulta usando SingleOrDefault<br />            'retorna somente um elemento da sequencia<br />            'ou retorna o elemento padrão (pode ser nulo)<br /><strong>            Dim SingleOrDefaultExemplo = (From f In contexto.Products<br />                                                            Where f.ProductName.Contains(txtSingleOrDefault.Text)<br />                                                           Select f.ProductName).SingleOrDefault()<br /></strong><br />            'limpa o listbox<br />            lstbDados.Items.Clear()<br /><br />            'lista o único retornado<br />            lstbDados.Items.Add(SingleOrDefaultExemplo)<br />        Catch ex As Exception<br />            lblmsg.Text = ex.Message<br />        End Try<br />    End Sub
  • DefaultIfEmpty

O método DefatulIfEmpty irá retornar uma coleção ou, se nada for encontrado, irá retornar que você passou como resultado. No exemplo usado, se nada for encontrado, o texto “Não encontrado.” será retornado.

Protected Sub btnDefaultIfEmpty_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnDefaultIfEmpty.Click<br /><br />        Try<br />            'executa uma consulta usando DefaultIfEmpty<br />            'retorna somente um elemento da sequencia<br />            'ou retorna um texto se nada for encontrado<br /><strong>Dim DefaultIfEmptyExemplo = (From f In contexto.Products<br />                                                           Where f.ProductName.Contains(txtDefaultIfEmpty.Text)<br />                                                           Select f.ProductName).DefaultIfEmpty("Não encontrado")</strong><br /><br />            'limpa o listbox<br />            lstbDados.Items.Clear()<br /><br />            'temos que usar o First pois retorna uma coleção<br />            lstbDados.Items.Add(DefaultIfEmptyExemplo.First)<br /><br />        Catch ex As Exception<br />            lblmsg.Text = ex.Message<br />        End Try<br />    End Sub

E com isso apresentei os quatro novos recursos do Entity Framework 4.0. Aguarde mais artigos sobre o Entity Framework.

Aproveite para pegar o projeto completo aqui: 
EF4_NovosRecursos.zip

Eu sei, é apenas EF, mas eu gosto…

Referências:

é referência em Visual Basic no Brasil e autor dos livros "Aprenda Rápido: ASP" e "ASP, ADO e Banco de Dados na Internet". Mantenedor do site macoratti.net.

Ver perfil