这个项目能做什么

# RedBase — .NET 的类型化对象存储 RedBase 是一个面向 .NET 的数据平台,可将类型化对象存储在关系型后端(PostgreSQL、Microsoft SQL Server 或 SQLite——包括通过 SQLite 提供程序实现的嵌入式/离线、Blazor WebAssembly 和移动端)。您以普通 C# 类定义架构——RedBase 通过单一 LINQ 风格 API 处理存储、索引、查询、树、列表、聚合和窗口函数。 没有 Entity Framework。没有迁移。没有 40 张表的 Include 链。只有 C# 类,一行保存,一行加载。 ## 为什么选择 RedBase - **架构 = C# 类**:通过向类添加属性来添加字段;`SyncSchemeAsync()` 处理其余工作。没有迁移文件。 - **完整对象图**:嵌套的 `RedbObject<T>` 引用(单个、数组、字典)在一次调用中保存和加载——没有 JOIN 或 Include 链。 - **强类型**:每个属性映射到专用的类型化列,带外键约束和索引——不是 JSON blob。可在 SQL 级别查询。 - **内置树**:`TreeQuery<T>()` 支持递归 CTE、深度、祖先和到根的路径。 - **丰富的查询 API**:完整 LINQ 支持,包括 Where 过滤、投影、GroupBy、聚合和窗口函数(ROW_NUMBER、RANK、LAG/LEAD、NTILE、自定义帧)。 - **多提供程序**:PostgreSQL、MSSQL 和 SQLite(包括用于 Blazor WebAssembly 和移动端的纯 C#)。 ## 快速开始 ```csharp // 1. 定义架构——这就是你的“迁移” [RedbScheme("Employee")] public class EmployeeProps { public string FirstName { get; set; } = ""; public string LastName { get; set; } = ""; public int Age { get; set; } public decimal Salary { get; set; } public string Department { get; set; } = ""; public string Position { get; set; } = ""; public DateTime HireDate { get; set; } public string[]? Skills { get; set; } public Address? HomeAddress { get; set; } public Dictionary<int, decimal>? BonusByYear { get; set; } } // 2. 同步架构(自动创建存储) await redb.SyncSchemeAsync<EmployeeProps>(); // 3. 保存 var employee = new RedbObject<EmployeeProps> { name = "New Developer", Props = new EmployeeProps { FirstName = "Alice", LastName = "Johnson", Age = 28, Position = "Developer", Department = "Engineering", Salary = 85000m, HireDate = DateTime.Today, Skills = ["C#", "React", "SQL"] } }; await redb.SaveAsync(employee); // 4. 加载 var loaded = await redb.LoadAsync<EmployeeProps>(employee.Id); // 5. 查询 var results = await redb.Query<EmployeeProps>() .Where(e => e.Salary > 75000m) .OrderByDescending(e => e.Salary) .Take(100) .ToListAsync(); ``` ## 包 | 包 | 描述 | |---------|-------------| | `redb.Core` | 核心抽象、查询构建器、LINQ 提供程序 | | `redb.Postgres` | PostgreSQL 提供程序(免费,Apache 2.0) | | `redb.MSSql` | Microsoft SQL Server 提供程序(免费,Apache 2.0) | | `redb.SQLite` | SQLite 提供程序(免费,Apache 2.0)——嵌入式/离线,原生可加载扩展 | | `redb.Core.Pro` | Pro 扩展:并行物化、变更跟踪、迁移 | | `redb.Postgres.Pro` | PostgreSQL Pro 提供程序,带优化的查询生成 | | `redb.MSSql.Pro` | MSSQL Pro 提供程序,带优化的查询生成 | | `redb.SQLite.Pro` | SQLite Pro 提供程序——纯 C#(无原生扩展):Blazor WebAssembly 和移动端 | | `redb.Export` | 数据库导出/导入:`.redb` 文件(JSONL/ZIP),用于备份、PostgreSQL ↔ MSSQL 之间的迁移 | ## 能力 ### CRUD - 保存单个或批量对象 - 按 ID 加载完整对象图 - 通过 COPY 协议批量插入 - 删除并可选择清除 ### 丰富的 Props 结构 Props 可以包含标量、嵌套类、数组、字典(包括元组键)和 `RedbObject` 引用——任意深度。全部通过一次调用保存和加载。 ### 查询功能 - **Where 过滤**:比较、AND/OR/NOT、`WhereIn`、可空检查、基础字段过滤 - **字符串操作**:Contains、StartsWith、不区分大小写(支持非英语文本的 ICU 排序规则) - **嵌套属性**:在任意深度过滤嵌套类字段 - **数组操作**:包含元素、任意/全部组合 - **字典操作**:ContainsKey、索引器过滤、嵌套值 - **投影与分页**:Select、Distinct、OrderBy/ThenBy、Skip/Take、FirstOrDefault - **聚合**:Sum、Average、Min/Max、批量聚合、过滤聚合 - **GroupBy**:单键或复合键、数组元素分组 - **窗口函数**:ROW_NUMBER、RANK、DENSE_RANK、运行总和、LAG/LEAD、FIRST/LAST_VALUE、NTILE、自定义帧 ### 树结构 内置层次数据,采用闭包表存储和递归 CTE: - 创建子节点 - 加载完整树并限制深度 - 获取子节点/后代 - 到根的路径 ## 安装 ```bash # PostgreSQL(免费) dotnet add package redb.Postgres # 或 MSSQL(免费) dotnet add package redb.MSSql # Pro——自动包含 redb.Core.Pro dotnet add package redb.Postgres.Pro # 或 redb.MSSql.Pro ``` ## 设置 ```csharp using redb.Core; using redb.Core.Extensions; using redb.Postgres.Pro.Extensions; var builder = WebApplication.CreateBuilder(args); builder.Services.AddRedbPro(options => options .UsePostgres("Host=localhost;Database=mydb;Username=postgres;Password=pass") .Configure(c => { c.PropsSaveStrategy = PropsSaveStrategy.ChangeTracking; c.EnableLazyReferences = false; c.EnablePropsCache = true; })); var app = builder.Build(); var redb = app.Services.GetRequiredService<IRedbService>(); await redb.InitializeAsync(); await redb.SyncSchemeAsync<EmployeeProps>(); ``` 免费版本使用 `AddRedb` 而不是 `AddRedbPro`。 ## 数据库设置选项 - 启动时自动(`InitializeAsync(ensureCreated: true)`) - 显式调用(`EnsureDatabaseAsync()` + `InitializeAsync()`) - 为 DBA/CI 导出 SQL 脚本(`GetSchemaScript()`) - CLI 工具(`redb init`、`redb schema`) ## 客户端:Blazor WebAssembly 和移动端 两者都运行在 `redb.SQLite.Pro`(纯 C#)上。移动端无需特殊处理;Blazor WebAssembly 需要原生重新链接、手动初始化和应用程序级持久化。 ## 许可证 免费包采用 Apache 2.0;Pro 包需要许可证(SQLite.Pro 的 3.x/4.x 系列不需要)。