A robust library implementing the Specification Design Pattern specifically for RavenDB. Decentralize your business logic from data access infrastructure with reusable, testable, and combinable queries.
RavenDB's LINQ provider is powerful but has specific behaviors (like .Search() for partial matches). This library abstracts those complexities, allowing you to define business rules as "Specifications" that are:
- Reusable: Use the same filter across multiple services.
- Testable: Verify logic without a database connection.
- Combinable: Merge logic with
And,Or, andNot.
- Search Abstraction: Automatically converts
Containscriteria to RavenDB's.Search()API. - SQL-to-Spec: Dynamic filtering using simple SQL-like strings.
- Async Support: Native support for
IAsyncDocumentSession. - Thread-Safe: Designed for modern high-concurrency applications.
dotnet add package RavenDB-Specifications// 1. Define
var brandSpec = new EqualSpecification<Product>("Brand", "Dell");
var searchSpec = new ContainsSpecification<Product>("Name", "Monitor");
// 2. Combine
var finalSpec = brandSpec.And(searchSpec);
// 3. Execute
var results = await Queries<Product>.Filter(session, finalSpec).ToListAsync();Convert SQL-style strings directly into specifications:
string sql = "Brand = 'Dell' AND (Price < 1000 OR Category IN ('Electronics', 'IT')) AND Name LIKE '%Monitor%'";
var spec = SqlToSpecificationConverter.Convert<Product>(sql);
var products = await Queries<Product>.Filter(session, spec).ToListAsync();O provedor LINQ do RavenDB é excelente, mas exige cuidados específicos (como o uso de .Search() para buscas parciais). Esta biblioteca abstrai essa complexidade, permitindo definir regras de negócio como "Especificações" que são:
- Reutilizáveis: Use o mesmo filtro em múltiplos serviços.
- Testáveis: Valide a lógica sem precisar de conexão com o banco.
- Combináveis: Una lógicas complexas com
And,OreNot.
- Abstração de Busca: Converte automaticamente critérios
Containspara a API.Search()do RavenDB. - SQL-to-Spec: Filtros dinâmicos via strings SQL simples.
- Suporte Assíncrono: Totalmente compatível com
IAsyncDocumentSession. - Thread-Safe: Pronto para aplicações modernas escaláveis.
dotnet add package RavenDB-Specifications// 1. Definir
var marcaSpec = new EqualSpecification<Product>("Brand", "Dell");
var buscaSpec = new ContainsSpecification<Product>("Name", "Monitor");
// 2. Combinar
var specFinal = marcaSpec.And(buscaSpec);
// 3. Executar
var resultados = await Queries<Product>.Filter(session, specFinal).ToListAsync();Converta strings no estilo SQL diretamente para especificações:
string sql = "Brand = 'Dell' AND (Price < 1000 OR Category IN ('Electronics', 'IT')) AND Name LIKE '%Monitor%'";
var spec = SqlToSpecificationConverter.Convert<Product>(sql);
var produtos = await Queries<Product>.Filter(session, spec).ToListAsync();RavenDB.Specifications: The core library.RavenDB.Specifications.Demo: ASP.NET Core API showcasing integration.RavenDB.Specifications.Tests: Comprehensive test suite.
This project is licensed under the MIT License - see the LICENSE file for details.