# SqlRepoEx **Repository Path**: azthinker/SqlRepoEx ## Basic Information - **Project Name**: SqlRepoEx - **Description**: SqlRepoEx是 .Net平台下兼容.NET Standard 2.0人一个轻型的ORM。解决了Lambda转Sql语句这一难题,SqlRepoEx使用的是Lambda表达式,所以,对c#程序员来说,是非常简单的,其语法特点与Linq to Sql极为相似。不仅实现了完整的Select、Insert、Update、Delete等语句解析器,同时,也实现了Select、where、order by等子句,这些语句与子句均支持导出SQL语句,使得拼接复杂场景SQL语句变得轻松,SqlRepoEx很快其原生数据访问与Dapper不相上下,SqlRepoEx本身支持Sql Server与MySql方言,同时通过SqlRepoEx.Normal支持非方言SQL。SqlRepoEx没侵入性,仅通过简单的几个特性,就能让类与数据库关联起来; - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 22 - **Forks**: 5 - **Created**: 2018-09-19 - **Last Updated**: 2024-12-04 ## Categories & Tags **Categories**: database-dev **Tags**: None ## README 1、SqlRepoEx是一个轻型的ORM。最大的一个核心库SqlRepoEx.Core.dll仅不到160K,静态库SqlRepoEx.MsSql.Static.dll仅7K。 2、SqlRepoEx解决了Lambda转Sql语句这一难题,我们不再使用字符串来拼接SQL语句,这个一个无聊且易出错的工作; 3、SqlRepoEx不仅实现了完整的Select、Insert、Update、Delete等语句解析器,同时,也实现了Select、where、order by等子句,这些语句与子句均支持导出SQL语句,使得拼接复杂场景SQL语句变得轻松; 4、SqlRepoEx同时提供了IExecuteSqlStatement及其实现类,通过WithSql方法附加你想要的SQL语句,并通过Go()获得想要的结果,就像其他语句解析器中的Go()一样; 5、SqlRepoEx解决了在Sql Server与MySql等常见数据库的方言访问,让我们在Sql Server与MySql之间迁移变得非常轻松,你根本不需要关心使用的是什么数据库,只需要简单两句代码,应用就会如期运行; 6、SqlRepoEx很快。SqlRepoEx原生数据访问与Dapper不相上下,并且,SqlRepoEx能与Dapper最佳融合,可轻易使用Dapper强大功能; 7、SqlRepoEx本身支持Sql Server与MySql方言,同时通过SqlRepoEx.Normal支持非方言SQL,接合其他数据访问库,如Dappers,能访问大多数据库, 8、实际上,SqlRepoEx通过解析Lambda并转换成SQL语句,你可以使用任何能使用SQL的ORM工具来访问你想要的数据。 9,SqlRepoEx支持多常见的种复杂的SQL语法,如Union,Join等,同时,通过简单的join on语句,可以表达更复杂的类型结果 10、SqlRepoEx没侵入性,仅通过简单的几个特性,就能让类与数据库关联起来,没有复杂的XML配置,也不需要josn配置,如果SqlRepoEx用到了配置文件,那就是配置在配置文件中的数据库连接字串,当然,你可以直接在代码中指定,这取决于你使用的是哪个数据提供者。 11、SqlRepoEx是Lambda,所以,对c#程序员来说,是非常简单的,其语法特点与Linq to Sql极为相似,但又不依赖于数据上下文,因而无须迁就数据库的设计。 12、SqlRepoEx 大多数类型均是可重写的,可扩展性强(SqlRepoEx.Adapter.Dapper就是一个简单但强大的扩展)。 NuGet library that you can add in to your project
[SqlRepoEx.Adapter.Dapper](https://www.nuget.org/packages/SqlRepoEx.Adapter.Dapper/)
[SqlRepoEx.MsSql.Static](https://www.nuget.org/packages/SqlRepoEx.MsSql.Static/)
[SqlRepoEx.MsSql.Autofac](https://www.nuget.org/packages/SqlRepoEx.MsSql.Autofac/)
[SqlRepoEx.MsSql.ServiceCollection](https://www.nuget.org/packages/SqlRepoEx.MsSql.ServiceCollection/)
[SqlRepoEx.MySql.Static](https://www.nuget.org/packages/SqlRepoEx.MySql.Static/)
[SqlRepoEx.MySql.ServiceCollection](https://www.nuget.org/packages/SqlRepoEx.MySql.ServiceCollection/)
[SqlRepoEx.MySql.Autofac](https://www.nuget.org/packages/SqlRepoEx.MySql.Autofac/)
# 本项目是在 SqlRepo 之上进行的二次开发 ## 主要解决:
1、解决拼接语句,使用where以外方法时,缺少Where子句时的错误;
2、解决多条件拼接Where;
3、增加操作时,不再受限于实例必需有Id的自增自段
## Example ``` c# IRepository repository = repositoryFactory.Create(); var results = repository.Query() .Select(e => e.Id, e => e.Task, e => e.CreatedDate); results = results.Where(e => e.IsCompleted == false); results = results.Where(e => e.Id == 3); ``` 未改之前 ``` sql SELECT [dbo].[ToDo].[Id] , [dbo].[ToDo].[Task] , [dbo].[ToDo].[CreatedDate] FROM [dbo].[ToDo] WHERE ([dbo].[ToDo].[IsCompleted] = 0) WHERE ([dbo].[ToDo].[Id] = 3); ``` 更改后 ``` sql SELECT [dbo].[ToDo].[Id] , [dbo].[ToDo].[Task] , [dbo].[ToDo].[CreatedDate] FROM [dbo].[ToDo] WHERE ([dbo].[ToDo].[IsCompleted] = 0) And ([dbo].[ToDo].[Id] = 3); ``` 指定非自增字段 ``` C# var repository = this.repositoryFactory.Create(); DoitTest doitTest = new DoitTest(); doitTest.TestRmk = "测试"; doitTest.TestBool = true; doitTest.TestId = 123; Console.WriteLine(repository.Insert().UsingIdField(d => d.TestId, false).For(doitTest).Sql()); ``` 生成的SQL ``` SQL INSERT [dbo].[DoitTest]([TestId], [TestRmk], [TestBool]) VALUES(123, '测试', 1); ``` 指定非自增字段 ``` C# var repository = this.repositoryFactory.Create(); DoitTest doitTest = new DoitTest(); doitTest.TestRmk = "测试"; doitTest.TestBool = true; doitTest.TestId = 123; Console.WriteLine(repository.Insert().UsingIdField(d => d.TestId).For(doitTest).Sql()); ``` 生成的SQL ``` SQL INSERT [dbo].[DoitTest]([TestRmk], [TestBool]) VALUES('测试', 1); SELECT * FROM [dbo].[DoitTest] WHERE [TestId] = SCOPE_IDENTITY(); ``` 原项目中的例子: ```csharp public class GettingStarted { private IRepositoryFactory repositoryFactory; public GettingStarted(IRepositoryFactory repositoryFactory) { this.repositoryFactory = repositoryFactory; } public void DoIt() { var repository = this.repositoryFactory.Create(); var results = repository.Query() .Select(e => e.Id, e => e.Task, e => e.CreatedDate) .Where(e => e.IsCompleted == false) .Go(); } } ``` Generates the following SQL statement and maps the results back to the list of ToDo objects. ```sql SELECT [dbo].[ToDo].[Id], [dbo].[ToDo].[Task], [dbo].[ToDo].[CreatedDate] FROM [dbo].[ToDo] WHERE [dbo].[ToDo].[IsCompleted] = 0; ``` 2018-9-25增加分页操作
```csharp var repository = RepoFactory.Create(); var results = repository.Query() .Select(e => e.Id, e => e.Task, e => e.CreatedDate) .OrderBy(e => e.Id) .Page(10, 3) .Go(); ``` 2018-9-25增加存储OUTPUT参数返回