作为 C# 开发者,你是不是也卡在这些数据访问的痛点里:
- 用 EF Core 太厚重,LINQ 翻译慢还控不住原生 SQL?
- 用 Dapper 灵活但缺类型安全,手写 SQL 满屏魔法字符串?
- 多数据库切换成本高,主从架构、数据权限还要重复造轮子?
- 遗留系统改造,EF Core/SqlSugar 实体想复用却兼容难?
今天要安利的「mooSQL」🐄,是专为 C# 开发者打造的高性能 SQL 工具集 —— 既保留原生 SQL 的灵活掌控,又兼具 ORM 的便捷与类型安全,还能无缝适配多库、权限、DDD 等企业级场景,彻底解决数据访问层的选型纠结!
🎯 mooSQL 到底能解决什么核心问题?
1. 「熟悉感拉满」:链式 API 贴近原生 SQL,上手零成本
不用重新学习晦涩的语法,mooSQL 的链式 API 和 SQL 结构完全对齐:select/from/where对应原生 SELECT/FROM/WHERE,setPage一键生成分页,orderby/groupBy语义化到底,哪怕是新手也能 5 分钟上手写复杂查询。
2. 「灵活不绑死」:既要便捷,更要掌控力
- 不想被厚重抽象限制?直接拼接 SQL 片段,原生 SQL 想怎么写就怎么写;
- 怕魔法字符串踩坑?SQLClip 模式提供类型安全,实体条件直观无歧义;
- 复杂场景控不住?支持 WITH、MERGE、多表 JOIN、虚拟 SQL 列,媲美 MyBatis 的 SQL 碎片复用,还保留 C# 的过程控制能力。
3. 「高性能不妥协」:拒绝重 LINQ 翻译开销
驱动层设计对标 Dapper,摒弃冗余的 LINQ 翻译流程,简单查询性能直逼ADO.NET;同时兼顾便捷性,不用手写重复的数据库连接、参数化逻辑,高性能和高效率两手抓。
4. 「企业级场景全覆盖」:从多库到权限,开箱即用
- 多数据库原生支持:SQL Server、MySQL、PostgreSQL、Oracle、SQLite、OceanBase、Taos 等一网打尽,方言适配友好;
- 天生多库模式:切换数据库成本极低,主从架构一键适配;
- 细粒度数据权限:内置 AuthBuilder,支持用户维度、组织维度、自定义规则的权限过滤,不用重复造权限轮子;
- 事务管理:完整的 UnitOfWork 工作单元,实体操作与手写 SQL 共享事务,一致性有保障;
- 可观测性:日志、错误、慢 SQL 监控全覆盖,运维排查问题更高效。
5. 「零迁移成本」:兼容现有实体体系
不用推翻重构!可直接与 EF Core、SqlSugar 等现有实体风格兼容,遗留系统改造时,既能复用旧实体,又能享受 mooSQL 的灵活与性能,平滑过渡无压力。
✨ mooSQL 核心亮点:不止是 SQL 构建器
表格
| 核心能力 | 解决痛点 |
|---|---|
| 三种查询模式 | SQLBuilder(灵活)+ SQLClip(类型安全)+ Repository(领域驱动),适配不同开发习惯 |
| 强扩展能力 | 扩展方法可集成权限过滤、业务规则等横切逻辑,流程引擎 / 低代码平台也能细粒度操控数据层 |
| 零迁移成本 | 兼容 EF Core/SqlSugar 实体,ADO.NET项目可平滑过渡 |
| 企业级特性 | 数据权限、UnitOfWork、慢 SQL 监控,满足中大型项目需求 |
🚀 快速上手:5 分钟跑通第一个查询
第一步:安装包(推荐扩展版,含多数据库方言)
bash
运行
dotnet add package mooSQL.Ext.Core
(核心纯净版:dotnet add package mooSQL.Pure.Core)
第二步:基础配置
csharp
运行
var builder = new DBClientBuilder();
var cache = new MooCache();
var dbCash = builder
.useCache(cache)
.useEnityAnalyser(new SugarEnitiyParser()) // 兼容SqlSugar实体
.doBuild();
// 配置数据库连接
dbCash.addConfig(yourConnectionConfigs);
第三步:三种查询模式示例
1. SQLBuilder:灵活语义化,贴近原生 SQL
csharp
运行
var kit = DBCash.useSQL(0);
// 复杂查询+分页+关联查询
var result = kit
.select("u.*, d.Name as DeptName")
.from("Users u")
.join("left join Department d on u.DeptId = d.Id")
.where("u.Status", 1)
.whereIn("u.Id", new[] {1,2,3})
.whereExist((sub) => {
sub.select("1").from("UserRoles ur").where("ur.UserId = u.Id");
})
.orderby("u.CreateTime desc")
.setPage(20, 1) // 分页:每页20条,第1页
.query<User>();
// 增删改示例
kit.setTable("Users")
.set("Name", "张三")
.set("Email", "zhangsan@example.com")
.doInsert();
2. SQLClip:类型安全,告别魔法字符串
csharp
运行
var clip = DBCash.useClip(0);
var data = clip
.from<Order>(out var o)
.join<OrderItem>(out var item)
.on(() => o.Id == item.OrderId)
.where(() => o.Status == OrderStatus.Paid)
.where(() => o.CreateTime >= DateTime.Now.AddDays(-7))
.select(() => new {
o.OrderNo,
o.TotalAmount,
item.Quantity
})
.queryList();
3. Repository:领域驱动,适配 DDD 场景
csharp
运行
var repo = DBCash.useRepo<User>(0);
// 简单查询
var activeUsers = repo.GetList(u => u.Status == UserStatus.Active);
// 分页查询
var pagedUsers = repo.GetPageList(1, 20, (c, u) => {
c.where(() => u.Status == UserStatus.Active)
.orderByDesc(() => u.CreateTime);
});
第四步:企业级能力示例(数据权限)
csharp
运行
// 扩展方法集成权限过滤
var kit = DBCash.useSQL(0);
kit.select("a.*")
.from("Orders a")
.where("a.Status", 1)
.useAuth((auth) => {
auth.useUserFK("a.UserId") // 过滤用户有权限的订单
.useOrgLike("a.OrgCode") // 按组织维度过滤
.useCustomRule(yourParam); // 自定义权限规则
})
.query();
🎯 谁该用 mooSQL?
- C# 开发者:想要类 SQL 语法的轻量化数据访问,拒绝 ORM 过度封装;
- 遗留系统改造:团队以 SQL 为主,想复用 EF Core/SqlSugar 实体;
- 高性能场景:需要简单查询极致性能,避免重 LINQ 翻译开销;
- 企业级项目:多数据库、主从架构、细粒度数据权限需求;
- DDD 实践者:需要 Repository + UnitOfWork 的领域驱动模式;
- 低代码 / 流程引擎开发:需要细粒度操控数据层,自定义扩展逻辑。
📎 项目地址
GitHub:github.com/sailuosi/mo…(主仓库)
文档:sailuosi.github.io/moosql-doc/
🙋 欢迎交流
如果在使用中遇到问题、有新功能建议,或者想一起完善这个项目,都可以在 GitHub 提 Issue/PR,也可以在评论区聊聊你在 C# 数据访问层踩过的坑~
mooSQL 的初衷,是让 C# 开发者既能享受原生 SQL 的掌控力,又不用重复造轮子解决权限、多库、事务等通用问题。觉得有用的话,别忘了给项目点个⭐️,你的支持是持续迭代的最大动力!