Skip to content

Multiple result sets

Use one stored procedure when related data belongs to the same request and should be read in one database round trip. CaeriusNet provides generated overloads for 2 through 10 result sets and three materialized tuple families.

sql
CREATE PROCEDURE dbo.usp_Dashboard_Get
AS
BEGIN
    SET NOCOUNT ON;
    SELECT Id, Name FROM dbo.Users ORDER BY Id;
    SELECT Id, UserId, Total FROM dbo.Orders ORDER BY Id;
END
csharp
var command = new StoredProcedureCommandBuilder("dbo", "usp_Dashboard_Get")
    .WithResultSetCapacities(128, 512)
    .Build();

var (users, orders) = await database
    .QueryMultipleReadOnlyCollectionAsync<User, Order>(command, ct);

Collection families

API familyTuple elements
QueryMultipleAsync<T1, …>IEnumerable<T> (materialized)
QueryMultipleReadOnlyCollectionAsync<T1, …>ReadOnlyCollection<T>
QueryMultipleImmutableArrayAsync<T1, …>ImmutableArray<T>

Each method accepts a capacity for every set. A StoredProcedureCommand can also hold the expected capacities with WithResultSetCapacities.

Result-set count is a contract

By default, the reader must provide exactly the number of result sets announced by the overload. Missing and additional sets cause CaeriusContractException; CaeriusNet fully consumes every expected set before returning.

For a procedure intentionally designed to vary its output, pass the appropriate CaeriusResultSetCountPolicy option. Prefer a stable procedure contract: allowing a missing or extra set should be a conscious compatibility decision, not an accidental outcome of a changed SELECT list.

The generic type order always follows SQL SELECT order. CaeriusNet cannot match sets by column name or type.

Cache behavior

A multi-result execution has one aggregate cache identity. When cacheable and a codec is available, every set is encoded and retrieved atomically under one key; the runtime never caches sets individually. This preserves the snapshot relationship between the sets.

Next: Table-valued parameters and Caching.

Released under the MIT License.