Creare espressioni riutilizzabili nelle query LINQ per Entity Framework

di Stefano Mostarda, in LINQ, Entity Framework,

Quando lavoriamo con una tabella di un database, molto spesso ci ritroviamo a recuperare dati usando gli stessi filtri. Ad esempio, per una tabella con dati temporali ricorriamo spesso ad una ricerca per range di date. Scrivere questo filtro in molte query può portare facilmente a dimenticanze ed errori. Per semplificare il codice possiamo creare delle funzioni che accettano dei parametri e ritornano l'espressione da passare al metodo Where o a qualuqnue altro metodo.

Expression<Func<Person, bool>> GetFilter(Date birthDateFrom, Date birthDateTo) {
    Expression<Func<Person, bool>> ex = c => c.BirthDate >= birthDateFrom && c.BirthDate <= birthDateTo;
    return ex;
} 
         
var filter = GetFilter(new Date(2000,1,1), new Date(2010,1,1);
var people = await ctx.People
    .Where(filter)
    .Take(10)
    .ToListAsync();


Se organizziamo i metodi granularmente, possiamo creare combinazioni che ci permettono di usare più filtri nella stessa query.

var people = await ctx.People
    .Where(filterByDate)
    .Where(filterByCity)
    .Take(10)
    .ToListAsync();