Compartilhar via


Usando DATEDIFF com Entity Framework Core 2.0

https://i0.wp.com/ralmsdeveloper172900781.files.wordpress.com/2017/12/efcore.png

Olá tudo bem pessoal?!

Nesse pequeno artigo, irei mostrar a você como fazer cálculos entre datas usando o EF Core 2.0, isso mesmo!

Até o momento não era possível obter a diferença entre duas datas usando o EF Core 2.0, de forma que fosse avaliado tanto no cliente como no servidor, ou seja, não tínhamos o suporte ao DATEDIFF, como já citei em outras ocasiões esse recurso estará disponível na versão 2.1, no qual tive a oportunidade e o prazer de contribuir, junto a equipe do EF Core, mais e para versão 2.0?

Bom para isso eu criei uma extensão compatível com o EF Core 2, onde você pode usufruir desse mesmo recurso, legal néh?!

As diferenças entre datas serão traduzidas para o servidor usando o DATEDIFF, mais também estarão disponíveis no lado cliente, fazendo o eval para cálculos.

Tentei deixar a extensão o mais simples possível, apenas usando o OnModelCreating para habilitar o recurso.

O método CreateFunctionDateDiff, se estende do ModelBuilder, tornando mais fácil sua chamada.

Vejamos como habitar o recurso, veja um exemplo de um simples DbContext:

using Microsoft.EntityFrameworkCore;
  
namespace Ralms.Microsoft.EntityFrameworkCore.Tests
{
    public class  SampleContext : DbContext
    {
        public DbSet<People> People { get; set; }
  
        protected override  void OnModelCreating(ModelBuilder modelo)
        {
            // Só precisa apenas invocar esta extensão
            // que se estende do ModelBuilder
            modelo.CreateFunctionDateDiff();
        }
    }
}

Feito isso como utilizar agora em minhas querys linq?

Mais facil ainda, vejamos um exemplo:

var list = db
     .People
     .Where(p => EFCore.DateDiff(DatePart.day, DateTime.Now, p.Birthday) < 50)
     .ToList();

Com o exemplo acima teremos a seguinte saida SQL:

SELECT [p].[Id], [p].[Birthday], [p].[Birthday2], [p].[Date], [p].[Name]
FROM [People] AS [p]
WHERE DATEDIFF(day, GETDATE(), [p].[Birthday]) < 50

Muito fácil não é?!

Observação: O DatePart é um Enum que contempla todas possibilidades de tradução.

A extensão está disponível no Nuget:

https://www.nuget.org/packages/Ralms.Microsoft.EntityFrameworkCore.Extensions/

Você pode  instalar usando o Package Console:
Install-Package Ralms.Microsoft.EntityFrameworkCore.Extensions -Version 0.0.1

Ou via prompt usando dotnet:
dotnet add package Ralms.Microsoft.EntityFrameworkCore.Extensions --version 0.0.1

Abraços, até mais!