Skip to content

Releases: pdevito3/QueryKit

v1.12.0

13 Dec 14:41

Choose a tag to compare

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

24 Nov 13:35

Choose a tag to compare

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(); // 💥 NullReferenceException

After (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 DESC

Details

  • 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

13 Nov 02:07

Choose a tag to compare

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

12 Nov 00:59

Choose a tag to compare

Full Changelog: v1.9.8...v1.10.0

v1.9.8

29 Oct 01:22

Choose a tag to compare

Full Changelog: v1.9.7...v1.9.8

v1.9.7

28 Sep 20:05

Choose a tag to compare

Full Changelog: v1.9.6...v1.9.7

v1.9.6

28 Sep 19:20

Choose a tag to compare

Full Changelog: v1.9.5...v1.9.6

v1.9.5

28 Sep 18:53

Choose a tag to compare

Full Changelog: v1.9.4...v1.9.5

v1.9.4

05 Sep 03:00

Choose a tag to compare

Full Changelog: v1.9.3...v1.9.4

v1.9.3

05 Sep 02:24

Choose a tag to compare

Full Changelog: v1.9.0...v1.9.3