Banco de Dados

17 jun, 2019

EF Core 2.x – Operador Like : Propriedade EF.Functions

100 visualizações
Publicidade
Hoje vou apresentar o recurso do operador Like diretamente no código da consulta usando o EF Core 2.x.

Desde a versão 2.0 do Entity Framework Core temos disponível o recurso do operador Like que podemos usar em consultas.

Para isso usamos a propriedade EF.Functions que fornece métodos CLR que são traduzidos para funções de banco de dados quando usados ​​em consultas LINQ to Entities.

Nota: Se você chamar esses métodos em outros contextos (por exemplo, LINQ to Objects) irá obter uma NotSupportedException.

Vamos ver isso funcionando na prática.

Vamos supor que já temos um banco de dados chamado Acervo e a tabela Musicas com a seguinte estrutura e alguns dados já inseridos:

Abaixo vemos o script SQL para criar a tabela Musicas:

USE [Cadastro]
GO
CREATE TABLE [dbo].[Musicas](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[Artista] [nvarchar](50) NOT NULL,
	[Titulo] [nvarchar](50) NOT NULL,
	[Local] [nvarchar](100) NOT NULL,
 CONSTRAINT [PK_Musicas] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)ON [PRIMARY]
GO

recursos usados:

– Visual Studio 2017 Community
– SQL Server 2012 Express
– Entity Framework Core 2.1

Criando o projeto no VS 2017 Community

Abra o VS 2017 Community e crie um novo projeto .NET Core do tipo Console App(.NET Core) chamado EFCore_Like.

Inclua no projeto a referência para o Microsoft.EntityFrameworkCore.SqlServer :

Observe que estou usando a versão 2.21, que é a versão mais estável, mas podemos usar a versão 2.1 ou superior.

Crie no projeto a pasta Model e nesta pasta inclua duas classes:

  1. Musica  – classe de domínio
  2. AppDbContext – classe de contexto

A seguir inclua o código abaixo na classe Musica que representa no nosso modelo de domínio:

1- Musica

namespace EFCore_Like.Models
{
    public class Musica
    {
        public int Id { get; set; }
        public string Artista { get;  set; }
        public string Titulo { get; set; }
        public string Local { get; set; }
    }
}

A seguir inclua o código abaixo na classe AppDbContext que representa o nosso contexto:

2- AppDbContext

using Microsoft.EntityFrameworkCore;
using System.Linq;
namespace EFCore_Like.Models
{
    public class AppDbContext : DbContext
    {
        public DbSet<Musica> Musicas { get; set; }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
           optionsBuilder.UseSqlServer(@"Data Source=Macoratti;Initial Catalog=Cadastro;Integrated Security=True");
        }
       protected override void OnModelCreating(ModelBuilder modelBuilder)
       {
                   modelBuilder.Entity<Musica>()    
                         .HasKey(e => e.Id);
        }
    }
}

Neste código definimos a propriedade DbSet<> mapeando para a tabela Musicas, e, definimos também a string de conexão com o banco de dados Cadastro.

O código no método OnModelCreating usa a Fluent API para mapear a propriedade Id como chave primária da tabela.

Agora vamos definir uma consulta SQL usando a propriedade EF.Functions onde podemos usar

No arquivo Program.cs inclua o código abaixo:

using EFCore_Like.Models;
using Microsoft.EntityFrameworkCore;
using System.Linq;
using static System.Console;
namespace EFCore_Like
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var contexto = new AppDbContext())
            {
                var resultado = contexto.Musicas
                                         .Where(m => EF.Functions.Like(m.Titulo, "%foni%"))
                                         .ToList();
                foreach(var musica in resultado)
                {
                    System.Console.WriteLine( $"{musica.Artista} - {musica.Titulo}");
                }

                ReadLine();
            }
        }
    }
}

Na consulta usamos a propriedade EF.Functions e o método de extensão Like onde aplicamos o filtro à propriedade Titulo da música usando os curingas % na expressão : “%foni%” que vai retornar todos os registros cuja coluna Titulocontenha o texto ‘foni‘.

Executando projeto temos o seguinte resultado:

Além do Like também podemos usar os seguintes métodos de extensão na propriedade EF.Functions:

  • Contains
  • DateDiffDay
  • DateDiffHour
  • DateDiffMicroSecond
  • DateDiffMiliSecond
  • DateDiffMinute
  • DateDiffMonth
  • DateDiffNanoSecond
  • DateDiffSecond
  • DateDiffYear
  • FreeText

Pegue o código completo do projeto aqui:   EFCore_Like.zip