DataSpace.Query
0.2.0-preview.3
dotnet add package DataSpace.Query --version 0.2.0-preview.3
NuGet\Install-Package DataSpace.Query -Version 0.2.0-preview.3
<PackageReference Include="DataSpace.Query" Version="0.2.0-preview.3" />
<PackageVersion Include="DataSpace.Query" Version="0.2.0-preview.3" />
<PackageReference Include="DataSpace.Query" />
paket add DataSpace.Query --version 0.2.0-preview.3
#r "nuget: DataSpace.Query, 0.2.0-preview.3"
#:package DataSpace.Query@0.2.0-preview.3
#addin nuget:?package=DataSpace.Query&version=0.2.0-preview.3&prerelease
#tool nuget:?package=DataSpace.Query&version=0.2.0-preview.3&prerelease
DataSpace
A modular Access-style database studio for the browser and desktop, built with Uno Platform and SkiaSharp.
Browser application · Architecture · Compatibility · Performance · Contributing
DataSpace brings an Office-style ribbon, searchable object navigation, tabbed objects, editable datasheets, graphical queries, form design, report previews and relationship diagrams to a shared .NET codebase. The browser is the actual Uno/Skia application compiled to WebAssembly—not an HTML mockup or a separate front end.
0.2.0-preview.3: an independent Access-style implementation, not complete or verified pixel-for-pixel Microsoft Access parity. Native
.accdb/.mdb, ACE/Jet, VBA and the full Access feature set are not supported. Read the compatibility matrix before planning a migration.
Workspace
| Area | Implemented workflows |
|---|---|
| Shell | Red title bar, quick-access commands, grouped ribbon, File backstage, searchable objects, tabs, record navigation and explicit errors. |
| Tables | Typed fields, insert/update/delete, required/default/primary/unique constraints, atomic undo/redo, detached field design and ordered single/composite index editing. |
| Datasheets | Visible-cell Skia drawing, lazy row materialization, range selection, keyboard navigation, native text editing, TSV clipboard, sorting, resizing, filtering, debounced search and cached totals. |
| Queries | SQL and parameter editing, native QBE grid, draggable source cards, join properties, criteria/OR rows, grouping, SELECT SQL round trips, Find Duplicates/Unmatched builders and read-only result grids. |
| Query engine | Streaming SELECT/TOP, transient equality hash joins, supported expressions/aggregation, UNION/UNION ALL, saved sources, correlated scalar/EXISTS/IN/ANY/ALL subqueries and confirmed atomic actions including INSERT SELECT. |
| Forms | Bound record entry, text/YesNo controls, navigation, snapped control drag/resize, creation/deletion and geometry/caption properties. |
| Reports | Table/query source, columns, title/orientation, pagination, zoom and Skia PDF export through the same page renderer. |
| Relationships and macros | Referential checks/cascades, draggable relationship diagrams, and explicitly invoked ordered workspace macro actions. |
| Files | Versioned .dspace JSON, CSV import/export, desktop file adapters, transactional IndexedDB, cross-tab version checks and explicit backup exports. |
The Northwind-style initial workspace contains demonstration data. Use File → New to create a database or External Data → Text File to import CSV. In a query, switch between Design View, SQL View and Datasheet View. Compound/action SQL stays in SQL View when it cannot be represented by the SELECT designer. In table Design View, Indexes opens the reusable ordered index editor.
Crosstab queries have a dedicated Crosstab Builder, optional fixed column headings and row totals. The engine also supports atomic SELECT INTO make-table queries and constraint-index DDL. Streaming groups and bounded ordered TOP selection reduce retained query state. See query analytics for syntax, reusable APIs and explicit limitations.
Find Duplicates and Find Unmatched in the query editor generate ordinary saved SQL. Nested queries support lexical correlations and per-execution caching of eligible independent results, with explicit work limits and null semantics. See subqueries and Find builders. Duplicate detail searches remain correlated and may be expensive; summary mode is preferable for large tables.
Build and run
The repository pins Uno.Sdk 6.7.30, matched SkiaSharp 4.152.1 packages and the .NET 10 SDK family. Managed and native Skia versions must remain aligned.
git clone https://github.com/wieslawsoltes/DataSpace.git
cd DataSpace
dotnet workload install wasm-tools
dotnet test tests/DataSpace.Tests/DataSpace.Tests.csproj -c Release
dotnet run --project src/DataSpace.App/DataSpace.App.csproj -f net10.0-desktop
# Publish the real browser application
dotnet publish src/DataSpace.App/DataSpace.App.csproj \
-c Release -f net10.0-browserwasm -o artifacts/publish
python3 scripts/stage-site.py
python3 -m http.server 8080 --directory artifacts/site
Open http://localhost:8080/, not file://. Desktop execution requires the selected Uno backend's native dependencies and display server. The browser build uses a relative base path and does not require cross-origin-isolation headers or WebAssembly threads.
Download
Every release ships a self-contained, single-file desktop app — no .NET install needed:
| OS | x64 | Arm64 |
|---|---|---|
| Windows | DataSpace-<version>-win-x64.zip |
DataSpace-<version>-win-arm64.zip |
| macOS | DataSpace-<version>-osx-x64.tar.gz |
DataSpace-<version>-osx-arm64.tar.gz |
| Linux | DataSpace-<version>-linux-x64.tar.gz |
DataSpace-<version>-linux-arm64.tar.gz |
Extract and run DataSpace (DataSpace.exe on Windows). Builds are not code-signed yet: on macOS clear the quarantine flag with xattr -d com.apple.quarantine DataSpace; on Windows choose More info → Run anyway in SmartScreen. Verify downloads against SHA256SUMS.txt.
The libraries below are published to NuGet.org, e.g. dotnet add package DataSpace.Query --prerelease (preview versions need --prerelease).
Independently reusable libraries
| Package | Responsibility |
|---|---|
DataSpace.Core |
Model, typed values, validation, record/schema/index transactions, history, snapshots and document codec. |
DataSpace.Query |
SQL parsing/evaluation, QBE/Find models, subqueries, query statistics and lazy identity-preserving table views. |
DataSpace.Storage |
CSV, optimistic storage contracts/adapters and asynchronous save-session coordination. |
DataSpace.Rendering |
Independent Skia datasheet, form, relationship, report and icon renderers. |
DataSpace.Controls |
Reusable Uno ribbon/navigation/datasheet, object designers, query builders, resource styles and optional full workspace shell. |
None depends on DataSpace.App. The thin app injects platform file dialogs and browser interop. CI packages all five libraries; version tags attach them to GitHub Releases and publish them, with symbols, to NuGet.org. The controls library uses a portable net10.0 package asset and is compiled through both app heads.
Engine usage without Uno
using DataSpace.Core;
using DataSpace.Query;
var workspace = new DatabaseWorkspace(new DatabaseDocument { Name = "Inventory" });
workspace.Edit("Create table", document => ObjectFactory.CreateTable(document));
workspace.Edit("Add record", document => RecordOperations.Insert(
document.Table("Table1"), new Dictionary<string, string?> { ["Title"] = "Notebook" }));
var view = TableView.Open(workspace.Document, "Table1", sortField: "Title");
var firstPage = view.ReadPage(0, 50);
workspace.UpdateRecords("Edit title", "Table1", [new(firstPage[0].Id, "Title", "Drawing pad")]);
var result = new QueryEngine().Select(workspace.Document,
"SELECT ID, Title FROM Table1 UNION ALL SELECT 0, 'Unassigned' ORDER BY Title");
workspace.Undo();
Only mutate live data through DatabaseWorkspace.Edit or UpdateRecords. Public models remain mutable for construction/serialization, but direct mutation bypasses history, validation and cache guarantees. Virtual-view records are detached display snapshots, not backing storage. Use TableView.Select for the compatible eager result API.
Embed the workspace
var workspace = new DatabaseWorkspace(SampleDatabase.Create());
var session = new WorkspaceSession(workspace, new MemoryWorkspaceStore());
await session.InitializeAsync();
var view = new DatabaseWorkspaceView(workspace)
{
StorageIsDirty = () => session.IsDirty,
SaveDatabaseAsync = () => session.SaveAsync()
};
// Put view in your Uno page/window. Inject ImportTextAsync and ExportFileAsync
// for your file-dialog or document-management integration.
The embedding example uses DataSpace.Core, DataSpace.Storage and DataSpace.Controls. Merge ms-appx:///DataSpace.Controls/Themes/OfficeResources.xaml for supplied styling. Individual controls and designers do not require the shell. Dispose owned views, renderers and sessions when their host is finished.
Performance and verification
Targeted edits avoid whole-database JSON copying, lazy datasheets materialize visible rows, totals are snapshot-cached, and eligible joins use transient hash lookups. Independent subqueries can reuse results within one execution and compatible IN sets use transient membership indexes. Performance documentation records reproducible managed benchmarks, work counters and remaining limits. Those measurements are not browser/GPU/frame-rate claims.
dotnet run --project benchmarks/DataSpace.Benchmarks/DataSpace.Benchmarks.csproj \
-c Release -- artifacts/performance.json
build.yml runs managed regressions and benchmarks, compiles desktop, publishes WebAssembly, exercises real IndexedDB and browser interactions, packages the libraries and deploys verified main builds. PRs never deploy. Exact source, TRX, performance JSON, packages, screenshots and diagnostics are retained as artifacts. See CONTRIBUTING.md for browser-test commands.
release.yml reruns the full build.yml verification, publishes self-contained single-file desktop executables for Windows, macOS and Linux (x64 and arm64), and packs the libraries with symbols. Version tags attach desktop, package, browser and source archives with SHA256SUMS.txt to a GitHub Release (prerelease for versions with a suffix) and publish the packages to NuGet.org with Trusted Publishing (OIDC, no stored API key) from the protected nuget environment. Manual runs take a version input and are dry runs: they build and upload every asset as workflow artifacts but publish nothing and do not deploy Pages. Creating a workflow does not imply that a release has been published; check the release history and CI results.
Save and protect work
Ctrl+S commits the active editor and saves locally. Browser data belongs to the origin/profile; clearing site data or losing a profile may remove it. Export a .dspace backup. Data is not encrypted or uploaded to a cloud database by the storage adapter.
IndexedDB saves compare and replace the expected version inside one transaction. A conflicting tab fails instead of silently overwriting another window; export its work before reloading. The previous committed browser generation is retained, but no recovery-management UI or automatic merge exists. Invalid stored documents are not silently replaced, failed validation preserves editor drafts, and edits made while saving remain dirty.
License and attribution
MIT licensed. Uno Platform, SkiaSharp and transitive dependency notices remain applicable. No Microsoft Access source, proprietary application icons or Microsoft font files are bundled. Microsoft Access is a Microsoft trademark; DataSpace is independent and not affiliated with or endorsed by Microsoft.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | 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
- DataSpace.Core (>= 0.2.0-preview.3)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on DataSpace.Query:
| Package | Downloads |
|---|---|
|
DataSpace.Controls
Reusable Office-style Uno ribbon, navigation, datasheet and database designer controls. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.2.0-preview.3 | 0 | 9/29/2026 |