Back-End

23 jan, 2014

Entity Framework 5 – Retornando objetos usando comandos SQL – Parte 02

Publicidade

Na primeira parte deste artigo vimos como executar comandos SQL contra uma fonte de dados em um projeto que usa o Entity Framework onde realizamos uma inclusão de no banco de dados. Hoje veremos como podemos retornar objetos do nosso modelo usando comandos SQL.

Vamos usar o mesmo cenário montado para a primeira parte do artigo. Lembrando que estamos usando um banco de dados SQL Server chamado Cadastro.mdf e uma tabela Pagamentos, conforme a estrutura abaixo:

ef_sql12 (1)

Vamos usar o mesmo projeto criado no artigo anterior, então, abra o Visual Studio 2012 Express for desktop e abra o projeto EF_ExecutandoComandosSQL. Vamos executar uma instrução SQL que retorna uma coleção de instâncias do tipo da entidade Pagamento.

Como vimos no artigo anterior, o método ExecuteStoreCommand() é semelhante ao método ExecuteNonQuery e executa uma instrução SQL retornando o numero de linhas afetadas.

Para materializar os objetos a partir do nosso model podemos usar o comando ExecuteStoreQuery no contexto do objeto; assim vamos implementar a funcionalidade para executar uma instrução SQL e receber de volta uma coleção de instâncias do tipo da entidade Pagamento.

Vamos incluir no formulário form1.vb do projeto 2 novos botões de comando:

  • Name=btnAdicionarObjetos Text=Adicionar Objetos
  • Name=btnRetornarObjetos Text=Retornar Objetos

Defina no formulário form1.vb o seguinte leiaute usando os dois controles Buttons:

ef_sql21

No evento Click do botão de comando – Adicionar Objetos – temos o código abaixo:

Private Sub btnAdicionarObjetos_Click(sender As Object, e As EventArgs) Handles btnAdicionarObjetos.Click
        Using context = New CadastroEntities()
            context.Pagamentos.Add(New Pagamento() With {.valor = 125D, .vendedor = "Microsoft"})
            context.Pagamentos.Add(New Pagamento() With {.valor = 325D, .vendedor = "Apple"})
            context.Pagamentos.Add(New Pagamento() With {.valor = 500D, .vendedor = "Microsoft"})
            context.Pagamentos.Add(New Pagamento() With {.valor = 100D, .vendedor = "Motorola"})
            context.SaveChanges()
        End Using
    End Sub

Este código apenas cria uma instância do nosso contexto (CadastroEntities) e usando o método Add no DbSet inclui quatro novas entidades ao contexto. Dessa forma estamos incluindo as entidades com o estado Added, significando que elas serão definitivamente inseridas no banco de dados quando o método SaveChanges() for chamado.

No evento Click do botão de comando – Retornar Objetos – inclua o código a seguir:

Private Sub btnRetornarObjetos_Click(sender As Object, e As EventArgs) Handles btnRetornarObjetos.Click
        Using context = New CadastroEntities()
            Dim sql As String = "select * from Pagamentos where vendedor = @Vendedor"

            Dim args = New DbParameter() {New SqlParameter() With {.ParameterName = "Vendedor", .Value = "Microsoft"}}
            Dim pagamentos = context.Database.SqlQuery(Of Pagamento)(sql, args)

            lsbResultado.Items.Add("Pagamentos incluídos...")
            For Each pag In pagamentos
                lsbResultado.Items.Add("Objetos retornados : " & pag.vendedor & " - " & pag.valor)
            Next
        End Using
    End Sub

O código cria uma instância do nosso contexto e define uma instrução sql para retornar os vendedores usando o parâmetro definido como @Vendedor.

A seguir definimos o nome do parâmetro e o valor do mesmo como argumentos que serão usados pelo SqlQuery.

O método é SqlQuery no DbSet permite realizar uma consulta SQL para retornar instâncias de uma entidade. Os objetos retornados serão rastreados pelo contexto como se eles fossem devolvidos por consulta LINQ.

Podemos usar o método SqlQuery sem parâmetros : Dim teste = context.Pagamentos.SqlQuery(“Select * from Pagamentos”).ToList(). No exemplo estamos definindo o parâmetro @Vendedor e incluindo o seu nome valor na coleção DbParameter().

A seguir, executamos o comando e retornamos os objetos incluídos que atendem ao critério da consulta SQL executada obtemos o seguinte resultado:

ef_sql22

Nota: Nas versões anteriores o método ExecuteStoreQuery() atuava de forma similar a este método.

Segue o projeto completo aqui: EF_ExecutandoComandosSQL_2.zip