Table of Contents

Dynamic projection

Select returned columns

static readonly QueryCommand SearchAlbums = new("""
?SELECT
    AlbumId AS Id!,
    Title,
    ReleaseYear
FROM albums
""");

var builder = SearchAlbums.StartBuilder();
builder.Use("Title");

List<DynaObject> rows = builder.Query<List<DynaObject>>(cnn);
SELECT
    AlbumId AS Id,
    Title
FROM albums

Projection key from final alias

?SELECT
    AlbumId AS Id,
    Title,
    ReleaseYear AS Year
FROM albums
var builder = SearchAlbums.StartBuilder();
builder.Use("Year");

Calculated columns can expose an explicit key with an alias.

?SELECT
    AlbumId AS Id!,
    Price * Quantity AS Total
FROM invoice_lines

Required projection entry

?SELECT
    AlbumId AS Id!,
    Title,
    ReleaseYear
FROM albums

Id remains even when it is not selected by the caller.

Supporting column group

?SELECT
    ArtistId&,
    ArtistName AS Artist,
    AlbumId AS Id!
FROM albums

Selecting Artist keeps both ArtistId and ArtistName.

Projection entry with a marker

?SELECT
    AlbumId AS Id!,
    /*WithTitle*/ Title
FROM albums

The projection key and the marker remain separate conditions.

Markers

UNION

?SELECT Id!, Name
FROM active_artists
UNION ALL
?SELECT Id!, Name
FROM archived_artists

The same alias key controls matching projection entries in both branches.

CTE

WITH albums_cte AS
(
    ?SELECT AlbumId AS Id!, Title, ReleaseYear
    FROM albums
)
SELECT * FROM albums_cte

Optional modifier

???Distinct DISTINCT
?SELECT AlbumId AS Id!, Title
FROM albums
var builder = SearchAlbums.StartBuilder();
builder.Use("Distinct");
builder.Use("Title");

Template syntax