Uno dei task più frequenti per uno sviluppatore backend è quello di implementare un metodo di ricerca di una qualsiasi entità su una base dati utilizzando un set di filtri opzionali. Tipicamente. si finisce per craere un metodo che prende in input un oggetto contenente tali filtri, che ha una forma simile a questa:
public class SearchCriteria
{
public string? FirstName { get; set; }
public string? LastName { get; set; }
public string? Email { get; set; }
public bool? Enabled { get; set; }
...
}Il metodo che effettua la ricerca di utenti su una tabella del database utilizzando un DbContext di EF Core sarà simile a questo:
async Task<IEnumerable<UserEntity>> SearchUsers(SearchCriteria searchCriteria)
{
var query = _tmsContext.Users;
if(!string.IsNullOrWhiteSpace(searchCriteria.FirstName))
query = query.Where(x => x.FirstName.Contains(searchCriteria.FirstName!));
if(!string.IsNullOrWhiteSpace(searchCriteria.LastName))
query = query.Where(x => x. LastName.Contains(searchCriteria. LastName!));
if(!string.IsNullOrWhiteSpace(searchCriteria.Email))
query = query.Where(x => x. Email.Contains(searchCriteria. Email!));
if(searchCriteria.Enabled.HasValue)
query = query.Where(x => x.Enabled == searchCriteria.Enabled);
return await query.ToListAsync();
}Per noi dev, less is more e questo vale soprattutto per la quantità di codice da scrivere. Per scrivere meno codice, possiamo creare un extension method che prende in input la condizione in base alla quale applicare il filtro e il filtro. Nel metodo verifichiamo che la condizione sia a true e in caso positivo applichiamo il filtro, in caso negativo non facciamo nulla.
public static class LinqExtensions
{
public static IQueryable<TSource> WhereIf<TSource>(this IQueryable<TSource> source,
bool condition, Expression<Func<TSource, bool>> predicate)
=> condition ? source.Where(predicate) : source;
}A questo punto, il metodo di ricerca può essere trasformato come segue.
async Task<IEnumerable<UserEntity>> SearchUsers(SearchCriteria searchCriteria) =>
_tmsContext.Users
.WhereIf(!string.IsNullOrWhiteSpace(searchCriteria.FirstName),
x => x.FirstName.Contains(searchCriteria.FirstName!))
.WhereIf(!string.IsNullOrWhiteSpace(searchCriteria.LastName),
x => x.LastName.Contains(searchCriteria.LastName!))
.WhereIf(!string.IsNullOrWhiteSpace(searchCriteria.Email),
x => x.Email.Contains(searchCriteria.Email!))
.WhereIf(searchCriteria.Enabled.HasValue,
x => x.Enabled == searchCriteria.Enabled)
.ToListAsync();Il codice del metodo di ricerca che utilizza il nostro extension method è estremamente più compatto e, a seconda dei propri gusti, anche più leggibile.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Fissare una versione dell'agent nelle pipeline di Azure DevOps
Integrazione di Copilot in .NET Aspire
Selettore CSS :has() e i suoi casi d'uso avanzati
Mappare una complex property di una entity su un campo JSON
Importare repository da Bitbucket a GitHub Enterprise Cloud
Autenticazione di git tramite Microsoft Entra ID in Azure DevOps
Usare la libreria PredicateBuilder per eseguire query tramite Entity Framework che usano or su più campi
Definire il metodo di rilascio in .NET Aspire
Dallo sviluppo locale ad Azure con .NET Aspire
Impostare la content-visibility in CSS per ottimizare il rendering iniziale di una pagina
Configurare OpenAI in .NET Aspire
Semplificare i deployment con le label in Azure Container App
I più letti di oggi
- .NET Campus - Roma
- .NET Conference Italia 2022 - Track in presenza - Milano
- Release Candidate 1 di Internet Explorer 8
- Windows Azure in versione 1.0: annunciata la piattaforma Microsoft per il cloud computing
- Disponibile la June 2011 CTP di Entity Framework
- Microsoft Security Bulletin MS02-043
- .NET vs J2EE? Secondo Microsoft non ci sono paragoni


