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
Gestione degli stili CSS con le regole @layer
Migliorare la scalabilità delle Azure Function con il Flex Consumption
Il nuovo controllo Range di Blazor 9
Ordine e importanza per @layer in CSS
Referenziare un @layer più alto in CSS
Fornire parametri ad un Web component HTML
Supporto ai tipi DateOnly e TimeOnly in Entity Framework Core
Utilizzare il metodo Index di LINQ per scorrere una lista sapendo anche l'indice dell'elemento
Recuperare automaticamente un utente e aggiungerlo ad un gruppo di Azure DevOps
Utilizzare Copilot con Azure Cosmos DB
Estrarre dati randomici da una lista di oggetti in C#
Usare le navigation property in QuickGrid di Blazor
I più letti di oggi
- .NET Conference Italia 2024 - Milano
- Develop and distribute Azure Functions using K8s and CI/CD
- Disponibile la versione finale di Hyper-V: la virtualizzazione per Windows Server 2008
- Speciale Mastering Entity Framework
- Velocity arriva alla CTP3
- Silverlight Summer: un'estate speciale piena di Style per i controlli Silverlight!
- Disponibile la versione beta di Silverlight 4.0
- Mono 0.13: ora anche web services
- .NET Alerts Software Development Kit