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.
Nouvelle API fluide qui élimine le casting manuel avec des mappings de propriétés type-safe
Vérification complète des types à la compilation avec support IntelliSense pour une meilleure DX
Support pour Equals, Contains, StartsWith, comparaisons de dates et plus
Intégration transparente avec Entity Framework Core et LINQ-to-Objects
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.
Définissez vos critères de filtre au format JSON
Passez les critères à Superfilter
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
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();
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}
Génère des expressions LINQ optimisées qui se traduisent en requêtes SQL efficaces
Syntaxe simple basée sur JSON qui est facile à comprendre et à implémenter
Dépendances minimales et empreinte réduite pour vos applications
Intellisense complet et sécurité à la compilation