Ignyte.Inquiry.Testing
1.0.0-preview.10
dotnet add package Ignyte.Inquiry.Testing --version 1.0.0-preview.10
NuGet\Install-Package Ignyte.Inquiry.Testing -Version 1.0.0-preview.10
<PackageReference Include="Ignyte.Inquiry.Testing" Version="1.0.0-preview.10" />
<PackageVersion Include="Ignyte.Inquiry.Testing" Version="1.0.0-preview.10" />
<PackageReference Include="Ignyte.Inquiry.Testing" />
paket add Ignyte.Inquiry.Testing --version 1.0.0-preview.10
#r "nuget: Ignyte.Inquiry.Testing, 1.0.0-preview.10"
#:package Ignyte.Inquiry.Testing@1.0.0-preview.10
#addin nuget:?package=Ignyte.Inquiry.Testing&version=1.0.0-preview.10&prerelease
#tool nuget:?package=Ignyte.Inquiry.Testing&version=1.0.0-preview.10&prerelease
Inquiry
Inquiry is an experimental .NET 8+ source-generated micro-ORM. You write attributed entity classes and partial store classes with partial method declarations; a Roslyn source generator emits the matching partial with method bodies, materializers, and dependency-injection wiring. Every SQL string is built at compile time by a provider-specific SqlBuilder and baked into the generated source as const string fields, so each database can be tuned independently and the runtime carries no SQL.
Documentation lives in the DocFX site (
docs/site/) — getting-started, features, per-dialect notes, the architecture deep-dive, security, and an auto-generated API reference, plus a Develop area with project status and the roadmap. The published site lives at https://ignytesoftware.github.io/inquiry/ (deployed bydocs.ymlon every push tomain); preview locally withdocfx docs/site/docfx.json --serve(seedocs/site/README.md).
- New here? Getting started · How it works
- Reference: Features · Providers · Security · Architecture
- Project state: Project status · Roadmap · Contributing
Repository layout
| Project | Purpose |
|---|---|
src/Inquiry |
Public runtime: IInquiry facade, attributes, command/parameter types, transactions, options, and the DI extension AddInquiry(). Ships no SQL; the request pipeline is internal. |
src/Inquiry.Generators.Shared |
Roslyn incremental source-generator framework. Discovers entities and stores; emits materializers, generated stores, the DI registration class, and InquiryGeneratedSchema.Ddl. Owns the per-dialect SqlBuilder hierarchy. Bundled privately into each provider analyzer. |
src/Inquiry.{Sqlite,SqlServer,PostgreSql,MySql,MariaDb,Oracle}.Analyzer |
Per-dialect Roslyn analyzers — each a [Generator] that bundles the shared framework and emits only when its dialect matches the resolved [InquiryDialect]. |
src/Inquiry.{Sqlite,SqlServer,PostgreSql,MySql,MariaDb,Oracle} |
Per-dialect runtime providers: AddInquiry<Dialect>(...) DI extension, provider options, internal connection factory, and the [assembly: InquiryDialect("...")] marker. |
src/Inquiry.AspNetCore |
ASP.NET Core audit-context middleware that stamps CreatedBy/ModifiedBy from the current user identity. |
src/Inquiry.Aspire |
Aspire resource-name registration with automatic Inquiry telemetry and health checks. |
src/Inquiry.Interceptors |
Opt-in companion: slow-query warning logging, sqlcommenter trace-context tagging, and N+1 query detection. |
src/Inquiry.Testing |
Test helpers: SQLite fixture, recording command interceptor, entity factory, transaction sandbox, and Respawn reset wrapper. |
tests/… |
Core runtime tests, source-generator tests, the shared Inquiry.IntegrationTesting and Inquiry.FeatureCatalog support libraries, and per-dialect end-to-end suites (SQLite in-process; the rest via Testcontainers). |
samples/Inquiry.Northwind |
Shared classic-Northwind entities, stores, and per-provider DDL consumed by the samples and integration tests. |
samples/Inquiry.Sample |
Runnable ASP.NET Core sample exercising CRUD, upsert, transactions, and eager loading on SQLite. |
samples/Inquiry.AotSmoke |
NativeAOT verification app — published and executed by the aot-smoke CI job. |
Quickstart
using Inquiry;
using Inquiry.Entities;
using Inquiry.Stores;
[InquiryTable("TOrganization")]
public sealed class Organization
{
[InquiryKey] public Guid Key { get; set; } = Guid.NewGuid();
[InquiryColumn("Name")] public string Name { get; set; } = string.Empty;
[InquiryColumn] public bool IsActive { get; set; } = true;
}
public partial class OrganizationStore : InquiryStore<Organization>
{
[InquirySelectAll]
public partial IAsyncEnumerable<Organization> SelectAllAsync(CancellationToken ct = default);
[InquirySelectOneByKey]
public partial Task<Organization?> SelectByKeyAsync(Guid key, CancellationToken ct = default);
[InquiryInsert]
public partial Task<int> InsertAsync(Organization o, CancellationToken ct = default);
}
Register Inquiry with a provider and resolve the store:
using Inquiry.DependencyInjection;
using Inquiry.Sqlite.DependencyInjection;
services.AddInquiry(); // core runtime services
services.AddInquiryGeneratedStores(); // stores generated in this assembly
services.AddInquirySqlite(connectionString);
var orgs = sp.GetRequiredService<OrganizationStore>();
await foreach (var o in orgs.SelectAllAsync()) { /* ... */ }
The method bodies, the SQL const strings, the materializers, and the DI wiring are all generated at build time. Beyond this core CRUD surface, Inquiry supports richer WHERE predicates, ORDER BY + offset/keyset pagination, batch & bulk operations, projections + aggregations, eager loading (incl. many-to-many through a junction), optimistic concurrency, soft deletes, global query filters, full-text search, JSON/value-converter columns, JSON-path predicate querying, CREATE TABLE schema-DDL generation, opt-in observability (OpenTelemetry tracing + metrics and ILogger logging via AddInquiryTelemetry()), and open-time resiliency (cloud transient retry + backup-server failover). See How it works and the Architecture deep-dive for the full compile-time pipeline, SQL-building, and runtime walkthrough.
Running the sample
dotnet run --project samples\Inquiry.Sample\Inquiry.Sample.csproj
The sample seeds a database (SQLite by default; configurable to SQL Server or PostgreSQL via Inquiry:Provider), serves a Blazor Server dashboard at /, and exercises CRUD, upsert, eager loading, and a transactional insert.
Running the tests
dotnet test
Tests cover parameter binding, the request pipeline, transactions, generator emission, per-dialect SQL strings, end-to-end CRUD/eager-loading against in-memory SQLite, and — for every provider — live CRUD, schema-fidelity, and generated-DDL verification against the real engine.
The SQL Server, PostgreSQL, MySQL, MariaDB, and Oracle integration suites provision their engine with Testcontainers — the only host dependency is Docker. When Docker is unavailable every live fact skips (via SkippableFact) rather than failing, so dotnet test stays green without Docker. Required CI runs all five server providers with Docker required on pull requests into main. See Project status for the current state and the Roadmap for what's next.
Installing
Packages ship on nuget.org under the Ignyte. prefix (assemblies and namespaces remain Inquiry.*). Install the provider you need — it pulls in the core Ignyte.Inquiry package:
dotnet add package Ignyte.Inquiry.Sqlite # or .SqlServer / .PostgreSql / .MySql / .MariaDb / .Oracle
dotnet add package Ignyte.Inquiry.Aspire # optional Aspire client integration
dotnet add package Ignyte.Inquiry.Testing # optional test helpers
Contributing and releasing
See CONTRIBUTING.md for the full workflow. In short: feature branches PR into main (trunk-based); releases are tag-driven — a maintainer pushes vX.Y.Z for a stable or vX.Y.Z-preview.N for a preview, and release.yml packs, verifies, and publishes to nuget.org. The tag must match the version in eng/release-manifest.json, so every release starts with a reviewed manifest-bump PR. See Contributing — Releasing for the package verifier details.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Ignyte.Inquiry (>= 1.0.0-preview.10)
- Ignyte.Inquiry.Sqlite (>= 1.0.0-preview.10)
- Microsoft.Data.SqlClient (>= 7.0.2)
- Microsoft.Data.Sqlite (>= 10.0.11)
- Microsoft.Extensions.Configuration.Abstractions (>= 10.0.11)
- Microsoft.Extensions.DependencyInjection (>= 10.0.11)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.11)
- Microsoft.Extensions.Diagnostics.HealthChecks (>= 10.0.11)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.11)
- Respawn (>= 7.0.0)
- SQLitePCLRaw.lib.e_sqlite3 (>= 3.53.3)
- System.Configuration.ConfigurationManager (>= 10.0.11)
-
net8.0
- Ignyte.Inquiry (>= 1.0.0-preview.10)
- Ignyte.Inquiry.Sqlite (>= 1.0.0-preview.10)
- Microsoft.Data.SqlClient (>= 7.0.2)
- Microsoft.Data.Sqlite (>= 10.0.11)
- Microsoft.Extensions.Configuration.Abstractions (>= 10.0.11)
- Microsoft.Extensions.DependencyInjection (>= 10.0.11)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.11)
- Microsoft.Extensions.Diagnostics.HealthChecks (>= 10.0.11)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.11)
- Respawn (>= 7.0.0)
- SQLitePCLRaw.lib.e_sqlite3 (>= 3.53.3)
- System.Configuration.ConfigurationManager (>= 10.0.11)
-
net9.0
- Ignyte.Inquiry (>= 1.0.0-preview.10)
- Ignyte.Inquiry.Sqlite (>= 1.0.0-preview.10)
- Microsoft.Data.SqlClient (>= 7.0.2)
- Microsoft.Data.Sqlite (>= 10.0.11)
- Microsoft.Extensions.Configuration.Abstractions (>= 10.0.11)
- Microsoft.Extensions.DependencyInjection (>= 10.0.11)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.11)
- Microsoft.Extensions.Diagnostics.HealthChecks (>= 10.0.11)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.11)
- Respawn (>= 7.0.0)
- SQLitePCLRaw.lib.e_sqlite3 (>= 3.53.3)
- System.Configuration.ConfigurationManager (>= 10.0.11)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0-preview.10 | 57 | 9/4/2026 |
| 1.0.0-preview.9 | 59 | 8/29/2026 |
| 1.0.0-preview.8 | 64 | 8/18/2026 |
| 1.0.0-preview.7 | 73 | 8/3/2026 |
| 1.0.0-preview.6 | 61 | 8/3/2026 |
| 1.0.0-preview.5 | 68 | 8/2/2026 |
| 1.0.0-preview.4 | 63 | 8/2/2026 |
| 1.0.0-preview.3 | 69 | 8/2/2026 |