Domain-first syntax
`CanShip.And.HighPriority` says what the rule means without ceremony or overloaded Boolean operators.
Specifications for modern C# · zero third-party dependencies
Compose named rules with terse, discoverable syntax—then evaluate them in memory or hand them to infrastructure without leaking a query API.
dotnet add package DanMarshall.FluentSpecificationsvar request = Order.Search
.Matching.CanShip.And.HighPriority
.Sorted.By.CreatedAt.Desc
.Then.By.Id.Asc
.Page(2).OfSize(50);Informed by the internal Kotlin API used at Reapit and established specification libraries across C#, Java, Kotlin, TypeScript, and PHP.
Read the design lineageA deliberately small idea
`CanShip.And.HighPriority` says what the rule means without ceremony or overloaded Boolean operators.
The same immutable specification supports fast matching, structured diagnostics, rendering, and translation.
Rules and immutable searches cross the boundary. EF Core stays in infrastructure and materializes results before returning.
The useful boundary
A specification stays Boolean. A separate immutable search can add sorting and paging without leaking EF, `DbSet`, or `IQueryable`.
Understand the EF Core boundary