Back-End

16 out, 2015

Curso Entity Framework – Consultas Projeção

Publicidade

Nesta aula vamos abordar as consultas projeção no Entity Framework: o LINQ-to-Entities e o recurso Projeção (Projection). Para acompanhar a aula você deve ter um conhecimento básico de LINQ.

Veja aqui as aulas anteriores.

A LINQ – Language integrated Query – é um conjunto de recursos introduzidos no .NET Framework 3.5 que permitem a realização de consultas diretamente em base de dados, documentos XML, estrutura de dados, coleção de objetos etc. usando uma sintaxe parecida com a linguagem SQL.

Ao usar aplicativos executados localmente, em alguns cenários, você pode revisar as consultas para refinar ainda mais a quantidade de dados retornada do banco de dados. Uma técnica a ser considerada é o uso de projeções, que permite a você muito mais controle sobre quais dados relacionados são retornados.

Nem o Eager Loading (carregamento imediato), nem o Lazy Loading (carregamento deferido/lento) no Entity Framework permitem que você filtre ou classifique os dados relacionados que estão sendo retornados. Porém, em uma projeção, você pode fazer isso.

A projeção é um processo de seleção de dados em um formato diferente, ao invés de consultar uma entidade específica. Há muitas maneiras de projeção. Vamos ver, agora, alguns estilos.

Recursos usados:

  • Visual Studio 2013 Express for windows desktop
  • Entity Framework 6
  • Banco de dados SQL Server (EscolaDB)

Preparando o ambiente

Crie uma novo solução no VS 2013 Express for Windows desktop com o nome EF6_EscolaDB. No menu File, clique em Add -> New Project e inclua um projeto do tipo Class Library com o mesmo nome da solução.

A seguir, inclua um Entity Data Model no menu PROJET -> Add New Item selecionando o template ADO .NET Entity Data Model e informando o nomeEscolaDB.edmx selecionando todas as tabelas do banco de dados EscolaDB.mdf.

Nota: O ambiente e o banco de dados EscolaDB.mdf forma definidos nas aulas anteriores.

Dessa forma, teremos criado um contexto chamado EscolaDBEntities que iremos usar para acessar as entidades e realizar as consultas.

Após isso, inclua um novo projeto do tipo Console Application com o nome Consultas_Projecao na solução.

Para concluir, inclua uma referência ao projeto Consultas_Projecao para o projeto EF6_EscolaDB, inclua a string de conexão no arquivo App.Config do projeto template e inclua uma referência ao Entity Framework no projeto.

1. First ou FirstOrDefault

Se você deseja obter um único objeto, como um aluno, por exemplo, quando existem muitos alunos com o mesmo nome no banco de dados, você pode usar First ou FirstOrDefault:

  • First: Retorna o primeiro elemento da sequência.
  • FirstOrDefault: Retorna o primeiro elemento da sequência, ou o valor padrão se a sequência está vazia.

Exemplo:

macoratti codigo

No código acima, a linha de código :   ctx.Database.Log = s => System.Diagnostics.Debug.WriteLine(s); exibe o SQL gerado na janela de saída Debug.

A consulta localiza um aluno cujo nome seja igual a ‘Janice’. Com FirstOrDefault() será localizada a primeira ocorrência.

A diferença entre First e FIrstOrDefault é que First() irá lançar uma exceção se não existir dados para o critério informado, ao passo que o FirstOrDefault retorna o valor padrão (null) se não existir dados.

2. Single ou SingleOrDefault

Podemos usar também Single ou SingleOrDefault para obter um único objeto, por exemplo aluno com o nome igual a ‘Janice’, quando não existirem mais de um objeto:

  • Single: Retorna o único elemento de um sequência única.
  • SingleOrDefault: Retorna o único elemento de uma sequência, ou valor padrão, se estiver vazia.

Exemplo:

macoratti codigo 2

Tanto o SingleOrDefault, quanto o Single irão lançar uma exceção, se o resultado conter mais de um elemento. Use Single ou SingleOrDefault onde você tem certeza que o resultado irá conter apenas um elemento. Se o resultado tem vários elementos, então deve haver algum problema.

3. ToList

Se você deseja listar todos os alunos cujo nome é ‘Janice’, então use ToList():

O ToList percorre uma sequência, capturando os resultados em uma List<T>.

macoratti codigo 3

4. Group By

Agrupa os elementos de uma sequência pela chave:

macoratti codigo 4

5. OrderBy

Ordena uma sequência de elementos pela chave na ordem ascendente:

macoratti codigo 5

Usando classes anônimas para filtrar informações

Podemos usar o recurso das classes anônimas para criar projeções selecionando dados.

Os tipos anônimos fornecem uma maneira conveniente para encapsular um conjunto de propriedades somente de leitura em um único objeto sem precisar primeiro definir explicitamente um tipo.

O nome do tipo é gerado pelo compilador e não está disponível no nível do código fonte. O tipo das propriedades é inferido pelo compilador.

Exemplo:

macoratti codigo 6

Na consulta acima usamos uma classe anônima (Select New) para selecionar o Id, Endereço e os cursos do aluno com nome igual a ‘Macoratti’.

O tipo anônimo possui três propriedades: AlunoId, AlunoEndereco e Cursos.

Executando consultas aninhadas

Quando você escreve uma consulta em qualquer lugar e em um valor que é esperado, você pode usar outra consulta em seu lugar, desde que essa consulta retorne um tipo aceitável. Você pode usar uma consulta aninhada no lugar de uma expressão ou uma coleção.

Exemplo:

macoratti codigo 7

Neste exemplo estamos realizando duas consultas aninhadas consultando Alunos e Cursos. O resultado será uma lista anônima com objetos Alunos e Cursos.

Vimos assim algumas projeções mais básicas e usadas com LINQ.

Na próxima aula vamos tratar do Eager Loading no Entity Framework.