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 SubE 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…








