Releases: pdevito3/QueryKit
v1.12.0
Features
Property Depth Limiting
Added the ability to control the maximum depth of nested property access in filters and sorts. This helps protect against deeply nested queries when exposing QueryKit to external consumers.
Usage
// Limit nesting to 2 levels globally
var config = new QueryKitConfiguration(settings =>
{
settings.MaxPropertyDepth = 2;
});
// "Author.Name" works (depth 1)
// "Author.Address.City" works (depth 2)
// "Author.Address.Country.Name" throws QueryKitPropertyDepthExceededException (depth 3)Override the global limit for specific properties:
var config = new QueryKitConfiguration(settings =>
{
settings.MaxPropertyDepth = 1;
settings.Property<Book>(x => x.Author).HasMaxDepth(2); // Allow deeper nesting for Author
});v1.11.1
Fixes
Sorting
Sorting by nested navigation properties now handles null intermediate objects gracefully, preventing NullReferenceException when using in-memory collections.
Before (v1.11.0)
// Would throw NullReferenceException if Player is null
var sorted = stats
.ApplyQueryKitSort("MatchPlayer.Player.LastName asc")
.ToList(); // 💥 NullReferenceExceptionAfter (v1.12.0)
// Now works - null navigation properties are handled safely
var sorted = stats
.ApplyQueryKitSort("MatchPlayer.Player.LastName asc")
.ToList(); // ✅ Works! Nulls sort first in ASC, last in DESCDetails
- Null intermediate navigation properties now sort as null values rather than throwing
- Database queries (IQueryable) continue to work as before via EF Core's LEFT JOIN handling
- In-memory collections (IEnumerable) now behave consistently with database queries
- For custom null coalescing logic, DerivedProperty remains available:
var config = new QueryKitConfiguration(c =>
{
c.DerivedProperty<PlayerStat>(x =>
x.MatchPlayer.LastName ??
(x.MatchPlayer.Player != null ? x.MatchPlayer.Player.LastName : "Unknown"))
.HasQueryName("playerName");
});v1.11.0
New Feature: Property List Grouping
Property list grouping is a powerful new syntax that allows you to apply a single comparison operation across multiple properties, making it dramatically easier to search for values across multiple fields without writing repetitive conditions.
Instead of writing verbose, repetitive filters like this:
var input = """FirstName @=* "paul" || LastName @=* "paul" || Email @=* "paul" """;You can now write this:
var input = """(FirstName, LastName, Email) @=* "paul" """;v1.10.0
Full Changelog: v1.9.8...v1.10.0
v1.9.8
Full Changelog: v1.9.7...v1.9.8
v1.9.7
Full Changelog: v1.9.6...v1.9.7
v1.9.6
Full Changelog: v1.9.5...v1.9.6
v1.9.5
Full Changelog: v1.9.4...v1.9.5
v1.9.4
Full Changelog: v1.9.3...v1.9.4
v1.9.3
Full Changelog: v1.9.0...v1.9.3