{"id":13431383,"url":"https://github.com/dotnetcore/SmartSql","last_synced_at":"2025-03-16T11:31:32.499Z","repository":{"id":34641091,"uuid":"86915105","full_name":"dotnetcore/SmartSql","owner":"dotnetcore","description":"SmartSql = MyBatis in C# + .NET Core+ Cache(Memory | Redis) + R/W Splitting + PropertyChangedTrack  +Dynamic Repository + InvokeSync + Diagnostics","archived":false,"fork":false,"pushed_at":"2024-12-25T00:18:03.000Z","size":5098,"stargazers_count":1105,"open_issues_count":42,"forks_count":222,"subscribers_count":79,"default_branch":"master","last_synced_at":"2024-12-30T21:15:52.539Z","etag":null,"topics":["cache","cross-platform","distributed-computing","dotnet","dotnet-core","dotnetcore","high-performance","mybatis","mysql","oracle","orm","postgresql","read-write-separation","redis","skywalking","smartsql","sql","sqlite","sqlserver","zookeeper"],"latest_commit_sha":null,"homepage":"https://smartsql.net/","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dotnetcore.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"code-of-conduct.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-04-01T13:26:07.000Z","updated_at":"2024-12-26T13:15:43.000Z","dependencies_parsed_at":"2023-01-15T08:15:20.974Z","dependency_job_id":"d43986a4-9567-46c7-adfc-cf5372e9a179","html_url":"https://github.com/dotnetcore/SmartSql","commit_stats":{"total_commits":818,"total_committers":15,"mean_commits":54.53333333333333,"dds":"0.23227383863080686","last_synced_commit":"c02736963d6a5facd96e3b56ea74cbd6dc69b444"},"previous_names":["smart-kit/smartsql","ahoo-wang/smartsql"],"tags_count":90,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dotnetcore%2FSmartSql","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dotnetcore%2FSmartSql/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dotnetcore%2FSmartSql/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dotnetcore%2FSmartSql/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dotnetcore","download_url":"https://codeload.github.com/dotnetcore/SmartSql/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243664333,"owners_count":20327464,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cache","cross-platform","distributed-computing","dotnet","dotnet-core","dotnetcore","high-performance","mybatis","mysql","oracle","orm","postgresql","read-write-separation","redis","skywalking","smartsql","sql","sqlite","sqlserver","zookeeper"],"created_at":"2024-07-31T02:01:02.682Z","updated_at":"2025-03-16T11:31:32.475Z","avatar_url":"https://github.com/dotnetcore.png","language":"C#","readme":"\n# SmartSql ([Document](https://smartsql.net/en/))\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://smartsql.net/en/\" target=\"_blank\"\u003e\n    \u003cimg width=\"100\"src=\"./SmartSql.png\"/\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n# Overview\n\n\u003e SmartSql = MyBatis + Cache(Memory | Redis) + R/W Splitting +Dynamic Repository + Diagnostics ......\n---\n\u003e Simple, efficient, high-performance, scalable, monitoring, progressive development!\n\n## How does she work?\n\nSmartSql draws on MyBatis's ideas, uses XML to manage SQL, and provides several filter tags to eliminate various if/else judgment branches at the code level. \nSmartSql will manage your SQL and filter the tags to maintain your various conditional judgments at the code level to make your code more beautiful.\n\n## Why Choose SmartSql?\n\nThe Orm,linq of the DotNet system, which is mostly Linq, is very good, eliminating the developer's reliance on SQL. But it ignores the fact that SQL itself is not complex, and that it is difficult for developers to write Linq to generate good performance SQL in complex query scenarios, and I believe that students who have used EF must have this experience: \"I think about how SQL writes, and then I write Linq, It's over. You may also want to see what SQL output of Linq is like. \" It was a very bad experience. To be absolutely optimized for SQL, developers must have absolute control over SQL. In addition, SQL itself is very simple, why add a layer of translators?\n\n\u003e SmartSql has been out of formal open source for more than two years, in the production environment after several micro-service verification.\n\u003e There are also some businesses that are using SmartSql (if you are also using SmartSql Welcome to submit issue)[Who is using SmartSql](https://github.com/dotnetcore/SmartSql/issues/13).\n\u003e Has now joined [NCC](https://github.com/dotnetcore)。\n\u003e The future ([Roadmap-2019](https://github.com/dotnetcore/SmartSql/issues/47))  SmartSql will continue to add new features to help developers improve efficiency. Welcome to submit Issue \u003chttps://github.com/dotnetcore/SmartSql/issues\u003e.\n\n## So why not Dapper, or DbHelper?\n\nDapper is really good and good performance, but the code that will be ceded to you is filled with SQL and various judgment branches that will make code maintenance difficult to read and maintain. In addition, Dapper only provides DataReader to Entity anti-serialization function. And SmartSql offers a number of features to improve developer efficiency.\n\n## Feature Overview\n\n![SmartSql](https://raw.githubusercontent.com/Smart-Kit/SmartSql-Docs/master/docs/imgs/SmartSql-features.png)\n\n## Dynamic Repository\n\nDynamic Agent Repository (SmartSql.DyRepository) components are SmartSql very unique features that simplify the use of SmartSql. There is little intrusion into the business code. It can be said that using ISqlMapper is the original method, and DyRepository automatically helps you implement these methods.\n\nDyRepository only need to define the Repository interface, through a simple configuration can automatically implement these interfaces and register in the IoC container, when used injection instant acquisition implementation. The principle is to obtain the Scope and SqlId in the XML file of SmartSql through the naming rules of the interface and interface method, use the parameters of the interface method as the Request, and automatically judge the query or perform the operation through the SQL in the XML, and finally realize the ISqlMapper Call.\n\n### 0. Define Repository interfaces\n\n``` csharp\n    public interface IUserRepository : IRepository\u003cUser, long\u003e\n    {\n    }\n```\n\n### 1. Injection dependencies\n\n``` csharp\n            services.AddSmartSql()\n                .AddRepositoryFromAssembly(options =\u003e { options.AssemblyString = \"SmartSql.Starter.Repository\"; });\n```\n\n### 2. Use\n\n``` csharp\n    public class UserService\n    {\n        IUserRepository userRepository;\n\n        public UserService(IUserRepository userRepository)\n        {\n            this.userRepository = userRepository;\n        }\n    }\n```\n\n## SmartSql Best practices -\u003e [SmartCode](https://github.com/dotnetcore/SmartCode)\n\n![SmartCode](https://raw.githubusercontent.com/Smart-Kit/SmartSql-Docs/master/docs/imgs/SmartCode.gif)\n\nBy [SmartCode](https://github.com/dotnetcore/SmartCode) Developers simply configure the database connection to build everything that is required for the solution, including, but not limited to:\n\n- Solution Engineering\n- Give you a restore.\n\n``` yml\n  ReStore:\n    Type: Process\n    Parameters: \n      FileName: powershell\n      WorkingDirectory: '{{Project.Output.Path}}'\n      Args: dotnet restore\n```\n\n- Docker\n  - Building Docker Mirroring \u0026 Running Instances\n\n``` yml\n BuildDocker:\n    Type: Process\n    Parameters:\n      FileName: powershell\n      WorkingDirectory: '{{Project.Output.Path}}'\n      Args: docker build -t {{Project.Parameters.DockerImage}}:v1.0.0 .\n\n  RunDocker:\n    Type: Process\n    Parameters:\n      FileName: powershell\n      WorkingDirectory: '{{Project.Output.Path}}'\n      Args: docker run --name {{Project.Parameters.DockerImage}} --rm -d -p 8008:80 {{Project.Parameters.DockerImage}}:v1.0.0 .\n```\n\n- Open a browser by the way\n\n``` yml\n  RunChrome:\n    Type: Process\n    Parameters:\n      FileName: C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe\n      CreateNoWindow: false\n      Args: http://localhost:8008/swagger\n```\n\n### Docker\n\n![SmartCode](https://raw.githubusercontent.com/Smart-Kit/SmartSql-Docs/master/docs/imgs/docker-0.png)\n![SmartCode](https://raw.githubusercontent.com/Smart-Kit/SmartSql-Docs/master/docs/imgs/docker-1.png)\n![SmartCode](https://raw.githubusercontent.com/Smart-Kit/SmartSql-Docs/master/docs/imgs/docker-2.png)\n![SmartCode](https://raw.githubusercontent.com/Smart-Kit/SmartSql-Docs/master/docs/imgs/docker-3.png)\n\n### Directory structure generated by SmartCode\n\n![SmartCode-directory-structure](https://raw.githubusercontent.com/Smart-Kit/SmartSql-Docs/master/docs/imgs/SmartCode-directory-structure.png)\n\n## Read and write separation\n\nSmartSql Read and write separation is especially easy, just provide a good configuration can be:\n\n``` xml\n  \u003cDatabase\u003e\n    \u003cDbProvider Name=\"PostgreSql\"/\u003e\n    \u003cWrite Name=\"WriteDB\" ConnectionString=\"${Master}\"/\u003e\n    \u003cRead Name=\"ReadDb-1\" ConnectionString=\"${Slave-0}\" Weight=\"100\"/\u003e\n    \u003cRead Name=\"ReadDb-2\" ConnectionString=\"${Slave-1}\" Weight=\"100\"/\u003e\n  \u003c/Database\u003e\n```\n\n## Cache\n\n- Lru Least recently used algorithms\n- Fifo Advanced first-out algorithm\n- RedisCacheProvider\n- Other inherited self-ICacheProvider cache types are available\n\n``` xml\n\u003cCaches\u003e\n    \u003cCache Id=\"LruCache\" Type=\"Lru\"\u003e\n      \u003cProperty Name=\"CacheSize\" Value=\"10\"/\u003e\n      \u003cFlushOnExecute Statement=\"AllPrimitive.Insert\"/\u003e\n      \u003cFlushInterval Hours=\"1\" Minutes=\"0\" Seconds=\"0\"/\u003e\n    \u003c/Cache\u003e\n    \u003cCache Id=\"FifoCache\" Type=\"Fifo\"\u003e\n      \u003cProperty Name=\"CacheSize\" Value=\"10\"/\u003e\n    \u003c/Cache\u003e\n    \u003cCache Id=\"RedisCache\" Type=\"${RedisCacheProvider}\"\u003e\n      \u003cProperty Name=\"ConnectionString\" Value=\"${Redis}\" /\u003e\n      \u003cFlushInterval Seconds=\"60\"/\u003e\n    \u003c/Cache\u003e\n  \u003c/Caches\u003e\n   \u003cStatement Id=\"QueryByLruCache\"  Cache=\"LruCache\"\u003e\n      SELECT Top 6 T.* From T_User T;\n    \u003c/Statement\u003e\n```\n\n## Type Handler\n\nThe SmartSql is implemented internally DotNet the main types of type handlers, and some types of compatible type conversion processors are provided, as well as more commonly used JsonTypeHanlder.\n\n``` xml\n    \u003cTypeHandler PropertyType=\"SmartSql.Test.Entities.UserInfo,SmartSql.Test\" Type=\"${JsonTypeHandler`}\"\u003e\n      \u003cProperties\u003e\n        \u003cProperty Name=\"DateFormat\" Value=\"yyyy-MM-dd mm:ss\"/\u003e\n        \u003cProperty Name=\"NamingStrategy\" Value=\"Camel\"/\u003e\n      \u003c/Properties\u003e\n    \u003c/TypeHandler\u003e\n```\n\n## CUD Code generation\n\nSmartSql also provides CUD extension functions to help developers generate good CUD-SQL for direct developer use without having to write any configuration.\n\n``` csharp\npublic static TEntity GetById\u003cTEntity, TPrimaryKey\u003e(this ISqlMapper);\npublic static TPrimaryKey Insert\u003cTEntity, TPrimaryKey\u003e(this ISqlMapper sqlMapper, TEntity entity);\npublic static int DyUpdate\u003cTEntity\u003e(this ISqlMapper sqlMapper, object entity);\npublic static int Update\u003cTEntity\u003e(this ISqlMapper sqlMapper, TEntity entity);\npublic static int DeleteById\u003cTEntity, TPrimaryKey\u003e(this ISqlMapper sqlMapper, TPrimaryKey id);\npublic static int DeleteMany\u003cTEntity, TPrimaryKey\u003e(this ISqlMapper sqlMapper, IEnumerable\u003cTPrimaryKey\u003e ids);\n```\n\n## Id Generator\n\n### SnowflakeId\n\n``` xml\n\u003cIdGenerators\u003e\n    \u003cIdGenerator Name=\"SnowflakeId\" Type=\"SnowflakeId\"\u003e\n      \u003cProperties\u003e\n        \u003cProperty Name=\"WorkerIdBits\" Value=\"10\"/\u003e\n        \u003cProperty Name=\"WorkerId\" Value=\"888\"/\u003e\n        \u003cProperty Name=\"Sequence\" Value=\"1\"/\u003e\n      \u003c/Properties\u003e\n    \u003c/IdGenerator\u003e\n\u003c/IdGenerators\u003e\n```\n\n``` xml\n    \u003cStatement Id=\"Insert\"\u003e\n      \u003cIdGenerator Name=\"SnowflakeId\" Id=\"Id\"/\u003e\n      INSERT INTO T_UseIdGenEntity\n      (\n      Id,\n      Name\n      )\n      VALUES\n      (\n      @Id,\n      @Name\n      );\n      Select @Id;\n    \u003c/Statement\u003e\n```\n\n``` csharp\nvar id = SqlMapper.ExecuteScalar\u003clong\u003e(new RequestContext\n            {\n                Scope = nameof(UseIdGenEntity),\n                SqlId = \"Insert\",\n                Request = new UseIdGenEntity()\n                {\n                    Name = \"SmartSql\"\n                }\n            });\n```\n\n### DbSequence\n\n``` xml\n\u003cIdGenerators\u003e\n    \u003cIdGenerator Name=\"DbSequence\" Type=\"DbSequence\"\u003e\n      \u003cProperties\u003e\n        \u003cProperty Name=\"Step\" Value=\"10\"/\u003e\n        \u003cProperty Name=\"SequenceSql\" Value=\"Select Next Value For IdSequence;\"/\u003e\n      \u003c/Properties\u003e\n    \u003c/IdGenerator\u003e\n\u003c/IdGenerators\u003e\n\n```\n\n``` xml\n    \u003cStatement Id=\"InsertByDbSequence\"\u003e\n      \u003cIdGenerator Name=\"DbSequence\" Id=\"Id\"/\u003e\n      INSERT INTO T_UseIdGenEntity\n      (\n      Id,\n      Name\n      )\n      VALUES\n      (\n      @Id,\n      @Name\n      );\n      Select @Id;\n    \u003c/Statement\u003e\n```\n\n``` csharp\n            var id = SqlMapper.ExecuteScalar\u003clong\u003e(new RequestContext\n            {\n                Scope = nameof(UseIdGenEntity),\n                SqlId = \"InsertByDbSequence\",\n                Request = new UseIdGenEntity()\n                {\n                    Name = \"SmartSql\"\n                }\n            });\n```\n\n## AOP Transaction\n\n``` csharp\n        [Transaction]\n        public virtual long AddWithTran(User user)\n        {\n            return _userRepository.Insert(user);\n        }\n```\n\n### Transaction nesting\n\n\u003e When a transaction is nested, the transaction attribute annotation of the child function is no longer turned on, and the transaction that calls the function by the parent is used instead\n\n``` csharp\n        [Transaction]\n        public virtual long AddWithTranWrap(User user)\n        {\n            return AddWithTran(user);\n        }\n```\n\n## BulkInsert\n\n``` csharp\nusing (var dbSession= SqlMapper.SessionStore.Open())\n            {\n                var data = SqlMapper.GetDataTable(new RequestContext\n                {\n                    Scope = nameof(AllPrimitive),\n                    SqlId = \"Query\",\n                    Request = new { Taken = 100 }\n                });\n                data.TableName = \"T_AllPrimitive\";\n                IBulkInsert bulkInsert = new BulkInsert(dbSession);\n                bulkInsert.Table = data;\n                bulkInsert.Insert();\n            }\n```\n\n## Skywalking Monitoring\n\nSmartSql currently supports Skywalking monitoring and is enabled by installing the [SkyAPM-dotnet](https://github.com/SkyAPM/SkyAPM-dotnet) agent. The following is a partial screenshot.\n\n### Monitoring execution commands\n\n![Query](https://raw.githubusercontent.com/Smart-Kit/SmartSql-Docs/master/docs/imgs/skyapm-0.png)\n\n### View whether the cache is cached and the number of records returned\n\n![Query-Detail](https://raw.githubusercontent.com/Smart-Kit/SmartSql-Docs/master/docs/imgs/skyapm-1.png)\n\n### View executed SQL statements\n\n![Query-Statement](https://raw.githubusercontent.com/Smart-Kit/SmartSql-Docs/master/docs/imgs/skyapm-2.png)\n\n### Transaction\n\n![Transaction](https://raw.githubusercontent.com/Smart-Kit/SmartSql-Docs/master/docs/imgs/skyapm-3.png)\n\n### Error\n\n![Error](https://raw.githubusercontent.com/Smart-Kit/SmartSql-Docs/master/docs/imgs/skyapm-error-0.png)\n\n### Exception stack Trace\n\n![Error-Detail](https://raw.githubusercontent.com/Smart-Kit/SmartSql-Docs/master/docs/imgs/skyapm-error-1.png)\n\n## Nuget Packages\n\n| Package | NuGet Stable |  Downloads |\n| ------- | -------- | ------- |\n| [SmartSql](https://www.nuget.org/packages/SmartSql/) | [![SmartSql](https://img.shields.io/nuget/v/SmartSql.svg)](https://www.nuget.org/packages/SmartSql/)  | [![SmartSql](https://img.shields.io/nuget/dt/SmartSql.svg)](https://www.nuget.org/packages/SmartSql/) |\n| [SmartSql.Schema](https://www.nuget.org/packages/SmartSql.Schema/) | [![SmartSql.Schema](https://img.shields.io/nuget/v/SmartSql.Schema.svg)](https://www.nuget.org/packages/SmartSql.Schema/)  | [![SmartSql.Schema](https://img.shields.io/nuget/dt/SmartSql.Schema.svg)](https://www.nuget.org/packages/SmartSql.Schema/) |\n| [SmartSql.TypeHandler](https://www.nuget.org/packages/SmartSql.TypeHandler/) | [![SmartSql.TypeHandler](https://img.shields.io/nuget/v/SmartSql.TypeHandler.svg)](https://www.nuget.org/packages/SmartSql.TypeHandler/)  | [![SmartSql.TypeHandler](https://img.shields.io/nuget/dt/SmartSql.TypeHandler.svg)](https://www.nuget.org/packages/SmartSql.TypeHandler/) |\n| [SmartSql.DyRepository](https://www.nuget.org/packages/SmartSql.DyRepository/) | [![SmartSql.DyRepository](https://img.shields.io/nuget/v/SmartSql.DyRepository.svg)](https://www.nuget.org/packages/SmartSql.DyRepository/)  | [![SmartSql.DyRepository](https://img.shields.io/nuget/dt/SmartSql.DyRepository.svg)](https://www.nuget.org/packages/SmartSql.DyRepository/) |\n| [SmartSql.DIExtension](https://www.nuget.org/packages/SmartSql.DIExtension/) | [![SmartSql.DIExtension](https://img.shields.io/nuget/v/SmartSql.DIExtension.svg)](https://www.nuget.org/packages/SmartSql.DIExtension/)  | [![SmartSql.DIExtension](https://img.shields.io/nuget/dt/SmartSql.DIExtension.svg)](https://www.nuget.org/packages/SmartSql.DIExtension/) |\n| [SmartSql.Cache.Redis](https://www.nuget.org/packages/SmartSql.Cache.Redis/) | [![SmartSql.Cache.Redis](https://img.shields.io/nuget/v/SmartSql.Cache.Redis.svg)](https://www.nuget.org/packages/SmartSql.Cache.Redis/)  | [![SmartSql.Cache.Redis](https://img.shields.io/nuget/dt/SmartSql.Cache.Redis.svg)](https://www.nuget.org/packages/SmartSql.Cache.Redis/) |\n| [SmartSql.ScriptTag](https://www.nuget.org/packages/SmartSql.ScriptTag/) | [![SmartSql.ScriptTag](https://img.shields.io/nuget/v/SmartSql.ScriptTag.svg)](https://www.nuget.org/packages/SmartSql.ScriptTag/)  | [![SmartSql.ScriptTag](https://img.shields.io/nuget/dt/SmartSql.ScriptTag.svg)](https://www.nuget.org/packages/SmartSql.ScriptTag/) |\n| [SmartSql.AOP](https://www.nuget.org/packages/SmartSql.AOP/) | [![SmartSql.AOP](https://img.shields.io/nuget/v/SmartSql.AOP.svg)](https://www.nuget.org/packages/SmartSql.AOP/)  | [![SmartSql.AOP](https://img.shields.io/nuget/dt/SmartSql.AOP.svg)](https://www.nuget.org/packages/SmartSql.AOP/) |\n| [SmartSql.Options](https://www.nuget.org/packages/SmartSql.Options/) | [![SmartSql.Options](https://img.shields.io/nuget/v/SmartSql.Options.svg)](https://www.nuget.org/packages/SmartSql.Options/)  | [![SmartSql.Options](https://img.shields.io/nuget/dt/SmartSql.Options.svg)](https://www.nuget.org/packages/SmartSql.Options/) |\n| [SmartSql.Bulk](https://www.nuget.org/packages/SmartSql.Bulk/) | [![SmartSql.Bulk](https://img.shields.io/nuget/v/SmartSql.Bulk.svg)](https://www.nuget.org/packages/SmartSql.Bulk/)  | [![SmartSql.Bulk](https://img.shields.io/nuget/dt/SmartSql.Bulk.svg)](https://www.nuget.org/packages/SmartSql.Bulk/) |\n| [SmartSql.Bulk.SqlServer](https://www.nuget.org/packages/SmartSql.Bulk.SqlServer/) | [![SmartSql.Bulk.SqlServer](https://img.shields.io/nuget/v/SmartSql.Bulk.SqlServer.svg)](https://www.nuget.org/packages/SmartSql.Bulk.SqlServer/)  | [![SmartSql.Bulk.SqlServer](https://img.shields.io/nuget/dt/SmartSql.Bulk.SqlServer.svg)](https://www.nuget.org/packages/SmartSql.Bulk.SqlServer/) |\n| [SmartSql.Bulk.MsSqlServer](https://www.nuget.org/packages/SmartSql.Bulk.MsSqlServer/) | [![SmartSql.Bulk.MsSqlServer](https://img.shields.io/nuget/v/SmartSql.Bulk.MsSqlServer.svg)](https://www.nuget.org/packages/SmartSql.Bulk.MsSqlServer/)  | [![SmartSql.Bulk.MsSqlServer](https://img.shields.io/nuget/dt/SmartSql.Bulk.MsSqlServer.svg)](https://www.nuget.org/packages/SmartSql.Bulk.MsSqlServer/) |\n| [SmartSql.Bulk.PostgreSql](https://www.nuget.org/packages/SmartSql.Bulk.PostgreSql/) | [![SmartSql.Bulk.PostgreSql](https://img.shields.io/nuget/v/SmartSql.Bulk.PostgreSql.svg)](https://www.nuget.org/packages/SmartSql.Bulk.PostgreSql/)  | [![SmartSql.Bulk.PostgreSql](https://img.shields.io/nuget/dt/SmartSql.Bulk.PostgreSql.svg)](https://www.nuget.org/packages/SmartSql.Bulk.PostgreSql/)\n| [SmartSql.Bulk.MySql](https://www.nuget.org/packages/SmartSql.Bulk.MySql/) | [![SmartSql.Bulk.MySql](https://img.shields.io/nuget/v/SmartSql.Bulk.MySql.svg)](https://www.nuget.org/packages/SmartSql.Bulk.MySql/)  | [![SmartSql.Bulk.MySql](https://img.shields.io/nuget/dt/SmartSql.Bulk.MySql.svg)](https://www.nuget.org/packages/SmartSql.Bulk.MySql/) |\n| [SmartSql.Bulk.MySqlConnector](https://www.nuget.org/packages/SmartSql.Bulk.MySqlConnector/) | [![SmartSql.Bulk.MySqlConnector](https://img.shields.io/nuget/v/SmartSql.Bulk.MySqlConnector.svg)](https://www.nuget.org/packages/SmartSql.Bulk.MySqlConnector/)  | [![SmartSql.Bulk.MySqlConnector](https://img.shields.io/nuget/dt/SmartSql.Bulk.MySqlConnector.svg)](https://www.nuget.org/packages/SmartSql.Bulk.MySqlConnector/) |\n| [SmartSql.InvokeSync](https://www.nuget.org/packages/SmartSql.InvokeSync/) | [![SmartSql.InvokeSync](https://img.shields.io/nuget/v/SmartSql.InvokeSync.svg)](https://www.nuget.org/packages/SmartSql.InvokeSync/)  | [![SmartSql.InvokeSync](https://img.shields.io/nuget/dt/SmartSql.InvokeSync.svg)](https://www.nuget.org/packages/SmartSql.InvokeSync/) |\n| [SmartSql.InvokeSync.Kafka](https://www.nuget.org/packages/SmartSql.InvokeSync.Kafka/) | [![SmartSql.InvokeSync.Kafka](https://img.shields.io/nuget/v/SmartSql.InvokeSync.Kafka.svg)](https://www.nuget.org/packages/SmartSql.InvokeSync.Kafka/)  | [![SmartSql.InvokeSync.Kafka](https://img.shields.io/nuget/dt/SmartSql.InvokeSync.Kafka.svg)](https://www.nuget.org/packages/SmartSql.InvokeSync.Kafka/) |\n| [SmartSql.InvokeSync.RabbitMQ](https://www.nuget.org/packages/SmartSql.InvokeSync.RabbitMQ/) | [![SmartSql.InvokeSync.RabbitMQ](https://img.shields.io/nuget/v/SmartSql.InvokeSync.RabbitMQ.svg)](https://www.nuget.org/packages/SmartSql.InvokeSync.RabbitMQ/)  | [![SmartSql.InvokeSync.RabbitMQ](https://img.shields.io/nuget/dt/SmartSql.InvokeSync.RabbitMQ.svg)](https://www.nuget.org/packages/SmartSql.InvokeSync.RabbitMQ/) |\n\n## Demo\n\n\u003e[SmartSql.Sample.AspNetCore](https://github.com/dotnetcore/SmartSql/tree/master/sample/SmartSql.Sample.AspNetCore)\n\n## QQGroup\n\nClick on the link to join the QQ group [SmartSql official QQ group]:[604762592](https://jq.qq.com/?_wv=1027\u0026k=5Sy8Ahw)","funding_links":[],"categories":["Frameworks, Libraries and Tools","C# #","C\\#","C#","ORM"],"sub_categories":["ORM"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdotnetcore%2FSmartSql","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdotnetcore%2FSmartSql","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdotnetcore%2FSmartSql/lists"}