Skip to content

Add support for nullable cursor keys#8431

Merged
michaelstaib merged 21 commits intomainfrom
gai/nullable-cursor-keys
Mar 4, 2026
Merged

Add support for nullable cursor keys#8431
michaelstaib merged 21 commits intomainfrom
gai/nullable-cursor-keys

Conversation

@glen-84
Copy link
Copy Markdown
Member

@glen-84 glen-84 commented Jul 8, 2025

Summary of the changes (Less than 80 chars)

  • Added support for nullable cursor keys.

To-do:

  1. Fix test HotChocolate/Data/test/Data.Tests/Pagination/PagingArgumentsParameterExpressionBuilderTests.cs#X.
  2. Fix test HotChocolate/Core/test/Types.Analyzers.Integration.Tests/IntegrationTests.cs#X.
  3. FIXMEs in src/HotChocolate/Data/test/Data.Tests/PagingHelperIntegrationTests.cs.
  4. Fix thread-safety of NullabilityInfoContext in ExpressionHelpers[ThreadStatic] or lock?
  5. Confirm if change to EfQueryableCursorPagingHandler is breaking – will throw for nullable cursor keys.
  6. Update docs at https://chillicream.com/docs/hotchocolate/v15/fetching-data/pagination/#pagingoptions.

@bbrandt
Copy link
Copy Markdown
Contributor

bbrandt commented Jul 15, 2025

@glen-84 Can I submit a documentation PR with a workaround for users of HC versions before your PR or #8230 merges?

// Ordering by UpdatedUtc or CreatedUtc will fail with 
// Message=The key type `System.Nullable`1[[System.DateTime, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]` is not supported.
[InterfaceType("Auditable")]
public class AuditableGqlModel
{

    // Audit properties
    public DateTime? UpdatedUtc { get; set; }
    public string? CreatedBy { get; set; }
    public DateTime? CreatedUtc { get; set; }
    public string? UpdatedBy { get; set; }
}

// Workaround: ordering works as expected
[InterfaceType("Auditable")]
public class AuditableGqlModel
{

    // Audit properties
    [GraphQLNonNullType(nullable: true)]
    public DateTime UpdatedUtc { get; set; }

    public string? CreatedBy { get; set; }

    [GraphQLNonNullType(nullable: true)]
    public DateTime CreatedUtc { get; set; }

    public string? UpdatedBy { get; set; }
}

@glen-84
Copy link
Copy Markdown
Member Author

glen-84 commented Jul 16, 2025

@bbrandt

Thanks for the offer, but I don't think that there is a workaround for this issue. I'm assuming that your code is bypassing the error, but the paging will likely still be incorrect if the data includes null values, since the implementation doesn't currently (or at least, correctly) handle null cursor keys.

@bbrandt
Copy link
Copy Markdown
Contributor

bbrandt commented Jul 18, 2025

Thanks for the info @glen-84. It's great to know that the workaround is not great before we pushed it to prod. We are a bit of a strange case where the fields we want to filter by are not actually allowed to be null within the context of a single microservices DB. But we use fusion to aggregate data across several microservices, with lookups and all that. With eventual consistency and other issues unique to distributed system, lookups could return null for an id and not be able to fill in a property that otherwise would have been specified as not-null. We end up marking almost every field as nullable because of this. But maybe there's a better way.

@glen-84 glen-84 marked this pull request as ready for review March 3, 2026 09:40
Copilot AI review requested due to automatic review settings March 3, 2026 09:40
@glen-84 glen-84 marked this pull request as draft March 3, 2026 09:40
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds support for nullable cursor keys across GreenDonut cursor paging and HotChocolate paging integration by introducing a configurable NullOrdering and plumbing it through paging options/arguments, plus updating query slicing expression generation and snapshots.

Changes:

  • Introduces NullOrdering (GreenDonut primitives) and adds it to PagingArguments and HotChocolate PagingOptions.
  • Wires HotChocolate paging options into resolver PagingArguments and analyzer-generated code, and updates EF paging handlers to call updated slicing helpers.
  • Adds/updates EF paging tests and regenerates many SQL/expression/schematic snapshots.

