Superfilter

Une bibliothèque C# .NET 9.0 légère avec une API ConfigurationBuilder fluide pour le filtrage et tri dynamique

Superfilter est une bibliothèque C# puissante et légère qui permet le filtrage et tri dynamique sur les sources IQueryable. Construite pour les applications .NET 9.0 modernes, elle propose une nouvelle API ConfigurationBuilder fluide qui élimine le casting manuel, offrant des capacités de requête type-safe avec support IntelliSense pour les API web avec une intégration transparente d'Entity Framework.

C#
.NET 9.0
ConfigurationBuilder
Entity Framework
LINQ
Type-Safe

Fonctionnalités Clés

ConfigurationBuilder Fluide

Nouvelle API fluide qui élimine le casting manuel avec des mappings de propriétés type-safe

Type-Safe & IntelliSense

Vérification complète des types à la compilation avec support IntelliSense pour une meilleure DX

Opérateurs Riches

Support pour Equals, Contains, StartsWith, comparaisons de dates et plus

Intégration EF

Intégration transparente avec Entity Framework Core et LINQ-to-Objects

Comment ça Fonctionne

Superfilter transforme les expressions de filtre JSON en requêtes LINQ, ce qui le rend parfait pour les API REST qui ont besoin de capacités de filtrage flexibles.

1

Définissez vos critères de filtre au format JSON

2

Passez les critères à Superfilter

3

Obtenez un résultat IQueryable filtré

1// ConfigurationBuilder API - Complete Example
2using Superfilter;
3
4[HttpPost("search")]
5public async Task<IActionResult> SearchUsers([FromBody] UserSearchRequest request)
6{
7    // 1. Create configuration with fluent, type-safe API
8    var config = SuperfilterBuilder.For<User>()
9        .MapRequiredProperty("id", u => u.Id)                    // Required filter
10        .MapProperty("name", u => u.Name)                        // Simple property
11        .MapProperty("carBrandName", u => u.Car.Brand.Name)      // Nested navigation
12        .MapProperty("bornDate", u => u.BornDate)                // DateTime support
13        .MapProperty("isActive", u => u.IsActive)                // Boolean support
14        .WithFilters(request.Filters)                            // Dynamic from client
15        .WithSorts(request.Sorts)                                // Dynamic from client
16        .Build();
17
18    // 2. Initialize Superfilter
19    var superfilter = new Superfilter.Superfilter();
20    superfilter.InitializeGlobalConfiguration(config);
21    superfilter.InitializeFieldSelectors<User>();
22
23    // 3. Apply filtering and sorting
24    var query = _context.Users.AsQueryable();
25    query = superfilter.ApplyConfiguredFilters(query);
26    query = query.ApplySorting(config);
27    
28    return Ok(await query.ToListAsync());
29}
30
31// Key Benefits:
32// ✅ No manual casting required
33// ✅ Type safety with compile-time checking  
34// ✅ IntelliSense support
35// ✅ Handles any property type automatically
36// ✅ Support for nested navigation properties

Avec vs Sans Superfilter

Sans Superfilter

Manual casting required with verbose syntax

1// Sans Superfilter - Code verbeux et répétitif
2var query = dbContext.Users.AsQueryable();
3
4// Filtrage par nom
5if (!string.IsNullOrEmpty(nameFilter))
6{
7    if (nameOperator == "contains")
8        query = query.Where(u => u.Name.Contains(nameFilter));
9    else if (nameOperator == "equals")
10        query = query.Where(u => u.Name == nameFilter);
11    else if (nameOperator == "startsWith")
12        query = query.Where(u => u.Name.StartsWith(nameFilter));
13    else if (nameOperator == "endsWith")
14        query = query.Where(u => u.Name.EndsWith(nameFilter));
15    else if (nameOperator == "notEquals")
16        query = query.Where(u => u.Name != nameFilter);
17    else if (nameOperator == "notContains")
18        query = query.Where(u => !u.Name.Contains(nameFilter));
19    else if (nameOperator == "isEmpty")
20        query = query.Where(u => string.IsNullOrEmpty(u.Name));
21    else if (nameOperator == "isNotEmpty")
22        query = query.Where(u => !string.IsNullOrEmpty(u.Name));
23}
24
25// Filtrage par âge
26if (ageFilter.HasValue)
27{
28    if (ageOperator == "equals")
29        query = query.Where(u => u.Age == ageFilter.Value);
30    else if (ageOperator == "notEquals")
31        query = query.Where(u => u.Age != ageFilter.Value);
32    else if (ageOperator == "greater")
33        query = query.Where(u => u.Age > ageFilter.Value);
34    else if (ageOperator == "greaterOrEquals")
35        query = query.Where(u => u.Age >= ageFilter.Value);
36    else if (ageOperator == "less")
37        query = query.Where(u => u.Age < ageFilter.Value);
38    else if (ageOperator == "lessOrEquals")
39        query = query.Where(u => u.Age <= ageFilter.Value);
40    else if (ageOperator == "between")
41        query = query.Where(u => u.Age >= minAge && u.Age <= maxAge);
42    else if (ageOperator == "notBetween")
43        query = query.Where(u => u.Age < minAge || u.Age > maxAge);
44}
45
46// Filtrage par email
47if (!string.IsNullOrEmpty(emailFilter))
48{
49    if (emailOperator == "contains")
50        query = query.Where(u => u.Email.Contains(emailFilter));
51    else if (emailOperator == "equals")
52        query = query.Where(u => u.Email == emailFilter);
53    else if (emailOperator == "startsWith")
54        query = query.Where(u => u.Email.StartsWith(emailFilter));
55    else if (emailOperator == "endsWith")
56        query = query.Where(u => u.Email.EndsWith(emailFilter));
57    else if (emailOperator == "notEquals")
58        query = query.Where(u => u.Email != emailFilter);
59    else if (emailOperator == "notContains")
60        query = query.Where(u => !u.Email.Contains(emailFilter));
61    else if (emailOperator == "isEmpty")
62        query = query.Where(u => string.IsNullOrEmpty(u.Email));
63    else if (emailOperator == "isNotEmpty")
64        query = query.Where(u => !string.IsNullOrEmpty(u.Email));
65}
66
67// ... répéter pour chaque propriété
68var result = query.ToList();

Avec Superfilter

Clean, type-safe ConfigurationBuilder API

1// New ConfigurationBuilder API - Type-safe & Clean
2[HttpPost("search")]
3public async Task<IActionResult> SearchUsers([FromBody] UserSearchRequest request)
4{
5    // 1. Create configuration with clean, type-safe property mappings
6    var config = SuperfilterBuilder.For<User>()
7        .MapRequiredProperty("id", u => u.Id)            // No casting required!
8        .MapProperty("carBrandName", u => u.Car.Brand.Name)  // Type inference works
9        .MapProperty("name", u => u.Name)                // IntelliSense support
10        .WithFilters(request.Filters)                    // Dynamic filters from client
11        .WithSorts(request.Sorts)                        // Dynamic sorts from client
12        .Build();
13
14    // 2. Use with Superfilter
15    var superfilter = new Superfilter.Superfilter();
16    superfilter.InitializeGlobalConfiguration(config);
17    superfilter.InitializeFieldSelectors<User>();
18
19    // 3. Apply to query
20    var query = _context.Users.AsQueryable();
21    query = superfilter.ApplyConfiguredFilters(query);
22    query = query.ApplySorting(config);
23    
24    return Ok(await query.ToListAsync());
25}

Pourquoi Superfilter ?

Performance d'Abord

Génère des expressions LINQ optimisées qui se traduisent en requêtes SQL efficaces

Flexible & Intuitif

Syntaxe simple basée sur JSON qui est facile à comprendre et à implémenter

Léger

Dépendances minimales et empreinte réduite pour vos applications

Type Safe

Intellisense complet et sécurité à la compilation