FractalDataWorks.Commands.Data
0.9.0-alpha.1011.ged0a6c6e98
dotnet add package FractalDataWorks.Commands.Data --version 0.9.0-alpha.1011.ged0a6c6e98
NuGet\Install-Package FractalDataWorks.Commands.Data -Version 0.9.0-alpha.1011.ged0a6c6e98
<PackageReference Include="FractalDataWorks.Commands.Data" Version="0.9.0-alpha.1011.ged0a6c6e98" />
<PackageVersion Include="FractalDataWorks.Commands.Data" Version="0.9.0-alpha.1011.ged0a6c6e98" />
<PackageReference Include="FractalDataWorks.Commands.Data" />
paket add FractalDataWorks.Commands.Data --version 0.9.0-alpha.1011.ged0a6c6e98
#r "nuget: FractalDataWorks.Commands.Data, 0.9.0-alpha.1011.ged0a6c6e98"
#:package FractalDataWorks.Commands.Data@0.9.0-alpha.1011.ged0a6c6e98
#addin nuget:?package=FractalDataWorks.Commands.Data&version=0.9.0-alpha.1011.ged0a6c6e98&prerelease
#tool nuget:?package=FractalDataWorks.Commands.Data&version=0.9.0-alpha.1011.ged0a6c6e98&prerelease
FractalDataWorks DataCommands
Universal data command system that provides a single, type-safe API for working with data across any backend - SQL databases, REST APIs, file systems, GraphQL endpoints, and more.
๐ Quick Start
// Query customers
var command = new QueryCommand<Customer>("Customers")
{
Filter = new FilterExpression
{
Conditions =
[
new FilterCondition
{
PropertyName = nameof(Customer.IsActive),
Operator = FilterOperators.Equal,
Value = true
}
]
}
};
var result = await connection.ExecuteAsync(command);
๐ Documentation
User Documentation
- Overview - Architecture, concepts, and comparisons
- Developer Guide - Building commands and expressions
- Translator Guide - Building translators
- Examples - Practical examples and patterns
Design Documentation
- Design History - Architecture evolution and decisions
- Architecture Summary - Final architecture
- Implementation Details - Technical specs
โจ Key Features
โ
Universal API - One command works with SQL, REST, Files, GraphQL
โ
Type-Safe - Full compile-time type checking with generics
โ
Zero Boxing - No object casting or performance overhead
โ
Extensible - Add commands and translators without changing existing code
โ
Railway-Oriented - Explicit error handling with IGenericResult<T>
โ
No Switch Statements - Clean dispatch via TypeCollections and visitor pattern
๐๏ธ Architecture
Application Code
โ
DataCommands (Universal)
โ
Translators (Backend-Specific)
โ
Connections (Protocol)
โ
Data Sources
Projects
FractalDataWorks.Commands.Data.Abstractions/ โ Interfaces and base classes
FractalDataWorks.Commands.Data/ โ Concrete implementations
FractalDataWorks.Commands.Data.Translators/ โ Translator implementations (TBD)
๐ฏ Core Concepts
Commands
Operations on data:
QueryCommand<T>- Retrieve dataInsertCommand<T>- Add new dataUpdateCommand<T>- Modify dataDeleteCommand- Remove data
Expressions
Query logic:
FilterExpression- WHERE conditionsProjectionExpression- SELECT fieldsOrderingExpression- ORDER BYPagingExpression- SKIP/TAKE
Translators
Backend conversion:
SqlTranslatorโ SQL statementsRestTranslatorโ HTTP + ODataFileTranslatorโ File I/O
Operators
TypeCollection of filter operators:
FilterOperators.Equalโ=/eqFilterOperators.ContainsโLIKE '%value%'/containsFilterOperators.GreaterThanโ>/gt- And 9 more...
๐ Example Usage
Query with Multiple Conditions
var command = new QueryCommand<Customer>("Customers")
{
Filter = new FilterExpression
{
Logic = LogicalOperator.And,
Conditions =
[
new FilterCondition
{
PropertyName = nameof(Customer.IsActive),
Operator = FilterOperators.Equal,
Value = true
},
new FilterCondition
{
PropertyName = nameof(Customer.TotalSpent),
Operator = FilterOperators.GreaterThanOrEqual,
Value = 10000
}
]
},
Paging = new PagingExpression { Skip = 0, Take = 50 }
};
Multi-Backend Support
// Same command works with any backend!
var sqlResult = await sqlConnection.ExecuteAsync(command); // โ SQL
var restResult = await httpConnection.ExecuteAsync(command); // โ REST API
var fileResult = await fileConnection.ExecuteAsync(command); // โ JSON file
Insert with Type Safety
var customer = new Customer
{
Name = "John Doe",
Email = "john@example.com",
IsActive = true
};
var command = new InsertCommand<Customer>("Customers", customer);
var result = await connection.ExecuteAsync(command);
if (result.IsSuccess)
{
var newId = result.Value; // Type-safe! No casting needed
Console.WriteLine($"Created customer with ID: {newId}");
}
๐ง Building Custom Commands
[TypeOption(typeof(DataCommands), "MyCustomCommand")]
public sealed class MyCustomCommand<T> : DataCommandBase<T>
{
public MyCustomCommand(string containerName)
: base(
id: 10,
name: "MyCustomCommand",
containerName,
DataCommandCategory.Query)
{
}
// Add command-specific properties
public string? CustomProperty { get; init; }
}
๐งช Testing
[Fact]
public async Task ExecuteAsync_WithFilter_ReturnsFilteredResults()
{
// Arrange
var mockConnection = new Mock<IDataConnection>();
var command = new QueryCommand<Customer>("Customers")
{
Filter = CustomerFilters.Active()
};
// Act
var result = await mockConnection.Object.ExecuteAsync(command);
// Assert
result.IsSuccess.Should().BeTrue();
}
๐ Learning Path
- Start Here: Overview - Understand the architecture
- Build Commands: Developer Guide - Create your first command
- Build Translators: Translator Guide - Support new backends
- See Examples: Examples - Real-world patterns
๐ Comparisons
vs. Entity Framework Core
- โ Works with non-SQL backends (REST, Files, GraphQL)
- โ Easier testing (mock connections, not databases)
- โ ๏ธ No change tracking or migrations
vs. Dapper
- โ Type-safe query building (no string SQL)
- โ Works with non-SQL backends
- โ Protected from SQL injection by design
vs. Repository Pattern
- โ No code duplication (shared commands)
- โ Easy to swap backends
- โ Consistent API across data sources
๐ฆ Current Status
- โ Architecture: Complete
- โ Commands.Data.Abstractions: Implemented
- โ Commands.Data: Implemented (4 commands, 12 operators)
- โ Documentation: Complete
- โณ Translators: Not yet started (see guides for implementation)
- โณ Samples: Planned
๐ค Contributing
See design docs in docs/design/datacommands/ for architectural decisions and patterns to follow.
Key Conventions
- โ Use TypeCollections instead of enums
- โ Use Railway-Oriented Programming (IGenericResult)
- โ Use visitor pattern (no switch statements)
- โ Properties set in constructors (for TypeCollection compatibility)
- โ Full XML documentation
๐ License
Part of the FractalDataWorks Developer Kit.
๐ Quick Links
- API Reference:
src/FractalDataWorks.Commands.Data.Abstractions/ - Implementation:
src/FractalDataWorks.Commands.Data/ - Design History:
docs/design/datacommands/ - Samples:
samples/DataCommands/(coming soon)
Version: 1.0.0
Last Updated: October 2024
Branch: feature/datacommands-architecture
| 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
- FractalDataWorks.Collections (>= 0.9.0-alpha.1011.ged0a6c6e98)
- FractalDataWorks.Commands.Data.Abstractions (>= 0.9.0-alpha.1011.ged0a6c6e98)
- FractalDataWorks.Messages (>= 0.9.0-alpha.1011.ged0a6c6e98)
- FractalDataWorks.Results (>= 0.9.0-alpha.1011.ged0a6c6e98)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.0-rc.2.25502.107)
NuGet packages (6)
Showing the top 5 NuGet packages that depend on FractalDataWorks.Commands.Data:
| Package | Downloads |
|---|---|
|
FractalDataWorks.Data.Rest
Development tools and utilities for the FractalDataWorks ecosystem. Build: |
|
|
FractalDataWorks.Commands.Data.Extensions
Development tools and utilities for the FractalDataWorks ecosystem. Build: |
|
|
FractalDataWorks.Services.Data
Development tools and utilities for the FractalDataWorks ecosystem. Build: |
|
|
FractalDataWorks.Data.Sql
Development tools and utilities for the FractalDataWorks ecosystem. Build: |
|
|
FractalDataWorks.Data.MsSql
Development tools and utilities for the FractalDataWorks ecosystem. Build: |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.9.0-alpha.1011.ged0a6c6e98 | 42 | 11/18/2025 |
| 0.9.0-alpha.1010.gecd88aac50 | 39 | 11/18/2025 |
| 0.9.0-alpha.1009.g7f6817e985 | 36 | 11/18/2025 |
| 0.9.0-alpha.1006.gf287016c0c | 48 | 11/18/2025 |
| 0.8.0-alpha.1011 | 39 | 11/18/2025 |
| 0.7.0-alpha.1022 | 135 | 11/3/2025 |
| 0.7.0-alpha.1021 | 138 | 11/3/2025 |
| 0.7.0-alpha.1008 | 106 | 11/2/2025 |
| 0.7.0-alpha.1006 | 136 | 10/30/2025 |
| 0.7.0-alpha.1005 | 129 | 10/30/2025 |
| 0.7.0-alpha.1004 | 131 | 10/30/2025 |
| 0.7.0-alpha.1001 | 132 | 10/29/2025 |
| 0.6.0-alpha.1006 | 133 | 10/29/2025 |
| 0.6.0-alpha.1005 | 126 | 10/28/2025 |
| 0.6.0-alpha.1004 | 128 | 10/28/2025 |
| 0.6.0-alpha.1002 | 125 | 10/28/2025 |