Reviewed changes

Copilot reviewed 139 out of 139 changed files in this pull request and generated 9 comments.

Show a summary per file
File Description
src/HotChocolate/Data/test/Data.Tests/snapshots/PagingHelperIntegrationTests.Paging_First_5_Before_Id_96_NET10_0.md Updated paging snapshot output
src/HotChocolate/Data/test/Data.Tests/snapshots/PagingHelperIntegrationTests.Paging_First_5_Before_Id_96.md Updated paging snapshot output
src/HotChocolate/Data/test/Data.Tests/snapshots/PagingHelperIntegrationTests.Paging_First_5_After_Id_13_NET10_0.md Updated paging snapshot output
src/HotChocolate/Data/test/Data.Tests/snapshots/PagingHelperIntegrationTests.Paging_First_5_After_Id_13.md Updated paging snapshot output
src/HotChocolate/Data/test/Data.Tests/snapshots/PagingHelperIntegrationTests.GetSecondPage_With_2_Items_NET10_0.md Updated paging snapshot output
src/HotChocolate/Data/test/Data.Tests/snapshots/PagingHelperIntegrationTests.GetSecondPage_With_2_Items.md Updated paging snapshot output
src/HotChocolate/Data/test/Data.Tests/snapshots/PagingHelperIntegrationTests.GetDefaultPage_With_Nullable_SecondPage_NET10_0.md Updated nullable-key paging snapshot output
src/HotChocolate/Data/test/Data.Tests/snapshots/PagingHelperIntegrationTests.GetDefaultPage_With_Nullable_SecondPage.md Updated nullable-key paging snapshot output
src/HotChocolate/Data/test/Data.Tests/snapshots/PagingHelperIntegrationTests.GetDefaultPage_With_Nullable_Fallback_SecondPage_NET10_0.md Updated nullable-key paging snapshot output
src/HotChocolate/Data/test/Data.Tests/snapshots/PagingHelperIntegrationTests.GetDefaultPage_With_Nullable_Fallback_SecondPage.md Updated nullable-key paging snapshot output
src/HotChocolate/Data/test/Data.Tests/snapshots/PagingHelperIntegrationTests.GetDefaultPage_With_Deep_SecondPage_NET10_0.md Updated paging snapshot output
src/HotChocolate/Data/test/Data.Tests/snapshots/PagingHelperIntegrationTests.GetDefaultPage_With_Deep_SecondPage.md Updated paging snapshot output
src/HotChocolate/Data/test/Data.Tests/PagingHelperIntegrationTests.cs Configures NullOrdering in tests; contains temporary overrides/FIXMEs
src/HotChocolate/Data/test/Data.Tests/Pagination/PagingArgumentsParameterExpressionBuilderTests.cs Adds (currently skipped) test for options→arguments mapping
src/HotChocolate/Data/src/EntityFramework/Pagination/EfQueryableCursorPagingHandler.cs Updates slicing expression call site to accept NullOrdering
src/HotChocolate/Data/src/Data/PagingArgumentsParameterExpressionBuilder.cs Maps HotChocolate paging options into PagingArguments.NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/QueryContextProjectionAnalyzerTests.QueryContext_WithoutUseProjection_NoError.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/QueryContextProjectionAnalyzerTests.QueryContext_WithUseProjections_RaisesError.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/QueryContextProjectionAnalyzerTests.QueryContext_WithUseProjection_RaisesError.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/QueryContextProjectionAnalyzerTests.QueryContext_MultipleAttributes_OnlyUseProjectionFlagged.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/QueryContextConnectionAnalyzerTests.TypeMismatch_WithSubscriptionType_RaisesError.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/QueryContextConnectionAnalyzerTests.TypeMismatch_WithQueryType_RaisesError.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/QueryContextConnectionAnalyzerTests.TypeMismatch_WithObjectType_RaisesError.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/QueryContextConnectionAnalyzerTests.TypeMismatch_WithMutationType_RaisesError.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/QueryContextConnectionAnalyzerTests.TypeMismatch_WithInterfaceType_RaisesError.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/QueryContextConnectionAnalyzerTests.TypeMismatch_WithConnection_RaisesError.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/QueryContextConnectionAnalyzerTests.NoQueryContextParameter_NoError.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/QueryContextConnectionAnalyzerTests.CorrectGenericTypeMatch_WithConnection_NoError.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/QueryContextConnectionAnalyzerTests.CorrectGenericTypeMatch_NoError.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.Shareable_On_PageConnection_Scoped.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.Shareable_On_PageConnection.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.Shareable_On_Edge_Field.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.Shareable_On_Edge_Class_Scoped.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.Shareable_On_Edge_Class.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.Shareable_On_Connection_Field.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.Shareable_On_Connection_Class_Scoped.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.Shareable_On_Connection_Class.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.Inaccessible_On_PageConnection_Scoped.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.Inaccessible_On_PageConnection.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.Inaccessible_On_Edge_Field.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.Inaccessible_On_Edge_Class_Scoped.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.Inaccessible_On_Edge_Class.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.Inaccessible_On_Connection_Field.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.Inaccessible_On_Connection_Class_Scoped.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.Inaccessible_On_Connection_Class.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.GenerateSource_Inherit_From_PageConnection.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.GenerateSource_Inherit_From_ConnectionBase_Reuse_PageEdge_Generic.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.GenerateSource_Inherit_From_ConnectionBase_Reuse_PageEdge.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.GenerateSource_Inherit_From_ConnectionBase_Inherit_PageEdge.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.GenerateSource_GenericCustomConnection_WithConnectionName_MatchesSnapshot.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.GenerateSource_GenericCustomConnection_MatchesSnapshot.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.GenerateSource_CustomConnection_UseConnection_IncludeTotalCount_MatchesSnapshot.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.GenerateSource_CustomConnection_UseConnection_ConnectionName_MatchesSnapshot.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.GenerateSource_CustomConnection_No_Duplicates_MatchesSnapshot.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.GenerateSource_CustomConnection_MatchesSnapshot.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.GenerateSource_ConnectionT_MatchesSnapshot.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Tests/snapshots/PagingTests.GenerateSource_ConnectionFlags.md Updates analyzer snapshot to include NullOrdering
src/HotChocolate/Core/test/Types.Analyzers.Integration.Tests/snapshots/IntegrationTests.Schema_Snapshot.snap Updates schema snapshot for new paging test field
src/HotChocolate/Core/test/Types.Analyzers.Integration.Tests/Product.cs Adds ints paging field for integration coverage
src/HotChocolate/Core/test/Types.Analyzers.Integration.Tests/InterfaceTests.cs Registers paging arguments for integration test types
src/HotChocolate/Core/test/Types.Analyzers.Integration.Tests/IntegrationTests.cs Adds integration schema snapshot + (skipped) option-mapping test
src/HotChocolate/Core/src/Types/Types/Pagination/PagingOptions.cs Adds PagingOptions.NullOrdering
src/HotChocolate/Core/src/Types/HotChocolate.Types.csproj Adds reference to GreenDonut.Data.Primitives
src/HotChocolate/Core/src/Types.Analyzers/FileBuilders/TypeFileBuilderBase.cs Emits NullOrdering into generated paging argument objects
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperSqlServerNullableTests.Paging_Nullable_Descending_Cursor_Value_Null_NET9_0.md Adds SqlServer nullable paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperSqlServerNullableTests.Paging_Nullable_Descending_Cursor_Value_Null_NET8_0.md Adds SqlServer nullable paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperSqlServerNullableTests.Paging_Nullable_Descending_Cursor_Value_Null_NET10_0.md Adds SqlServer nullable paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperSqlServerNullableTests.Paging_Nullable_Descending_Cursor_Value_NonNull_NET9_0.md Adds SqlServer nullable paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperSqlServerNullableTests.Paging_Nullable_Descending_Cursor_Value_NonNull_NET8_0.md Adds SqlServer nullable paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperSqlServerNullableTests.Paging_Nullable_Descending_Cursor_Value_NonNull_NET10_0.md Adds SqlServer nullable paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperSqlServerNullableTests.Paging_Nullable_Ascending_Cursor_Value_Null_NET9_0.md Adds SqlServer nullable paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperSqlServerNullableTests.Paging_Nullable_Ascending_Cursor_Value_Null_NET8_0.md Adds SqlServer nullable paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperSqlServerNullableTests.Paging_Nullable_Ascending_Cursor_Value_Null_NET10_0.md Adds SqlServer nullable paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperSqlServerNullableTests.Paging_Nullable_Ascending_Cursor_Value_NonNull_NET9_0.md Adds SqlServer nullable paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperSqlServerNullableTests.Paging_Nullable_Ascending_Cursor_Value_NonNull_NET8_0.md Adds SqlServer nullable paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperSqlServerNullableTests.Paging_Nullable_Ascending_Cursor_Value_NonNull_NET10_0.md Adds SqlServer nullable paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperSqlServerNullableTests.Paging_NullableReference_Descending_Cursor_Value_Null_NET9_0.md Adds SqlServer nullable-reference paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperSqlServerNullableTests.Paging_NullableReference_Descending_Cursor_Value_Null_NET8_0.md Adds SqlServer nullable-reference paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperSqlServerNullableTests.Paging_NullableReference_Descending_Cursor_Value_Null_NET10_0.md Adds SqlServer nullable-reference paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperSqlServerNullableTests.Paging_NullableReference_Descending_Cursor_Value_NonNull_NET9_0.md Adds SqlServer nullable-reference paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperSqlServerNullableTests.Paging_NullableReference_Descending_Cursor_Value_NonNull_NET8_0.md Adds SqlServer nullable-reference paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperSqlServerNullableTests.Paging_NullableReference_Descending_Cursor_Value_NonNull_NET10_0.md Adds SqlServer nullable-reference paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperSqlServerNullableTests.Paging_NullableReference_Ascending_Cursor_Value_Null_NET9_0.md Adds SqlServer nullable-reference paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperSqlServerNullableTests.Paging_NullableReference_Ascending_Cursor_Value_Null_NET8_0.md Adds SqlServer nullable-reference paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperSqlServerNullableTests.Paging_NullableReference_Ascending_Cursor_Value_Null_NET10_0.md Adds SqlServer nullable-reference paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperSqlServerNullableTests.Paging_NullableReference_Ascending_Cursor_Value_NonNull_NET9_0.md Adds SqlServer nullable-reference paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperSqlServerNullableTests.Paging_NullableReference_Ascending_Cursor_Value_NonNull_NET8_0.md Adds SqlServer nullable-reference paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperSqlServerNullableTests.Paging_NullableReference_Ascending_Cursor_Value_NonNull_NET10_0.md Adds SqlServer nullable-reference paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperPostgreSqlNullableTests.Paging_Nullable_Descending_Cursor_Value_Null_NET10_0.md Adds PostgreSQL nullable paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperPostgreSqlNullableTests.Paging_Nullable_Descending_Cursor_Value_Null.md Adds PostgreSQL nullable paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperPostgreSqlNullableTests.Paging_Nullable_Descending_Cursor_Value_NonNull_NET10_0.md Adds PostgreSQL nullable paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperPostgreSqlNullableTests.Paging_Nullable_Descending_Cursor_Value_NonNull.md Adds PostgreSQL nullable paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperPostgreSqlNullableTests.Paging_Nullable_Ascending_Cursor_Value_Null_NET9_0.md Adds PostgreSQL nullable paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperPostgreSqlNullableTests.Paging_Nullable_Ascending_Cursor_Value_Null_NET8_0.md Adds PostgreSQL nullable paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperPostgreSqlNullableTests.Paging_Nullable_Ascending_Cursor_Value_Null_NET10_0.md Adds PostgreSQL nullable paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperPostgreSqlNullableTests.Paging_Nullable_Ascending_Cursor_Value_NonNull_NET9_0.md Adds PostgreSQL nullable paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperPostgreSqlNullableTests.Paging_Nullable_Ascending_Cursor_Value_NonNull_NET8_0.md Adds PostgreSQL nullable paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperPostgreSqlNullableTests.Paging_Nullable_Ascending_Cursor_Value_NonNull_NET10_0.md Adds PostgreSQL nullable paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperPostgreSqlNullableTests.Paging_NullableReference_Descending_Cursor_Value_Null_NET10_0.md Adds PostgreSQL nullable-reference paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperPostgreSqlNullableTests.Paging_NullableReference_Descending_Cursor_Value_Null.md Adds PostgreSQL nullable-reference paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperPostgreSqlNullableTests.Paging_NullableReference_Descending_Cursor_Value_NonNull_NET10_0.md Adds PostgreSQL nullable-reference paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperPostgreSqlNullableTests.Paging_NullableReference_Descending_Cursor_Value_NonNull.md Adds PostgreSQL nullable-reference paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperPostgreSqlNullableTests.Paging_NullableReference_Ascending_Cursor_Value_Null_NET9_0.md Adds PostgreSQL nullable-reference paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperPostgreSqlNullableTests.Paging_NullableReference_Ascending_Cursor_Value_Null_NET8_0.md Adds PostgreSQL nullable-reference paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperPostgreSqlNullableTests.Paging_NullableReference_Ascending_Cursor_Value_Null_NET10_0.md Adds PostgreSQL nullable-reference paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperPostgreSqlNullableTests.Paging_NullableReference_Ascending_Cursor_Value_NonNull_NET9_0.md Adds PostgreSQL nullable-reference paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperPostgreSqlNullableTests.Paging_NullableReference_Ascending_Cursor_Value_NonNull_NET8_0.md Adds PostgreSQL nullable-reference paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperPostgreSqlNullableTests.Paging_NullableReference_Ascending_Cursor_Value_NonNull_NET10_0.md Adds PostgreSQL nullable-reference paging SQL snapshot
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperIntegrationTests.Paging_First_5_Before_Id_96_NET9_0.md Updates integration snapshot output
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperIntegrationTests.Paging_First_5_Before_Id_96_NET8_0.md Updates integration snapshot output
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperIntegrationTests.Paging_First_5_Before_Id_96_NET10_0.md Updates integration snapshot output
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperIntegrationTests.Paging_First_5_After_Id_13_NET9_0.md Updates integration snapshot output
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperIntegrationTests.Paging_First_5_After_Id_13_NET8_0.md Updates integration snapshot output
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/snapshots/PagingHelperIntegrationTests.Paging_First_5_After_Id_13_NET10_0.md Updates integration snapshot output
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/TestContext/NullableTestsContext.cs Adds EF test context/entities for nullable-key scenarios
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/SqlServerCacheCollectionFixture.cs Adds SqlServer Squadron fixture wiring
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/PagingHelperSqlServerNullableTests.cs Adds SqlServer nullable paging integration tests
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/PagingHelperPostgreSqlNullableTests.cs Adds PostgreSQL nullable paging integration tests
src/GreenDonut/test/GreenDonut.Data.EntityFramework.Tests/GreenDonut.Data.EntityFramework.Tests.csproj Adds SqlServer EF provider + Squadron dependency
src/GreenDonut/src/GreenDonut.Data/Cursors/Serializers/UShortCursorKeySerializer.cs Allows nullable cursor key type resolution
src/GreenDonut/src/GreenDonut.Data/Cursors/Serializers/ULongCursorKeySerializer.cs Allows nullable cursor key type resolution
src/GreenDonut/src/GreenDonut.Data/Cursors/Serializers/UIntCursorKeySerializer.cs Allows nullable cursor key type resolution
src/GreenDonut/src/GreenDonut.Data/Cursors/Serializers/TimeOnlyCursorKeySerializer.cs Allows nullable cursor key type resolution
src/GreenDonut/src/GreenDonut.Data/Cursors/Serializers/ShortCursorKeySerializer.cs Allows nullable cursor key type resolution
src/GreenDonut/src/GreenDonut.Data/Cursors/Serializers/LongCursorKeySerializer.cs Allows nullable cursor key type resolution
src/GreenDonut/src/GreenDonut.Data/Cursors/Serializers/IntCursorKeySerializer.cs Allows nullable cursor key type resolution
src/GreenDonut/src/GreenDonut.Data/Cursors/Serializers/GuidCursorKeySerializer.cs Allows nullable cursor key type resolution
src/GreenDonut/src/GreenDonut.Data/Cursors/Serializers/FloatCursorKeySerializer.cs Allows nullable cursor key type resolution
src/GreenDonut/src/GreenDonut.Data/Cursors/Serializers/DoubleCursorKeySerializer.cs Allows nullable cursor key type resolution
src/GreenDonut/src/GreenDonut.Data/Cursors/Serializers/DecimalCursorKeySerializer.cs Allows nullable cursor key type resolution
src/GreenDonut/src/GreenDonut.Data/Cursors/Serializers/DateTimeOffsetCursorKeySerializer.cs Allows nullable cursor key type resolution
src/GreenDonut/src/GreenDonut.Data/Cursors/Serializers/DateTimeCursorKeySerializer.cs Allows nullable cursor key type resolution
src/GreenDonut/src/GreenDonut.Data/Cursors/Serializers/DateOnlyCursorKeySerializer.cs Allows nullable cursor key type resolution
src/GreenDonut/src/GreenDonut.Data/Cursors/Serializers/BoolCursorKeySerializer.cs Allows nullable cursor key type resolution
src/GreenDonut/src/GreenDonut.Data.Primitives/PagingArguments.cs Adds NullOrdering to paging arguments
src/GreenDonut/src/GreenDonut.Data.Primitives/NullOrdering.cs Introduces NullOrdering enum
src/GreenDonut/src/GreenDonut.Data.EntityFramework/Extensions/PagingQueryableExtensions.cs Passes NullOrdering into slicing expression generation
src/GreenDonut/src/GreenDonut.Data.EntityFramework/Expressions/ExpressionHelpers.cs Implements nullable-key slicing logic + NullOrdering
src/Directory.Packages.props Adds EF SqlServer + Squadron.SqlServer package versions

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/HotChocolate/Data/test/Data.Tests/PagingHelperIntegrationTests.cs Outdated
Comment thread src/HotChocolate/Core/test/Types.Analyzers.Integration.Tests/IntegrationTests.cs Outdated
Comment thread src/HotChocolate/Data/test/Data.Tests/PagingHelperIntegrationTests.cs Outdated
@michaelstaib michaelstaib force-pushed the gai/nullable-cursor-keys branch from 66da6d7 to a8a0382 Compare March 3, 2026 21:25
@github-actions github-actions Bot added the 📚 documentation This issue is about working on our documentation. label Mar 3, 2026
@michaelstaib michaelstaib marked this pull request as ready for review March 3, 2026 21:39
@michaelstaib michaelstaib self-requested a review March 3, 2026 21:39
@glen-84 glen-84 changed the title Added support for nullable cursor keys Add support for nullable cursor keys Mar 4, 2026
@michaelstaib michaelstaib self-assigned this Mar 4, 2026
@michaelstaib michaelstaib merged commit e49d176 into main Mar 4, 2026
5 checks passed
@michaelstaib michaelstaib deleted the gai/nullable-cursor-keys branch March 4, 2026 14:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

📚 documentation This issue is about working on our documentation. 🌶️ green donut 🌶️ hot chocolate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants