Queryable.DynamicFilter
2.3.0
dotnet add package Queryable.DynamicFilter --version 2.3.0
NuGet\Install-Package Queryable.DynamicFilter -Version 2.3.0
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Queryable.DynamicFilter" Version="2.3.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Queryable.DynamicFilter" Version="2.3.0" />
<PackageReference Include="Queryable.DynamicFilter" />
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Queryable.DynamicFilter --version 2.3.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: Queryable.DynamicFilter, 2.3.0"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#addin nuget:?package=Queryable.DynamicFilter&version=2.3.0
#tool nuget:?package=Queryable.DynamicFilter&version=2.3.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
Queryable.DynamicFilter 2.1.0
Filtro dinâmico via query string para ASP.NET Core APIs.
Facilite a construção de filtros avançados (gt
, in
, contains
, null
, etc.), ordenação múltipla e paginação em APIs com suporte a LINQ Expression.
🚀 Instalação
dotnet add package Queryable.DynamicFilter --version 2.1.0
🧠 O que esse pacote resolve
- ✅ Filtros com operadores como
__eq
,__gt
,__in
,__contains
, etc. - ✅ Ordenação com múltiplos campos (ex:
?sort=nome,-preco
) - ✅ Paginação com metadados completos (
totalPages
,hasNext
, etc.) - ✅ Compatível com qualquer
IQueryable<T>
(EF Core, Linq2Objects, etc.) - ✅ Suporte a propriedades aninhadas (ex:
endereco.cidade__eq=São Paulo
) - ✅ Encapsulado em classes com responsabilidade única
🆕 Novidades da versão 2.1.0
Suporte a propriedades aninhadas em filtros
- Agora você pode filtrar por campos internos de objetos complexos. Basta usar o separador
.
na query string. - Exemplo:
GET /api/cliente?endereco.cidade__contains=Rio
- Agora você pode filtrar por campos internos de objetos complexos. Basta usar o separador
2Refatoração interna do QueryBuilder
* Código limpo e modular para processar propriedades aninhadas.
* Mais performance na construção de expressões.
🔍 Exemplos de filtro
GET /api/produto?preco__gt=10&preco__lt=100
GET /api/produto?descricao__contains=camisa
GET /api/produto?status__in=Ativo,Inativo
GET /api/produto?criado__from=2024-01-01&criado__to=2024-12-31
GET /api/produto?nome__eq=null
🏠 Filtros em propriedades aninhadas
GET /api/cliente?endereco.cidade__eq=São Paulo
GET /api/cliente?address.rua__contains=Travessa&address.numero__gt=100
↕️ Ordenação
GET /api/produto?sort=nome,-preco
nome
: ascendente-preco
: descendente
📄 Padrão de resposta
{
"items": [ /* lista de resultados */ ],
"meta": {
"page": 1,
"pageSize": 10,
"totalCount": 42,
"totalPages": 5,
"hasPrevious": false,
"hasNext": true
}
}
🛠️ Como usar
services.AddScoped<IFilterBuilder, FilterBuilder>();
services.AddScoped<ISortBuilder, SortBuilder>();
services.AddScoped<IQuerySpecApplier, QuerySpecApplier>();
services.AddControllers(options =>
{
options.ModelBinderProviders.Insert(0, new QuerySpecModelBinderProvider());
});
Exemplo no repository:
public class ProdutoRepository : IProdutoRepository
{
public IQueryable<Produto> GetQueryable()
{
return context.Set<Produto>();
}
}
Exemplo no serviço:
public async Task<PagedResult<ProdutoDto>> Buscar(QuerySpec<Produto> spec)
{
IQueryable<Produto> query = repository.GetQueryable();
IQueryable<Produto> filtered = querySpecApplier.Apply(query, spec);
int totalCount = await filtered.CountAsync();
IQueryable<Produto> paged = querySpecApplier.ApplyPaged(filtered, spec);
List<ProdutoDto> dto = await paged
.Select(x => (ProdutoDto)x)
.ToListAsync();
return dto.ToPagedResult(spec.Page, spec.PageSize, totalCount);
}
Você pode ou não fazer a conversão explícita entre a Entidade e a DTO.
🧩 Anotando propriedades filtráveis
public class Produto
{
[Queryable("nome")]
public string? Nome { get; set; }
[Queryable("preco")]
public decimal Preco { get; set; }
[Queryable("criado")]
public DateTime Criado { get; set; }
// Propriedade aninhada Address
[Queryable("address.rua")]
public Address Endereco { get; set; }
}
Definindo DTO para produtos
public class ProdutoDto
{
public string? Descricao { get; init; }
public double Preco { get; init; }
public DateTime Criacao { get; init; }
public static explicit operator ProdutoDto(Produto produto)
{
return new ProdutoDto
{
Descricao = produto.Descricao,
Preco = produto.Preco,
Criacao = produto.Criado
};
}
}
O
explicit operator
me permite realizar o casting deProduto
paraProdutoDto
no Service.
📦 Licença
MIT License © 2025 Samuel G. F. Dias
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
net9.0
- Microsoft.AspNetCore.Mvc.Abstractions (>= 2.3.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.