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!