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
Ottenere il riferimento alla finestra che ha aperto un'altra finestra con HTML5 e JavaScript
Raggruppare i parametri di una minimal API in un singolo oggetto in ASP.NET Core
Gestire condizioni complesse in JavaScript
Dependency Injection e custom validator in Blazor con .NET 7.0
Utilizzare HiLo per ottimizzare le insert in un database con Entity Framework
Specificare il versioning nel path degli URL in ASP.NET Web API
Creare moduli CSS in React
Semplificare il deployment di siti statici con Azure Static Web App
Intercettare gli eventi di creazione degli oggetti con Entity Framework 7
Fare automaticamente il merge di una pull request con un workflow di GitHub
Collegare servizi a Azure Container App con i service connector
I più letti di oggi
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Effettuare update massivi con Entity Framework Core 7
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!