Pílula de Entity Framework 4 - Novas operações


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 eu quero abordar 4 novos métodos que podemos usar no Entity Framework 4.0:

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 e 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;

A 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;

Fig 1.0 Fig 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 leiaute abaixo:

A idéia básica e 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:

1- 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 selecionado 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

        Using (contexto)

            'executa uma consulta usando Contains que retorna uma coleção
            Dim containsExemplo = From f In contexto.Products
                                                 Where f.ProductName.Contains(txtContains.Text)
                                                Select f.ProductName

            'limpa o listbox
            lstbDados.Items.Clear()

            'lista todos ou somente o primeiro
            If rdbExibirPrimeiro.Checked = True Then
                lstbDados.Items.Add(containsExemplo.First())
            Else
                For Each a In containsExemplo
                    lstbDados.Items.Add(a)
                Next
            End If
        End Using

    End Sub

2- 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
        Using (contexto)

            Try
                'executa uma consulta usando Single
                'retorna o unico elemento da sequencia
                'retorna uma exceção se não existir somente um elemento
                Dim SingleExemplo = (From f In contexto.Products
                                                 Where f.ProductName.Contains(txtSingle.Text)
                                                  Select f.ProductName).Single


                'limpa o listbox
                lstbDados.Items.Clear()

                'lista o único retornado
                lstbDados.Items.Add(SingleExemplo)

            Catch ex As Exception
                lblmsg.Text = ex.Message
            End Try
        End Using

    End Sub
3- 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;  isto 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
        Try
            'executa uma consulta usando SingleOrDefault
            'retorna somente um elemento da sequencia
            'ou retorna o elemento padrão (pode ser nulo)
            Dim SingleOrDefaultExemplo = (From f In contexto.Products
                                                            Where f.ProductName.Contains(txtSingleOrDefault.Text)
                                                           Select f.ProductName).SingleOrDefault()

            'limpa o listbox
            lstbDados.Items.Clear()

            'lista o único retornado
            lstbDados.Items.Add(SingleOrDefaultExemplo)
        Catch ex As Exception
            lblmsg.Text = ex.Message
        End Try
    End Sub
4- DefaultIfEmpty

O método DefatulIfEmpty irá retornar uma coleção ou se nada for encontrado irá retornado o 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

        Try
            'executa uma consulta usando DefaultIfEmpty
            'retorna somente um elemento da sequencia
            'ou retorna um texto se nada for encontrado
            Dim DefaultIfEmptyExemplo = (From f In contexto.Products
                                                           Where f.ProductName.Contains(txtDefaultIfEmpty.Text)
                                                           Select f.ProductName).DefaultIfEmpty("Não encontrado")

            'limpa o listbox
            lstbDados.Items.Clear()

            'temos que usar o First pois retorna uma coleção
            lstbDados.Items.Add(DefaultIfEmptyExemplo.First)

        Catch ex As Exception
            lblmsg.Text = ex.Message
        End Try
    End Sub

E com isso apresentei os quatro novos recursos do Entity Framework 4.0.

Aguarde mais artigos sobre o Entity Framework.

Pegue o projeto completo aqui: EF4_NovosRecursos.zip

Eu sei é apenas EF mas eu gosto...

Referências:


José Carlos Macoratti