[
  {
    "path": ".gitattributes",
    "content": ""
  },
  {
    "path": ".gitignore",
    "content": "﻿#\r\n#ignore thumbnails created by windows\r\nThumbs.db\r\n#Ignore files build by Visual Studio\r\n*.obj\r\n*.exe\r\n*.pdb\r\n*.user\r\n*.aps\r\n*.pch\r\n*.vspscc\r\n*_i.c\r\n*_p.c\r\n*.ncb\r\n*.suo\r\n*.tlb\r\n*.tlh\r\n*.bak\r\n*.cache\r\n*.ilk\r\n*.log\r\n[Bb]in\r\n[Dd]ebug*/\r\n*.sbr\r\nobj/\r\n\r\n[Rr]elease*/\r\n_ReSharper*/\r\n[Tt]est[Rr]esult*\r\npackages\r\n\r\n \r\nlog.txt\r\n/.vs\r\n/src/core/Overt.Core.DataConsole/appsettings.txt\r\n/src/net46/Overt.Core.DataConsole/App.txt\r\n"
  },
  {
    "path": "README.md",
    "content": "如有疑问可直接加QQ：2292709323，微信：yaofengv，联系\n\n# Overt.Core.Data\n\n### 项目层次说明\n\n> Overt.Core.Data v2.2.3 \n> 基于dapper封装的expression om，让CURD更简单\n\n#### 1. 项目目录\n\n```\n|-Attrubute                     特性\n|  |-SubmeterAttrubute.cs       分表标识特性 (已废弃)\n|\n|-Contract                      契约层\n|  |-IPropertyAssist.cs         统一的接口定义文件，所有的数据层接口均继承\n|  |-IBaseRepository<T>.cs      基础接口类，包含增删改查，以及继承IDbRepository\n|\n|-DataContext                   数据库连接层\n|  |-DataContext.cs             数据库连接工厂类\n|  |-DataContextConfig.cs       数据库配置信息获取类\n|\n|-Enums                         枚举\n|  |-DatabaseType.cs            数据库类型\n|  |-FieldSortType.cs           Asc / Desc\n|\n|-Expressions                   表达式解析器（略）\n|\n|-Extensions                    Dapper扩展\n|  |-Dapper.Extension.cs        扩展类\n|\n|-Params                        参数实体\n|  |-OrderByField.cs            排序类\n|\n|-Repositry                     契约实现层\n|  |-PropertyAssist.cs          抽象类，继承IPropertyAssist，virtual \n|  |-BaseRepository<T>.cs       抽象类，实现 IBaseRepository<T>，virtual\n```\n\n\n#### 2. 版本及支持\n\n> * Nuget版本：V2.2.3\n> * 框架支持： Framework4.6.1 - NetStandard 2.0\n> * 数据库支持：MySql / SqlServer / SQLite [使用详见下文]\n\n\n#### 3. 项目依赖\n\n> * Framework 4.6.1\n\n```\nDapper 2.0.35  \nMySql.Data 8.0.20\nSystem.Data.SqlClient 4.8.1\nSystem.Data.SQLite 1.0.113.1\nSystem.ComponentModel.DataAnnotations 4.7.0\n```\n\n> * NetStandard 2.0\n\n```\nDapper 2.0.35  \nMicrosoft.Data.Sqlite 3.1.5\nMySql.Data 8.0.20\nSystem.Data.SqlClient 4.8.1\nSystem.ComponentModel.DataAnnotations 4.7.0\nMicrosoft.Extensions.Configuration 2.0.0\n\n```\n\n\n### 使用\n\n#### 1. 配置信息\n\n> * 支持 IConfiguration 对象注入\n> * 支持默认配置文件appsettings.json\n> * 支持环境变量，或者使用外部的第三方配置中心（appolo），最终还是依赖于微软自身Configuration\n> * Core(DbType=MySql|SqlServer|SQLite): \n\n```\n[mysql]: DataSource=127.0.0.1;Database=TestDb;uid=root;pwd=123456;Allow Zero Datetime=True;DbType=MySql\n[sqlserver]: Data Source=127.0.0.1;Initial Catalog=TestDb;Persist Security Info=True;User ID=sa;Password=123456;DbType=SqlServer  \n[sqlite]: Data Source=testdb.db;DbType=SQLite; // 默认使用App_Data目录\n```\n\n> * Framework: 正常的连接字符串，使用ProviderName来区分数据库类型\n\n\n#### 2. Nuget包引用\n\n```\nInstall-Package Overt.Core.Data -Version 2.2.3\n```\n\n\n#### 3. 约定\n\n> * 服务层契约需继承IBaseRepository<>\n> * 服务层契约实现实现自定义契约，并继承BaseRepository<T>\n> * 外部执行Sql使用 BaseRepository 中 Execute 方法 内部管理连接\n\n```\nreturn await Execute(async (connection) =>\n{\n    // 执行方法\n}, true);\n```\n\n#### 4. 分表实现\n\n```\nIBaseRepository的实现\n\n// 自定义重写TableNameFunc\n// 使用GetTableName()可获取到实际的表名\n// 内置方法均从上述方法中获取表名，默认表名为实体定义的[Table(\"主表名\")]\npublic override Func<string> TableNameFunc => () =>\n{\n    var tableName = $\"{GetMainTableName()}_{DateTime.Now.ToString(\"yyyyMMdd\")}\";\n    return tableName;\n};\n        \n// 重写创建表的脚本，可在调用过程中，自动创建表，一般用于动态分表\npublic override Func<string, string> CreateScriptFunc => (tableName) =>\n{\n    return \"创建表的Sql脚本\"; // 将在增删改操作中执行，查询操作中，表不存在则直接返回空数据  \n}        \n```\n\n#### 5. 分库实现\n\n> * 连接字符串配置中以key - value 模式定义，key使用默认的读写分离关键字【master / secondary】表示写入连接字符串和读取连接字符串\n> * 前缀添加 xxx.即可简单定义不同数据库，代码中，对于IBaseRepository的实现，在构造函数中直接常量定义 xxx，如下所示\n```\nusing Overt.Core.Data;\nusing Overt.User.Domain.Contracts;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing Dapper;\nusing System.Linq;\nusing Microsoft.Extensions.Configuration;\n\nnamespace Overt.User.Domain.Repositories\n{\n    public class UserRepository : BaseRepository<UserEntity>, IUserRepository\n    {\n        public UserRepository(IConfiguration configuration) \n            : base(configuration, \"xxx\") // dbStoreKey 可用于不同数据库切换，连接字符串key前缀：xxx.master xxx.secondary\n        {\n        }\n    }\n}\n\n```\n\n\n#### 6. 事务实现\n\n> * Framework: 使用TransactionScope\n> * DotNetCore: 使用TransactionScope\n\n```\n// Service层\npublic async Task<bool> ExecuteInTransactionAsync()\n{\n    // 分布式事务\n    // 异步中需要增加该参数：TransactionScopeAsyncFlowOption.Enabled\n    using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))\n    {\n        var result = false;\n        try\n        {\n            result = await _userRepository.AddAsync(new UserEntity());\n            result &= await _subUserRepository.AddAsync(new SubUserEntity());\n\n            scope.Complete();\n            return result;\n        }\n        catch\n        {\n            // logger\n        }\n        return false;\n    }\n}\n```\n\n#### 7. Lambda表达式支持\n\n> * ==\n> * !\n> * !=\n> * null\n> * In\n> * Equals\n> * Contains\n> * !Contains\n> * StartWith\n> * EndWith\n> * &&\n> * ||\n> * &\n> * |\n\n\n##### 不支持案例\n~~var list = _repository.GetList(1, 1, oo=>\"test\".Contains(oo.UserName));~~  \n~~var list = _repository.GetList(1, 1, oo=>oo.UserName.IndexOf(\"abc\") > -1);~~\n\n\n#### 8. 案例使用\n\n* 添加记录\n```\n// 单条记录插入\n_repository.Add(obj);\n\n// 多条记录批量插入，建议不要超过500条\n_repository.Add(obj0, obj1, ...);\n```\n\n* 修改记录\n```\n// 修改整份数据\n_repository.Set(obj);\n\n// 修改部分字段（基于字典对象）\nvar setDic = new Dictionary<string, object>()\n{\n    { \"UserName\", \"1\" }\n};\n_repository.Set(() => setDic, oo => oo.UserId == 1);\n\n// 修改部分字段（基于匿名对象）\nvar setObj = new \n{\n    UserName = \"1\"\n};\n_repository.Set(() => setObj, oo => oo.UserId == 1);\n\n// 修改值类型字段进行增减，比如数量的增减，年龄的增减等\n_repository.Incr(\"Age\", 1, oo => oo.UserId == 1);\n```\n\n* 删除记录\n```\n_repository.Delete(oo => oo.UserId == 1);\n```\n\n* 单记录查询\n```\nvar entity = _repository.Get(oo => oo.UserId == 1);\n```\n\n* 列表记录查询\n```\nvar ary = new string[]{ \"1\", \"2\" };\nvar list = _repository.GetList(1, 1, oo=>ary.Contains(oo.UserId));\n\nvar ary = new List<string>(){ \"1\", \"2\" };\nvar list = _repository.GetList(1, 1, oo=>ary.Contains(oo.UserId));\n\nvar key = \"abc\";\nvar list = _repository.GetList(1, 1, oo=>oo.UserName.Contains(key));\n\nvar list = _repository.GetList(1, 1, oo=>oo.UserName.Equals(key));\n\nvar list = _repository.GetList(1, 1, oo=>oo.UserName.Contains(\"abc\"));\n\nvar list = _repository.GetList(1, 1, oo=>oo.UserName.StartWith(\"abc\"));\n\nvar list = _repository.GetList(1, 1, oo=>oo.UserName.EndWith(\"abc\"));\n\nvar list = _repository.GetList(1, 1, oo=>ary.Contains(oo.UserId) && !IsSex);\n\nvar list = _repository.GetList(1, 1, oo=>oo.UserName != null);\n\nvar list = _repository.GetList(1, 1, oo=>oo.UserName == null);\n```\n\n\n#### 9. 更新说明\n\n- 2023-02-23 v2.2.3\n\n> 1. Insert 支持long自增\n\n\n\n- 2022-11-22 v2.2.2\n\n> 1. GetMainTableName开放使用\n\n\n\n- 2022-09-29 v2.2.1\n\n> 1. 增加支持& |\n\n\n\n- 2021-12-29 v2.2.0\n\n> 1. 支持PG数据库 感谢 @liuzhenbao0505\n> 2. 修正 StartWith EndWith 的拼接错误 @Zhang-Pengyuan\n\n\n\n- 2021-03-26 v2.1.4\n\n> 1. 将基础方法Execute变更为virtual，可允许重写\n\n\n\n- 2021-02-24 v2.1.3\n\n> 1. 基础方法增加根据某个字段增减数据的方法：IncrAsync(string field, TValue value, Expression<Func<TEntity, bool>> whereExpress)\n\n\n\n- 2021-01-14 v2.0.1\n\n> 1. 修复多数据库情况下并发查询切换数据库导致连接字符串混乱的问题\n> 2. Repository层回执SQL脚本的位置调整，防止数据库执行异常无法获知实际的SQL脚本\n\n\n\n- 2020-06-30 v2.0.0\n\n> 1. 升级底层依赖的驱动：Dapper、SqlClient、MySql、SQLite\n> 2. 去除原有老版本中使用的Transaction属性，全部统一使用TransactionScope实现事务业务。PS：DotNetCore中的事务只支持单服务器数据，Framework支持分布式数据库！！！\n> 3. 如需兼容老版本的的代码，请使用v1.x.x版本的驱动或者代码\n\n\n---\n"
  },
  {
    "path": "core-data.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 15\nVisualStudioVersion = 15.0.27130.2027\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Overt.Core.Data\", \"src\\Overt.Core.Data\\Overt.Core.Data.csproj\", \"{8B1B556F-1D2C-49D2-8CB9-F9D2C7080786}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"core\", \"core\", \"{9DD521BB-DEE6-40A1-B042-EA89EB889546}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"net462\", \"net462\", \"{B159908C-321A-45AF-998B-C431D7D02070}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Overt.User.Domain\", \"src\\net46\\Overt.User.Domain\\Overt.User.Domain.csproj\", \"{F34F6B13-B939-47A3-827E-E7015FD1B434}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Overt.Core.DataConsole\", \"src\\core\\Overt.Core.DataConsole\\Overt.Core.DataConsole.csproj\", \"{D2349F1D-B2AB-40EE-980F-0F0AB8E3F970}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Overt.User.Application\", \"src\\core\\Overt.User.Application\\Overt.User.Application.csproj\", \"{5D9B9D31-33CA-4378-AA58-D788C7EBD4CF}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Overt.User.Domain\", \"src\\core\\Overt.User.Domain\\Overt.User.Domain.csproj\", \"{0558E8F8-BB9E-4C62-A8D0-03011ED77284}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Overt.User.Application\", \"src\\net46\\Overt.User.Application\\Overt.User.Application.csproj\", \"{5ADB2A33-42E4-484B-997E-3F8B942539E4}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Overt.Core.DataConsole\", \"src\\net46\\Overt.Core.DataConsole\\Overt.Core.DataConsole.csproj\", \"{F92F116B-A438-447B-9475-4D62AF197742}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tRelease|Any CPU = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{8B1B556F-1D2C-49D2-8CB9-F9D2C7080786}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{8B1B556F-1D2C-49D2-8CB9-F9D2C7080786}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{8B1B556F-1D2C-49D2-8CB9-F9D2C7080786}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{8B1B556F-1D2C-49D2-8CB9-F9D2C7080786}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{F34F6B13-B939-47A3-827E-E7015FD1B434}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F34F6B13-B939-47A3-827E-E7015FD1B434}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F34F6B13-B939-47A3-827E-E7015FD1B434}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F34F6B13-B939-47A3-827E-E7015FD1B434}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{D2349F1D-B2AB-40EE-980F-0F0AB8E3F970}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{D2349F1D-B2AB-40EE-980F-0F0AB8E3F970}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{D2349F1D-B2AB-40EE-980F-0F0AB8E3F970}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{D2349F1D-B2AB-40EE-980F-0F0AB8E3F970}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{5D9B9D31-33CA-4378-AA58-D788C7EBD4CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{5D9B9D31-33CA-4378-AA58-D788C7EBD4CF}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{5D9B9D31-33CA-4378-AA58-D788C7EBD4CF}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{5D9B9D31-33CA-4378-AA58-D788C7EBD4CF}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{0558E8F8-BB9E-4C62-A8D0-03011ED77284}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{0558E8F8-BB9E-4C62-A8D0-03011ED77284}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{0558E8F8-BB9E-4C62-A8D0-03011ED77284}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{0558E8F8-BB9E-4C62-A8D0-03011ED77284}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{5ADB2A33-42E4-484B-997E-3F8B942539E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{5ADB2A33-42E4-484B-997E-3F8B942539E4}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{5ADB2A33-42E4-484B-997E-3F8B942539E4}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{5ADB2A33-42E4-484B-997E-3F8B942539E4}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{F92F116B-A438-447B-9475-4D62AF197742}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{F92F116B-A438-447B-9475-4D62AF197742}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{F92F116B-A438-447B-9475-4D62AF197742}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{F92F116B-A438-447B-9475-4D62AF197742}.Release|Any CPU.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{F34F6B13-B939-47A3-827E-E7015FD1B434} = {B159908C-321A-45AF-998B-C431D7D02070}\n\t\t{D2349F1D-B2AB-40EE-980F-0F0AB8E3F970} = {9DD521BB-DEE6-40A1-B042-EA89EB889546}\n\t\t{5D9B9D31-33CA-4378-AA58-D788C7EBD4CF} = {9DD521BB-DEE6-40A1-B042-EA89EB889546}\n\t\t{0558E8F8-BB9E-4C62-A8D0-03011ED77284} = {9DD521BB-DEE6-40A1-B042-EA89EB889546}\n\t\t{5ADB2A33-42E4-484B-997E-3F8B942539E4} = {B159908C-321A-45AF-998B-C431D7D02070}\n\t\t{F92F116B-A438-447B-9475-4D62AF197742} = {B159908C-321A-45AF-998B-C431D7D02070}\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {63C9732F-DFAB-438C-B2F2-7C0399EF8701}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "src/.vs/config/applicationhost.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!--\n\n    IIS configuration sections.\n\n    For schema documentation, see\n    %IIS_BIN%\\config\\schema\\IIS_schema.xml.\n    \n    Please make a backup of this file before making any changes to it.\n\n    NOTE: The following environment variables are available to be used\n          within this file and are understood by the IIS Express.\n\n          %IIS_USER_HOME% - The IIS Express home directory for the user\n          %IIS_SITES_HOME% - The default home directory for sites\n          %IIS_BIN% - The location of the IIS Express binaries\n          %SYSTEMDRIVE% - The drive letter of %IIS_BIN%\n\n-->\n<configuration>\n  <!--\n\n        The <configSections> section controls the registration of sections.\n        Section is the basic unit of deployment, locking, searching and\n        containment for configuration settings.\n        \n        Every section belongs to one section group.\n        A section group is a container of logically-related sections.\n        \n        Sections cannot be nested.\n        Section groups may be nested.\n        \n        <section\n            name=\"\"  [Required, Collection Key] [XML name of the section]\n            allowDefinition=\"Everywhere\" [MachineOnly|MachineToApplication|AppHostOnly|Everywhere] [Level where it can be set]\n            overrideModeDefault=\"Allow\"  [Allow|Deny] [Default delegation mode]\n            allowLocation=\"true\"  [true|false] [Allowed in location tags]\n        />\n        \n        The recommended way to unlock sections is by using a location tag:\n        <location path=\"Default Web Site\" overrideMode=\"Allow\">\n            <system.webServer>\n                <asp />\n            </system.webServer>\n        </location>\n\n    -->\n  <configSections>\n    <sectionGroup name=\"system.applicationHost\">\n      <section name=\"applicationPools\" allowDefinition=\"AppHostOnly\" overrideModeDefault=\"Deny\" />\n      <section name=\"configHistory\" allowDefinition=\"AppHostOnly\" overrideModeDefault=\"Deny\" />\n      <section name=\"customMetadata\" allowDefinition=\"AppHostOnly\" overrideModeDefault=\"Deny\" />\n      <section name=\"listenerAdapters\" allowDefinition=\"AppHostOnly\" overrideModeDefault=\"Deny\" />\n      <section name=\"log\" allowDefinition=\"AppHostOnly\" overrideModeDefault=\"Deny\" />\n      <section name=\"serviceAutoStartProviders\" allowDefinition=\"AppHostOnly\" overrideModeDefault=\"Deny\" />\n      <section name=\"sites\" allowDefinition=\"AppHostOnly\" overrideModeDefault=\"Deny\" />\n      <section name=\"webLimits\" allowDefinition=\"AppHostOnly\" overrideModeDefault=\"Deny\" />\n    </sectionGroup>\n    <sectionGroup name=\"system.webServer\">\n      <section name=\"asp\" overrideModeDefault=\"Deny\" />\n      <section name=\"caching\" overrideModeDefault=\"Allow\" />\n      <section name=\"cgi\" overrideModeDefault=\"Deny\" />\n      <section name=\"defaultDocument\" overrideModeDefault=\"Allow\" />\n      <section name=\"directoryBrowse\" overrideModeDefault=\"Allow\" />\n      <section name=\"fastCgi\" allowDefinition=\"AppHostOnly\" overrideModeDefault=\"Deny\" />\n      <section name=\"globalModules\" allowDefinition=\"AppHostOnly\" overrideModeDefault=\"Deny\" />\n      <section name=\"handlers\" overrideModeDefault=\"Deny\" />\n      <section name=\"httpCompression\" overrideModeDefault=\"Allow\" />\n      <section name=\"httpErrors\" overrideModeDefault=\"Allow\" />\n      <section name=\"httpLogging\" overrideModeDefault=\"Deny\" />\n      <section name=\"httpProtocol\" overrideModeDefault=\"Allow\" />\n      <section name=\"httpRedirect\" overrideModeDefault=\"Allow\" />\n      <section name=\"httpTracing\" overrideModeDefault=\"Deny\" />\n      <section name=\"isapiFilters\" allowDefinition=\"MachineToApplication\" overrideModeDefault=\"Deny\" />\n      <section name=\"modules\" allowDefinition=\"MachineToApplication\" overrideModeDefault=\"Deny\" />\n      <section name=\"applicationInitialization\" allowDefinition=\"MachineToApplication\" overrideModeDefault=\"Allow\" />\n      <section name=\"odbcLogging\" overrideModeDefault=\"Deny\" />\n      <sectionGroup name=\"security\">\n        <section name=\"access\" overrideModeDefault=\"Deny\" />\n        <section name=\"applicationDependencies\" overrideModeDefault=\"Deny\" />\n        <sectionGroup name=\"authentication\">\n          <section name=\"anonymousAuthentication\" overrideModeDefault=\"Deny\" />\n          <section name=\"basicAuthentication\" overrideModeDefault=\"Deny\" />\n          <section name=\"clientCertificateMappingAuthentication\" overrideModeDefault=\"Deny\" />\n          <section name=\"digestAuthentication\" overrideModeDefault=\"Deny\" />\n          <section name=\"iisClientCertificateMappingAuthentication\" overrideModeDefault=\"Deny\" />\n          <section name=\"windowsAuthentication\" overrideModeDefault=\"Deny\" />\n        </sectionGroup>\n        <section name=\"authorization\" overrideModeDefault=\"Allow\" />\n        <section name=\"ipSecurity\" overrideModeDefault=\"Deny\" />\n        <section name=\"dynamicIpSecurity\" overrideModeDefault=\"Deny\" />\n        <section name=\"isapiCgiRestriction\" allowDefinition=\"AppHostOnly\" overrideModeDefault=\"Deny\" />\n        <section name=\"requestFiltering\" overrideModeDefault=\"Allow\" />\n      </sectionGroup>\n      <section name=\"serverRuntime\" overrideModeDefault=\"Deny\" />\n      <section name=\"serverSideInclude\" overrideModeDefault=\"Deny\" />\n      <section name=\"staticContent\" overrideModeDefault=\"Allow\" />\n      <sectionGroup name=\"tracing\">\n        <section name=\"traceFailedRequests\" overrideModeDefault=\"Allow\" />\n        <section name=\"traceProviderDefinitions\" overrideModeDefault=\"Deny\" />\n      </sectionGroup>\n      <section name=\"urlCompression\" overrideModeDefault=\"Allow\" />\n      <section name=\"validation\" overrideModeDefault=\"Allow\" />\n      <sectionGroup name=\"webdav\">\n        <section name=\"globalSettings\" overrideModeDefault=\"Deny\" />\n        <section name=\"authoring\" overrideModeDefault=\"Deny\" />\n        <section name=\"authoringRules\" overrideModeDefault=\"Deny\" />\n      </sectionGroup>\n      <sectionGroup name=\"rewrite\">\n        <section name=\"allowedServerVariables\" overrideModeDefault=\"Deny\" />\n        <section name=\"rules\" overrideModeDefault=\"Allow\" />\n        <section name=\"outboundRules\" overrideModeDefault=\"Allow\" />\n        <section name=\"globalRules\" overrideModeDefault=\"Deny\" allowDefinition=\"AppHostOnly\" />\n        <section name=\"providers\" overrideModeDefault=\"Allow\" />\n        <section name=\"rewriteMaps\" overrideModeDefault=\"Allow\" />\n      </sectionGroup>\n      <section name=\"webSocket\" overrideModeDefault=\"Deny\" />\n      <section name=\"aspNetCore\" overrideModeDefault=\"Allow\" />\n    </sectionGroup>\n  </configSections>\n  <configProtectedData>\n    <providers>\n      <add name=\"IISWASOnlyRsaProvider\" type=\"\" description=\"Uses RsaCryptoServiceProvider to encrypt and decrypt\" keyContainerName=\"iisWasKey\" cspProviderName=\"\" useMachineContainer=\"true\" useOAEP=\"false\" />\n      <add name=\"AesProvider\" type=\"Microsoft.ApplicationHost.AesProtectedConfigurationProvider\" description=\"Uses an AES session key to encrypt and decrypt\" keyContainerName=\"iisConfigurationKey\" cspProviderName=\"\" useOAEP=\"false\" useMachineContainer=\"true\" sessionKey=\"AQIAAA5mAAAApAAAKmFQvWHDEETRz8l2bjZlRxIkwcqTFaCUnCLljn3Q1OkesrhEO9YyLyx4bUhsj1/DyShAv7OAFFhXlrlomaornnk5PLeyO4lIXxaiT33yOFUUgxDx4GSaygkqghVV0tO5yQ/XguUBp2juMfZyztnsNa4pLcz7ZNZQ6p4yn9hxwNs=\" />\n      <add name=\"IISWASOnlyAesProvider\" type=\"Microsoft.ApplicationHost.AesProtectedConfigurationProvider\" description=\"Uses an AES session key to encrypt and decrypt\" keyContainerName=\"iisWasKey\" cspProviderName=\"\" useOAEP=\"false\" useMachineContainer=\"true\" sessionKey=\"AQIAAA5mAAAApAAA4WoiRJ8KHwzAG8AgejPxEOO4/2Vhkolbwo/8gZeNdUDSD36m55hWv4uC9tr/MlKdnwRLL0NhT50Gccyftqz5xTZ0dg5FtvQhTw/he1NwexTKbV+I4Zrd+sZUqHZTsr7JiEr6OHGXL70qoISW5G2m9U8wKT3caPiDPNj2aAaYPLo=\" />\n    </providers>\n  </configProtectedData>\n  <system.applicationHost>\n    <applicationPools>\n      <add name=\"Clr4IntegratedAppPool\" managedRuntimeVersion=\"v4.0\" managedPipelineMode=\"Integrated\" CLRConfigFile=\"%IIS_USER_HOME%\\config\\aspnet.config\" autoStart=\"true\" />\n      <add name=\"Clr4ClassicAppPool\" managedRuntimeVersion=\"v4.0\" managedPipelineMode=\"Classic\" CLRConfigFile=\"%IIS_USER_HOME%\\config\\aspnet.config\" autoStart=\"true\" />\n      <add name=\"Clr2IntegratedAppPool\" managedRuntimeVersion=\"v2.0\" managedPipelineMode=\"Integrated\" CLRConfigFile=\"%IIS_USER_HOME%\\config\\aspnet.config\" autoStart=\"true\" />\n      <add name=\"Clr2ClassicAppPool\" managedRuntimeVersion=\"v2.0\" managedPipelineMode=\"Classic\" CLRConfigFile=\"%IIS_USER_HOME%\\config\\aspnet.config\" autoStart=\"true\" />\n      <add name=\"UnmanagedClassicAppPool\" managedRuntimeVersion=\"\" managedPipelineMode=\"Classic\" autoStart=\"true\" />\n      <applicationPoolDefaults managedRuntimeLoader=\"v4.0\">\n        <processModel />\n      </applicationPoolDefaults>\n    </applicationPools>\n    <!--\n\n          The <listenerAdapters> section defines the protocols with which the\n          Windows Process Activation Service (WAS) binds.\n\n        -->\n    <listenerAdapters>\n      <add name=\"http\" />\n    </listenerAdapters>\n    <sites>\n      <site name=\"WebSite1\" id=\"1\" serverAutoStart=\"true\">\n        <application path=\"/\">\n          <virtualDirectory path=\"/\" physicalPath=\"%IIS_SITES_HOME%\\WebSite1\" />\n        </application>\n        <bindings>\n          <binding protocol=\"http\" bindingInformation=\":8080:localhost\" />\n        </bindings>\n      </site>\n      <site name=\"Sodao.Core.Web\" id=\"2\">\n        <application path=\"/\" applicationPool=\"Clr4IntegratedAppPool\">\n          <virtualDirectory path=\"/\" physicalPath=\"E:\\Sodao\\DotNetCore\\example\\src\\Sodao.Core\\Sodao.Core.Web\" />\n        </application>\n        <bindings>\n          <binding protocol=\"http\" bindingInformation=\"*:44435:localhost\" />\n        </bindings>\n      </site>\n      <siteDefaults>\n        <logFile logFormat=\"W3C\" directory=\"%IIS_USER_HOME%\\Logs\" />\n        <traceFailedRequestsLogging directory=\"%IIS_USER_HOME%\\TraceLogFiles\" enabled=\"true\" maxLogFileSizeKB=\"1024\" />\n      </siteDefaults>\n      <applicationDefaults applicationPool=\"Clr4IntegratedAppPool\" />\n      <virtualDirectoryDefaults allowSubDirConfig=\"true\" />\n    </sites>\n    <webLimits />\n  </system.applicationHost>\n  <system.webServer>\n    <serverRuntime />\n    <asp scriptErrorSentToBrowser=\"true\">\n      <cache diskTemplateCacheDirectory=\"%TEMP%\\iisexpress\\ASP Compiled Templates\" />\n      <limits />\n    </asp>\n    <caching enabled=\"true\" enableKernelCache=\"true\"></caching>\n    <cgi />\n    <defaultDocument enabled=\"true\">\n      <files>\n        <add value=\"Default.htm\" />\n        <add value=\"Default.asp\" />\n        <add value=\"index.htm\" />\n        <add value=\"index.html\" />\n        <add value=\"iisstart.htm\" />\n        <add value=\"default.aspx\" />\n      </files>\n    </defaultDocument>\n    <directoryBrowse enabled=\"false\" />\n    <fastCgi />\n    <!--\n\n          The <globalModules> section defines all native-code modules.\n          To enable a module, specify it in the <modules> section.\n\n        -->\n    <globalModules>\n      <add name=\"HttpLoggingModule\" image=\"%IIS_BIN%\\loghttp.dll\" />\n      <add name=\"UriCacheModule\" image=\"%IIS_BIN%\\cachuri.dll\" />\n      <!--            <add name=\"FileCacheModule\" image=\"%IIS_BIN%\\cachfile.dll\" />  -->\n      <add name=\"TokenCacheModule\" image=\"%IIS_BIN%\\cachtokn.dll\" />\n      <!--            <add name=\"HttpCacheModule\" image=\"%IIS_BIN%\\cachhttp.dll\" /> -->\n      <add name=\"DynamicCompressionModule\" image=\"%IIS_BIN%\\compdyn.dll\" />\n      <add name=\"StaticCompressionModule\" image=\"%IIS_BIN%\\compstat.dll\" />\n      <add name=\"DefaultDocumentModule\" image=\"%IIS_BIN%\\defdoc.dll\" />\n      <add name=\"DirectoryListingModule\" image=\"%IIS_BIN%\\dirlist.dll\" />\n      <add name=\"ProtocolSupportModule\" image=\"%IIS_BIN%\\protsup.dll\" />\n      <add name=\"HttpRedirectionModule\" image=\"%IIS_BIN%\\redirect.dll\" />\n      <add name=\"ServerSideIncludeModule\" image=\"%IIS_BIN%\\iis_ssi.dll\" />\n      <add name=\"StaticFileModule\" image=\"%IIS_BIN%\\static.dll\" />\n      <add name=\"AnonymousAuthenticationModule\" image=\"%IIS_BIN%\\authanon.dll\" />\n      <add name=\"CertificateMappingAuthenticationModule\" image=\"%IIS_BIN%\\authcert.dll\" />\n      <add name=\"UrlAuthorizationModule\" image=\"%IIS_BIN%\\urlauthz.dll\" />\n      <add name=\"BasicAuthenticationModule\" image=\"%IIS_BIN%\\authbas.dll\" />\n      <add name=\"WindowsAuthenticationModule\" image=\"%IIS_BIN%\\authsspi.dll\" />\n      <!--            <add name=\"DigestAuthenticationModule\" image=\"%IIS_BIN%\\authmd5.dll\" /> -->\n      <add name=\"IISCertificateMappingAuthenticationModule\" image=\"%IIS_BIN%\\authmap.dll\" />\n      <add name=\"IpRestrictionModule\" image=\"%IIS_BIN%\\iprestr.dll\" />\n      <add name=\"DynamicIpRestrictionModule\" image=\"%IIS_BIN%\\diprestr.dll\" />\n      <add name=\"RequestFilteringModule\" image=\"%IIS_BIN%\\modrqflt.dll\" />\n      <add name=\"CustomLoggingModule\" image=\"%IIS_BIN%\\logcust.dll\" />\n      <add name=\"CustomErrorModule\" image=\"%IIS_BIN%\\custerr.dll\" />\n      <!--            <add name=\"TracingModule\" image=\"%IIS_BIN%\\iisetw.dll\" /> -->\n      <add name=\"FailedRequestsTracingModule\" image=\"%IIS_BIN%\\iisfreb.dll\" />\n      <add name=\"RequestMonitorModule\" image=\"%IIS_BIN%\\iisreqs.dll\" />\n      <add name=\"IsapiModule\" image=\"%IIS_BIN%\\isapi.dll\" />\n      <add name=\"IsapiFilterModule\" image=\"%IIS_BIN%\\filter.dll\" />\n      <add name=\"CgiModule\" image=\"%IIS_BIN%\\cgi.dll\" />\n      <add name=\"FastCgiModule\" image=\"%IIS_BIN%\\iisfcgi.dll\" />\n      <!--            <add name=\"WebDAVModule\" image=\"%IIS_BIN%\\webdav.dll\" /> -->\n      <add name=\"RewriteModule\" image=\"%IIS_BIN%\\rewrite.dll\" />\n      <add name=\"ConfigurationValidationModule\" image=\"%IIS_BIN%\\validcfg.dll\" />\n      <add name=\"WebSocketModule\" image=\"%IIS_BIN%\\iiswsock.dll\" />\n      <add name=\"WebMatrixSupportModule\" image=\"%IIS_BIN%\\webmatrixsup.dll\" />\n      <add name=\"ManagedEngine\" image=\"%windir%\\Microsoft.NET\\Framework\\v2.0.50727\\webengine.dll\" preCondition=\"integratedMode,runtimeVersionv2.0,bitness32\" />\n      <add name=\"ManagedEngine64\" image=\"%windir%\\Microsoft.NET\\Framework64\\v2.0.50727\\webengine.dll\" preCondition=\"integratedMode,runtimeVersionv2.0,bitness64\" />\n      <add name=\"ManagedEngineV4.0_32bit\" image=\"%windir%\\Microsoft.NET\\Framework\\v4.0.30319\\webengine4.dll\" preCondition=\"integratedMode,runtimeVersionv4.0,bitness32\" />\n      <add name=\"ManagedEngineV4.0_64bit\" image=\"%windir%\\Microsoft.NET\\Framework64\\v4.0.30319\\webengine4.dll\" preCondition=\"integratedMode,runtimeVersionv4.0,bitness64\" />\n      <add name=\"ApplicationInitializationModule\" image=\"%IIS_BIN%\\warmup.dll\" />\n      <add name=\"AspNetCoreModule\" image=\"%IIS_BIN%\\aspnetcore.dll\" />\n    </globalModules>\n    <httpCompression directory=\"%TEMP%\\iisexpress\\IIS Temporary Compressed Files\">\n      <scheme name=\"gzip\" dll=\"%IIS_BIN%\\gzip.dll\" />\n      <dynamicTypes>\n        <add mimeType=\"text/*\" enabled=\"true\" />\n        <add mimeType=\"message/*\" enabled=\"true\" />\n        <add mimeType=\"application/javascript\" enabled=\"true\" />\n        <add mimeType=\"application/atom+xml\" enabled=\"true\" />\n        <add mimeType=\"application/xaml+xml\" enabled=\"true\" />\n        <add mimeType=\"*/*\" enabled=\"false\" />\n      </dynamicTypes>\n      <staticTypes>\n        <add mimeType=\"text/*\" enabled=\"true\" />\n        <add mimeType=\"message/*\" enabled=\"true\" />\n        <add mimeType=\"image/svg+xml\" enabled=\"true\" />\n        <add mimeType=\"application/javascript\" enabled=\"true\" />\n        <add mimeType=\"application/atom+xml\" enabled=\"true\" />\n        <add mimeType=\"application/xaml+xml\" enabled=\"true\" />\n        <add mimeType=\"*/*\" enabled=\"false\" />\n      </staticTypes>\n    </httpCompression>\n    <httpErrors lockAttributes=\"allowAbsolutePathsWhenDelegated,defaultPath\">\n      <error statusCode=\"401\" prefixLanguageFilePath=\"%IIS_BIN%\\custerr\" path=\"401.htm\" />\n      <error statusCode=\"403\" prefixLanguageFilePath=\"%IIS_BIN%\\custerr\" path=\"403.htm\" />\n      <error statusCode=\"404\" prefixLanguageFilePath=\"%IIS_BIN%\\custerr\" path=\"404.htm\" />\n      <error statusCode=\"405\" prefixLanguageFilePath=\"%IIS_BIN%\\custerr\" path=\"405.htm\" />\n      <error statusCode=\"406\" prefixLanguageFilePath=\"%IIS_BIN%\\custerr\" path=\"406.htm\" />\n      <error statusCode=\"412\" prefixLanguageFilePath=\"%IIS_BIN%\\custerr\" path=\"412.htm\" />\n      <error statusCode=\"500\" prefixLanguageFilePath=\"%IIS_BIN%\\custerr\" path=\"500.htm\" />\n      <error statusCode=\"501\" prefixLanguageFilePath=\"%IIS_BIN%\\custerr\" path=\"501.htm\" />\n      <error statusCode=\"502\" prefixLanguageFilePath=\"%IIS_BIN%\\custerr\" path=\"502.htm\" />\n    </httpErrors>\n    <httpLogging dontLog=\"false\" />\n    <httpProtocol>\n      <customHeaders>\n        <clear />\n        <add name=\"X-Powered-By\" value=\"ASP.NET\" />\n      </customHeaders>\n      <redirectHeaders>\n        <clear />\n      </redirectHeaders>\n    </httpProtocol>\n    <httpRedirect enabled=\"false\" />\n    <httpTracing></httpTracing>\n    <isapiFilters>\n      <filter name=\"ASP.Net_2.0.50727-64\" path=\"%windir%\\Microsoft.NET\\Framework64\\v2.0.50727\\aspnet_filter.dll\" enableCache=\"true\" preCondition=\"bitness64,runtimeVersionv2.0\" />\n      <filter name=\"ASP.Net_2.0.50727.0\" path=\"%windir%\\Microsoft.NET\\Framework\\v2.0.50727\\aspnet_filter.dll\" enableCache=\"true\" preCondition=\"bitness32,runtimeVersionv2.0\" />\n      <filter name=\"ASP.Net_2.0_for_v1.1\" path=\"%windir%\\Microsoft.NET\\Framework\\v2.0.50727\\aspnet_filter.dll\" enableCache=\"true\" preCondition=\"runtimeVersionv1.1\" />\n      <filter name=\"ASP.Net_4.0_32bit\" path=\"%windir%\\Microsoft.NET\\Framework\\v4.0.30319\\aspnet_filter.dll\" enableCache=\"true\" preCondition=\"bitness32,runtimeVersionv4.0\" />\n      <filter name=\"ASP.Net_4.0_64bit\" path=\"%windir%\\Microsoft.NET\\Framework64\\v4.0.30319\\aspnet_filter.dll\" enableCache=\"true\" preCondition=\"bitness64,runtimeVersionv4.0\" />\n    </isapiFilters>\n    <odbcLogging />\n    <security>\n      <access sslFlags=\"None\" />\n      <applicationDependencies>\n        <application name=\"Active Server Pages\" groupId=\"ASP\" />\n      </applicationDependencies>\n      <authentication>\n        <anonymousAuthentication enabled=\"true\" userName=\"\" />\n        <basicAuthentication enabled=\"false\" />\n        <clientCertificateMappingAuthentication enabled=\"false\" />\n        <digestAuthentication enabled=\"false\" />\n        <iisClientCertificateMappingAuthentication enabled=\"false\"></iisClientCertificateMappingAuthentication>\n        <windowsAuthentication enabled=\"false\">\n          <providers>\n            <add value=\"Negotiate\" />\n            <add value=\"NTLM\" />\n          </providers>\n        </windowsAuthentication>\n      </authentication>\n      <authorization>\n        <add accessType=\"Allow\" users=\"*\" />\n      </authorization>\n      <ipSecurity allowUnlisted=\"true\" />\n      <isapiCgiRestriction notListedIsapisAllowed=\"true\" notListedCgisAllowed=\"true\">\n        <add path=\"%windir%\\Microsoft.NET\\Framework64\\v4.0.30319\\webengine4.dll\" allowed=\"true\" groupId=\"ASP.NET_v4.0\" description=\"ASP.NET_v4.0\" />\n        <add path=\"%windir%\\Microsoft.NET\\Framework\\v4.0.30319\\webengine4.dll\" allowed=\"true\" groupId=\"ASP.NET_v4.0\" description=\"ASP.NET_v4.0\" />\n        <add path=\"%windir%\\Microsoft.NET\\Framework64\\v2.0.50727\\aspnet_isapi.dll\" allowed=\"true\" groupId=\"ASP.NET v2.0.50727\" description=\"ASP.NET v2.0.50727\" />\n        <add path=\"%windir%\\Microsoft.NET\\Framework\\v2.0.50727\\aspnet_isapi.dll\" allowed=\"true\" groupId=\"ASP.NET v2.0.50727\" description=\"ASP.NET v2.0.50727\" />\n      </isapiCgiRestriction>\n      <requestFiltering>\n        <fileExtensions allowUnlisted=\"true\" applyToWebDAV=\"true\">\n          <add fileExtension=\".asa\" allowed=\"false\" />\n          <add fileExtension=\".asax\" allowed=\"false\" />\n          <add fileExtension=\".ascx\" allowed=\"false\" />\n          <add fileExtension=\".master\" allowed=\"false\" />\n          <add fileExtension=\".skin\" allowed=\"false\" />\n          <add fileExtension=\".browser\" allowed=\"false\" />\n          <add fileExtension=\".sitemap\" allowed=\"false\" />\n          <add fileExtension=\".config\" allowed=\"false\" />\n          <add fileExtension=\".cs\" allowed=\"false\" />\n          <add fileExtension=\".csproj\" allowed=\"false\" />\n          <add fileExtension=\".vb\" allowed=\"false\" />\n          <add fileExtension=\".vbproj\" allowed=\"false\" />\n          <add fileExtension=\".webinfo\" allowed=\"false\" />\n          <add fileExtension=\".licx\" allowed=\"false\" />\n          <add fileExtension=\".resx\" allowed=\"false\" />\n          <add fileExtension=\".resources\" allowed=\"false\" />\n          <add fileExtension=\".mdb\" allowed=\"false\" />\n          <add fileExtension=\".vjsproj\" allowed=\"false\" />\n          <add fileExtension=\".java\" allowed=\"false\" />\n          <add fileExtension=\".jsl\" allowed=\"false\" />\n          <add fileExtension=\".ldb\" allowed=\"false\" />\n          <add fileExtension=\".dsdgm\" allowed=\"false\" />\n          <add fileExtension=\".ssdgm\" allowed=\"false\" />\n          <add fileExtension=\".lsad\" allowed=\"false\" />\n          <add fileExtension=\".ssmap\" allowed=\"false\" />\n          <add fileExtension=\".cd\" allowed=\"false\" />\n          <add fileExtension=\".dsprototype\" allowed=\"false\" />\n          <add fileExtension=\".lsaprototype\" allowed=\"false\" />\n          <add fileExtension=\".sdm\" allowed=\"false\" />\n          <add fileExtension=\".sdmDocument\" allowed=\"false\" />\n          <add fileExtension=\".mdf\" allowed=\"false\" />\n          <add fileExtension=\".ldf\" allowed=\"false\" />\n          <add fileExtension=\".ad\" allowed=\"false\" />\n          <add fileExtension=\".dd\" allowed=\"false\" />\n          <add fileExtension=\".ldd\" allowed=\"false\" />\n          <add fileExtension=\".sd\" allowed=\"false\" />\n          <add fileExtension=\".adprototype\" allowed=\"false\" />\n          <add fileExtension=\".lddprototype\" allowed=\"false\" />\n          <add fileExtension=\".exclude\" allowed=\"false\" />\n          <add fileExtension=\".refresh\" allowed=\"false\" />\n          <add fileExtension=\".compiled\" allowed=\"false\" />\n          <add fileExtension=\".msgx\" allowed=\"false\" />\n          <add fileExtension=\".vsdisco\" allowed=\"false\" />\n          <add fileExtension=\".rules\" allowed=\"false\" />\n        </fileExtensions>\n        <verbs allowUnlisted=\"true\" applyToWebDAV=\"true\" />\n        <hiddenSegments applyToWebDAV=\"true\">\n          <add segment=\"web.config\" />\n          <add segment=\"bin\" />\n          <add segment=\"App_code\" />\n          <add segment=\"App_GlobalResources\" />\n          <add segment=\"App_LocalResources\" />\n          <add segment=\"App_WebReferences\" />\n          <add segment=\"App_Data\" />\n          <add segment=\"App_Browsers\" />\n        </hiddenSegments>\n      </requestFiltering>\n    </security>\n    <serverSideInclude ssiExecDisable=\"false\" />\n    <staticContent lockAttributes=\"isDocFooterFileName\">\n      <mimeMap fileExtension=\".323\" mimeType=\"text/h323\" />\n      <mimeMap fileExtension=\".3g2\" mimeType=\"video/3gpp2\" />\n      <mimeMap fileExtension=\".3gp2\" mimeType=\"video/3gpp2\" />\n      <mimeMap fileExtension=\".3gp\" mimeType=\"video/3gpp\" />\n      <mimeMap fileExtension=\".3gpp\" mimeType=\"video/3gpp\" />\n      <mimeMap fileExtension=\".aac\" mimeType=\"audio/aac\" />\n      <mimeMap fileExtension=\".aaf\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".aca\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".accdb\" mimeType=\"application/msaccess\" />\n      <mimeMap fileExtension=\".accde\" mimeType=\"application/msaccess\" />\n      <mimeMap fileExtension=\".accdt\" mimeType=\"application/msaccess\" />\n      <mimeMap fileExtension=\".acx\" mimeType=\"application/internet-property-stream\" />\n      <mimeMap fileExtension=\".adt\" mimeType=\"audio/vnd.dlna.adts\" />\n      <mimeMap fileExtension=\".adts\" mimeType=\"audio/vnd.dlna.adts\" />\n      <mimeMap fileExtension=\".afm\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".ai\" mimeType=\"application/postscript\" />\n      <mimeMap fileExtension=\".aif\" mimeType=\"audio/x-aiff\" />\n      <mimeMap fileExtension=\".aifc\" mimeType=\"audio/aiff\" />\n      <mimeMap fileExtension=\".aiff\" mimeType=\"audio/aiff\" />\n      <mimeMap fileExtension=\".appcache\" mimeType=\"text/cache-manifest\" />\n      <mimeMap fileExtension=\".application\" mimeType=\"application/x-ms-application\" />\n      <mimeMap fileExtension=\".art\" mimeType=\"image/x-jg\" />\n      <mimeMap fileExtension=\".asd\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".asf\" mimeType=\"video/x-ms-asf\" />\n      <mimeMap fileExtension=\".asi\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".asm\" mimeType=\"text/plain\" />\n      <mimeMap fileExtension=\".asr\" mimeType=\"video/x-ms-asf\" />\n      <mimeMap fileExtension=\".asx\" mimeType=\"video/x-ms-asf\" />\n      <mimeMap fileExtension=\".atom\" mimeType=\"application/atom+xml\" />\n      <mimeMap fileExtension=\".au\" mimeType=\"audio/basic\" />\n      <mimeMap fileExtension=\".avi\" mimeType=\"video/msvideo\" />\n      <mimeMap fileExtension=\".axs\" mimeType=\"application/olescript\" />\n      <mimeMap fileExtension=\".bas\" mimeType=\"text/plain\" />\n      <mimeMap fileExtension=\".bcpio\" mimeType=\"application/x-bcpio\" />\n      <mimeMap fileExtension=\".bin\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".bmp\" mimeType=\"image/bmp\" />\n      <mimeMap fileExtension=\".c\" mimeType=\"text/plain\" />\n      <mimeMap fileExtension=\".cab\" mimeType=\"application/vnd.ms-cab-compressed\" />\n      <mimeMap fileExtension=\".calx\" mimeType=\"application/vnd.ms-office.calx\" />\n      <mimeMap fileExtension=\".cat\" mimeType=\"application/vnd.ms-pki.seccat\" />\n      <mimeMap fileExtension=\".cdf\" mimeType=\"application/x-cdf\" />\n      <mimeMap fileExtension=\".chm\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".class\" mimeType=\"application/x-java-applet\" />\n      <mimeMap fileExtension=\".clp\" mimeType=\"application/x-msclip\" />\n      <mimeMap fileExtension=\".cmx\" mimeType=\"image/x-cmx\" />\n      <mimeMap fileExtension=\".cnf\" mimeType=\"text/plain\" />\n      <mimeMap fileExtension=\".cod\" mimeType=\"image/cis-cod\" />\n      <mimeMap fileExtension=\".cpio\" mimeType=\"application/x-cpio\" />\n      <mimeMap fileExtension=\".cpp\" mimeType=\"text/plain\" />\n      <mimeMap fileExtension=\".crd\" mimeType=\"application/x-mscardfile\" />\n      <mimeMap fileExtension=\".crl\" mimeType=\"application/pkix-crl\" />\n      <mimeMap fileExtension=\".crt\" mimeType=\"application/x-x509-ca-cert\" />\n      <mimeMap fileExtension=\".csh\" mimeType=\"application/x-csh\" />\n      <mimeMap fileExtension=\".css\" mimeType=\"text/css\" />\n      <mimeMap fileExtension=\".csv\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".cur\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".dcr\" mimeType=\"application/x-director\" />\n      <mimeMap fileExtension=\".deploy\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".der\" mimeType=\"application/x-x509-ca-cert\" />\n      <mimeMap fileExtension=\".dib\" mimeType=\"image/bmp\" />\n      <mimeMap fileExtension=\".dir\" mimeType=\"application/x-director\" />\n      <mimeMap fileExtension=\".disco\" mimeType=\"text/xml\" />\n      <mimeMap fileExtension=\".dll\" mimeType=\"application/x-msdownload\" />\n      <mimeMap fileExtension=\".dll.config\" mimeType=\"text/xml\" />\n      <mimeMap fileExtension=\".dlm\" mimeType=\"text/dlm\" />\n      <mimeMap fileExtension=\".doc\" mimeType=\"application/msword\" />\n      <mimeMap fileExtension=\".docm\" mimeType=\"application/vnd.ms-word.document.macroEnabled.12\" />\n      <mimeMap fileExtension=\".docx\" mimeType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document\" />\n      <mimeMap fileExtension=\".dot\" mimeType=\"application/msword\" />\n      <mimeMap fileExtension=\".dotm\" mimeType=\"application/vnd.ms-word.template.macroEnabled.12\" />\n      <mimeMap fileExtension=\".dotx\" mimeType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.template\" />\n      <mimeMap fileExtension=\".dsp\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".dtd\" mimeType=\"text/xml\" />\n      <mimeMap fileExtension=\".dvi\" mimeType=\"application/x-dvi\" />\n      <mimeMap fileExtension=\".dvr-ms\" mimeType=\"video/x-ms-dvr\" />\n      <mimeMap fileExtension=\".dwf\" mimeType=\"drawing/x-dwf\" />\n      <mimeMap fileExtension=\".dwp\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".dxr\" mimeType=\"application/x-director\" />\n      <mimeMap fileExtension=\".eml\" mimeType=\"message/rfc822\" />\n      <mimeMap fileExtension=\".emz\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".eot\" mimeType=\"application/vnd.ms-fontobject\" />\n      <mimeMap fileExtension=\".eps\" mimeType=\"application/postscript\" />\n      <mimeMap fileExtension=\".etx\" mimeType=\"text/x-setext\" />\n      <mimeMap fileExtension=\".evy\" mimeType=\"application/envoy\" />\n      <mimeMap fileExtension=\".exe\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".exe.config\" mimeType=\"text/xml\" />\n      <mimeMap fileExtension=\".fdf\" mimeType=\"application/vnd.fdf\" />\n      <mimeMap fileExtension=\".fif\" mimeType=\"application/fractals\" />\n      <mimeMap fileExtension=\".fla\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".flr\" mimeType=\"x-world/x-vrml\" />\n      <mimeMap fileExtension=\".flv\" mimeType=\"video/x-flv\" />\n      <mimeMap fileExtension=\".gif\" mimeType=\"image/gif\" />\n      <mimeMap fileExtension=\".gtar\" mimeType=\"application/x-gtar\" />\n      <mimeMap fileExtension=\".gz\" mimeType=\"application/x-gzip\" />\n      <mimeMap fileExtension=\".h\" mimeType=\"text/plain\" />\n      <mimeMap fileExtension=\".hdf\" mimeType=\"application/x-hdf\" />\n      <mimeMap fileExtension=\".hdml\" mimeType=\"text/x-hdml\" />\n      <mimeMap fileExtension=\".hhc\" mimeType=\"application/x-oleobject\" />\n      <mimeMap fileExtension=\".hhk\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".hhp\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".hlp\" mimeType=\"application/winhlp\" />\n      <mimeMap fileExtension=\".hqx\" mimeType=\"application/mac-binhex40\" />\n      <mimeMap fileExtension=\".hta\" mimeType=\"application/hta\" />\n      <mimeMap fileExtension=\".htc\" mimeType=\"text/x-component\" />\n      <mimeMap fileExtension=\".htm\" mimeType=\"text/html\" />\n      <mimeMap fileExtension=\".html\" mimeType=\"text/html\" />\n      <mimeMap fileExtension=\".htt\" mimeType=\"text/webviewhtml\" />\n      <mimeMap fileExtension=\".hxt\" mimeType=\"text/html\" />\n      <mimeMap fileExtension=\".ico\" mimeType=\"image/x-icon\" />\n      <mimeMap fileExtension=\".ics\" mimeType=\"text/calendar\" />\n      <mimeMap fileExtension=\".ief\" mimeType=\"image/ief\" />\n      <mimeMap fileExtension=\".iii\" mimeType=\"application/x-iphone\" />\n      <mimeMap fileExtension=\".inf\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".ins\" mimeType=\"application/x-internet-signup\" />\n      <mimeMap fileExtension=\".isp\" mimeType=\"application/x-internet-signup\" />\n      <mimeMap fileExtension=\".IVF\" mimeType=\"video/x-ivf\" />\n      <mimeMap fileExtension=\".jar\" mimeType=\"application/java-archive\" />\n      <mimeMap fileExtension=\".java\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".jck\" mimeType=\"application/liquidmotion\" />\n      <mimeMap fileExtension=\".jcz\" mimeType=\"application/liquidmotion\" />\n      <mimeMap fileExtension=\".jfif\" mimeType=\"image/pjpeg\" />\n      <mimeMap fileExtension=\".jpb\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".jpe\" mimeType=\"image/jpeg\" />\n      <mimeMap fileExtension=\".jpeg\" mimeType=\"image/jpeg\" />\n      <mimeMap fileExtension=\".jpg\" mimeType=\"image/jpeg\" />\n      <mimeMap fileExtension=\".js\" mimeType=\"application/javascript\" />\n      <mimeMap fileExtension=\".json\" mimeType=\"application/json\" />\n      <mimeMap fileExtension=\".jsonld\" mimeType=\"application/ld+json\" />\n      <mimeMap fileExtension=\".jsx\" mimeType=\"text/jscript\" />\n      <mimeMap fileExtension=\".latex\" mimeType=\"application/x-latex\" />\n      <mimeMap fileExtension=\".less\" mimeType=\"text/css\" />\n      <mimeMap fileExtension=\".lit\" mimeType=\"application/x-ms-reader\" />\n      <mimeMap fileExtension=\".lpk\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".lsf\" mimeType=\"video/x-la-asf\" />\n      <mimeMap fileExtension=\".lsx\" mimeType=\"video/x-la-asf\" />\n      <mimeMap fileExtension=\".lzh\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".m13\" mimeType=\"application/x-msmediaview\" />\n      <mimeMap fileExtension=\".m14\" mimeType=\"application/x-msmediaview\" />\n      <mimeMap fileExtension=\".m1v\" mimeType=\"video/mpeg\" />\n      <mimeMap fileExtension=\".m2ts\" mimeType=\"video/vnd.dlna.mpeg-tts\" />\n      <mimeMap fileExtension=\".m3u\" mimeType=\"audio/x-mpegurl\" />\n      <mimeMap fileExtension=\".m4a\" mimeType=\"audio/mp4\" />\n      <mimeMap fileExtension=\".m4v\" mimeType=\"video/mp4\" />\n      <mimeMap fileExtension=\".man\" mimeType=\"application/x-troff-man\" />\n      <mimeMap fileExtension=\".manifest\" mimeType=\"application/x-ms-manifest\" />\n      <mimeMap fileExtension=\".map\" mimeType=\"text/plain\" />\n      <mimeMap fileExtension=\".mdb\" mimeType=\"application/x-msaccess\" />\n      <mimeMap fileExtension=\".mdp\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".me\" mimeType=\"application/x-troff-me\" />\n      <mimeMap fileExtension=\".mht\" mimeType=\"message/rfc822\" />\n      <mimeMap fileExtension=\".mhtml\" mimeType=\"message/rfc822\" />\n      <mimeMap fileExtension=\".mid\" mimeType=\"audio/mid\" />\n      <mimeMap fileExtension=\".midi\" mimeType=\"audio/mid\" />\n      <mimeMap fileExtension=\".mix\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".mmf\" mimeType=\"application/x-smaf\" />\n      <mimeMap fileExtension=\".mno\" mimeType=\"text/xml\" />\n      <mimeMap fileExtension=\".mny\" mimeType=\"application/x-msmoney\" />\n      <mimeMap fileExtension=\".mov\" mimeType=\"video/quicktime\" />\n      <mimeMap fileExtension=\".movie\" mimeType=\"video/x-sgi-movie\" />\n      <mimeMap fileExtension=\".mp2\" mimeType=\"video/mpeg\" />\n      <mimeMap fileExtension=\".mp3\" mimeType=\"audio/mpeg\" />\n      <mimeMap fileExtension=\".mp4\" mimeType=\"video/mp4\" />\n      <mimeMap fileExtension=\".mp4v\" mimeType=\"video/mp4\" />\n      <mimeMap fileExtension=\".mpa\" mimeType=\"video/mpeg\" />\n      <mimeMap fileExtension=\".mpe\" mimeType=\"video/mpeg\" />\n      <mimeMap fileExtension=\".mpeg\" mimeType=\"video/mpeg\" />\n      <mimeMap fileExtension=\".mpg\" mimeType=\"video/mpeg\" />\n      <mimeMap fileExtension=\".mpp\" mimeType=\"application/vnd.ms-project\" />\n      <mimeMap fileExtension=\".mpv2\" mimeType=\"video/mpeg\" />\n      <mimeMap fileExtension=\".ms\" mimeType=\"application/x-troff-ms\" />\n      <mimeMap fileExtension=\".msi\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".mso\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".mvb\" mimeType=\"application/x-msmediaview\" />\n      <mimeMap fileExtension=\".mvc\" mimeType=\"application/x-miva-compiled\" />\n      <mimeMap fileExtension=\".nc\" mimeType=\"application/x-netcdf\" />\n      <mimeMap fileExtension=\".nsc\" mimeType=\"video/x-ms-asf\" />\n      <mimeMap fileExtension=\".nws\" mimeType=\"message/rfc822\" />\n      <mimeMap fileExtension=\".ocx\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".oda\" mimeType=\"application/oda\" />\n      <mimeMap fileExtension=\".odc\" mimeType=\"text/x-ms-odc\" />\n      <mimeMap fileExtension=\".ods\" mimeType=\"application/oleobject\" />\n      <mimeMap fileExtension=\".oga\" mimeType=\"audio/ogg\" />\n      <mimeMap fileExtension=\".ogg\" mimeType=\"video/ogg\" />\n      <mimeMap fileExtension=\".ogv\" mimeType=\"video/ogg\" />\n      <mimeMap fileExtension=\".one\" mimeType=\"application/onenote\" />\n      <mimeMap fileExtension=\".onea\" mimeType=\"application/onenote\" />\n      <mimeMap fileExtension=\".onetoc\" mimeType=\"application/onenote\" />\n      <mimeMap fileExtension=\".onetoc2\" mimeType=\"application/onenote\" />\n      <mimeMap fileExtension=\".onetmp\" mimeType=\"application/onenote\" />\n      <mimeMap fileExtension=\".onepkg\" mimeType=\"application/onenote\" />\n      <mimeMap fileExtension=\".osdx\" mimeType=\"application/opensearchdescription+xml\" />\n      <mimeMap fileExtension=\".otf\" mimeType=\"font/otf\" />\n      <mimeMap fileExtension=\".p10\" mimeType=\"application/pkcs10\" />\n      <mimeMap fileExtension=\".p12\" mimeType=\"application/x-pkcs12\" />\n      <mimeMap fileExtension=\".p7b\" mimeType=\"application/x-pkcs7-certificates\" />\n      <mimeMap fileExtension=\".p7c\" mimeType=\"application/pkcs7-mime\" />\n      <mimeMap fileExtension=\".p7m\" mimeType=\"application/pkcs7-mime\" />\n      <mimeMap fileExtension=\".p7r\" mimeType=\"application/x-pkcs7-certreqresp\" />\n      <mimeMap fileExtension=\".p7s\" mimeType=\"application/pkcs7-signature\" />\n      <mimeMap fileExtension=\".pbm\" mimeType=\"image/x-portable-bitmap\" />\n      <mimeMap fileExtension=\".pcx\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".pcz\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".pdf\" mimeType=\"application/pdf\" />\n      <mimeMap fileExtension=\".pfb\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".pfm\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".pfx\" mimeType=\"application/x-pkcs12\" />\n      <mimeMap fileExtension=\".pgm\" mimeType=\"image/x-portable-graymap\" />\n      <mimeMap fileExtension=\".pko\" mimeType=\"application/vnd.ms-pki.pko\" />\n      <mimeMap fileExtension=\".pma\" mimeType=\"application/x-perfmon\" />\n      <mimeMap fileExtension=\".pmc\" mimeType=\"application/x-perfmon\" />\n      <mimeMap fileExtension=\".pml\" mimeType=\"application/x-perfmon\" />\n      <mimeMap fileExtension=\".pmr\" mimeType=\"application/x-perfmon\" />\n      <mimeMap fileExtension=\".pmw\" mimeType=\"application/x-perfmon\" />\n      <mimeMap fileExtension=\".png\" mimeType=\"image/png\" />\n      <mimeMap fileExtension=\".pnm\" mimeType=\"image/x-portable-anymap\" />\n      <mimeMap fileExtension=\".pnz\" mimeType=\"image/png\" />\n      <mimeMap fileExtension=\".pot\" mimeType=\"application/vnd.ms-powerpoint\" />\n      <mimeMap fileExtension=\".potm\" mimeType=\"application/vnd.ms-powerpoint.template.macroEnabled.12\" />\n      <mimeMap fileExtension=\".potx\" mimeType=\"application/vnd.openxmlformats-officedocument.presentationml.template\" />\n      <mimeMap fileExtension=\".ppam\" mimeType=\"application/vnd.ms-powerpoint.addin.macroEnabled.12\" />\n      <mimeMap fileExtension=\".ppm\" mimeType=\"image/x-portable-pixmap\" />\n      <mimeMap fileExtension=\".pps\" mimeType=\"application/vnd.ms-powerpoint\" />\n      <mimeMap fileExtension=\".ppsm\" mimeType=\"application/vnd.ms-powerpoint.slideshow.macroEnabled.12\" />\n      <mimeMap fileExtension=\".ppsx\" mimeType=\"application/vnd.openxmlformats-officedocument.presentationml.slideshow\" />\n      <mimeMap fileExtension=\".ppt\" mimeType=\"application/vnd.ms-powerpoint\" />\n      <mimeMap fileExtension=\".pptm\" mimeType=\"application/vnd.ms-powerpoint.presentation.macroEnabled.12\" />\n      <mimeMap fileExtension=\".pptx\" mimeType=\"application/vnd.openxmlformats-officedocument.presentationml.presentation\" />\n      <mimeMap fileExtension=\".prf\" mimeType=\"application/pics-rules\" />\n      <mimeMap fileExtension=\".prm\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".prx\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".ps\" mimeType=\"application/postscript\" />\n      <mimeMap fileExtension=\".psd\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".psm\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".psp\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".pub\" mimeType=\"application/x-mspublisher\" />\n      <mimeMap fileExtension=\".qt\" mimeType=\"video/quicktime\" />\n      <mimeMap fileExtension=\".qtl\" mimeType=\"application/x-quicktimeplayer\" />\n      <mimeMap fileExtension=\".qxd\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".ra\" mimeType=\"audio/x-pn-realaudio\" />\n      <mimeMap fileExtension=\".ram\" mimeType=\"audio/x-pn-realaudio\" />\n      <mimeMap fileExtension=\".rar\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".ras\" mimeType=\"image/x-cmu-raster\" />\n      <mimeMap fileExtension=\".rf\" mimeType=\"image/vnd.rn-realflash\" />\n      <mimeMap fileExtension=\".rgb\" mimeType=\"image/x-rgb\" />\n      <mimeMap fileExtension=\".rm\" mimeType=\"application/vnd.rn-realmedia\" />\n      <mimeMap fileExtension=\".rmi\" mimeType=\"audio/mid\" />\n      <mimeMap fileExtension=\".roff\" mimeType=\"application/x-troff\" />\n      <mimeMap fileExtension=\".rpm\" mimeType=\"audio/x-pn-realaudio-plugin\" />\n      <mimeMap fileExtension=\".rtf\" mimeType=\"application/rtf\" />\n      <mimeMap fileExtension=\".rtx\" mimeType=\"text/richtext\" />\n      <mimeMap fileExtension=\".scd\" mimeType=\"application/x-msschedule\" />\n      <mimeMap fileExtension=\".sct\" mimeType=\"text/scriptlet\" />\n      <mimeMap fileExtension=\".sea\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".setpay\" mimeType=\"application/set-payment-initiation\" />\n      <mimeMap fileExtension=\".setreg\" mimeType=\"application/set-registration-initiation\" />\n      <mimeMap fileExtension=\".sgml\" mimeType=\"text/sgml\" />\n      <mimeMap fileExtension=\".sh\" mimeType=\"application/x-sh\" />\n      <mimeMap fileExtension=\".shar\" mimeType=\"application/x-shar\" />\n      <mimeMap fileExtension=\".sit\" mimeType=\"application/x-stuffit\" />\n      <mimeMap fileExtension=\".sldm\" mimeType=\"application/vnd.ms-powerpoint.slide.macroEnabled.12\" />\n      <mimeMap fileExtension=\".sldx\" mimeType=\"application/vnd.openxmlformats-officedocument.presentationml.slide\" />\n      <mimeMap fileExtension=\".smd\" mimeType=\"audio/x-smd\" />\n      <mimeMap fileExtension=\".smi\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".smx\" mimeType=\"audio/x-smd\" />\n      <mimeMap fileExtension=\".smz\" mimeType=\"audio/x-smd\" />\n      <mimeMap fileExtension=\".snd\" mimeType=\"audio/basic\" />\n      <mimeMap fileExtension=\".snp\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".spc\" mimeType=\"application/x-pkcs7-certificates\" />\n      <mimeMap fileExtension=\".spl\" mimeType=\"application/futuresplash\" />\n      <mimeMap fileExtension=\".spx\" mimeType=\"audio/ogg\" />\n      <mimeMap fileExtension=\".src\" mimeType=\"application/x-wais-source\" />\n      <mimeMap fileExtension=\".ssm\" mimeType=\"application/streamingmedia\" />\n      <mimeMap fileExtension=\".sst\" mimeType=\"application/vnd.ms-pki.certstore\" />\n      <mimeMap fileExtension=\".stl\" mimeType=\"application/vnd.ms-pki.stl\" />\n      <mimeMap fileExtension=\".sv4cpio\" mimeType=\"application/x-sv4cpio\" />\n      <mimeMap fileExtension=\".sv4crc\" mimeType=\"application/x-sv4crc\" />\n      <mimeMap fileExtension=\".svg\" mimeType=\"image/svg+xml\" />\n      <mimeMap fileExtension=\".svgz\" mimeType=\"image/svg+xml\" />\n      <mimeMap fileExtension=\".swf\" mimeType=\"application/x-shockwave-flash\" />\n      <mimeMap fileExtension=\".t\" mimeType=\"application/x-troff\" />\n      <mimeMap fileExtension=\".tar\" mimeType=\"application/x-tar\" />\n      <mimeMap fileExtension=\".tcl\" mimeType=\"application/x-tcl\" />\n      <mimeMap fileExtension=\".tex\" mimeType=\"application/x-tex\" />\n      <mimeMap fileExtension=\".texi\" mimeType=\"application/x-texinfo\" />\n      <mimeMap fileExtension=\".texinfo\" mimeType=\"application/x-texinfo\" />\n      <mimeMap fileExtension=\".tgz\" mimeType=\"application/x-compressed\" />\n      <mimeMap fileExtension=\".thmx\" mimeType=\"application/vnd.ms-officetheme\" />\n      <mimeMap fileExtension=\".thn\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".tif\" mimeType=\"image/tiff\" />\n      <mimeMap fileExtension=\".tiff\" mimeType=\"image/tiff\" />\n      <mimeMap fileExtension=\".toc\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".tr\" mimeType=\"application/x-troff\" />\n      <mimeMap fileExtension=\".trm\" mimeType=\"application/x-msterminal\" />\n      <mimeMap fileExtension=\".ts\" mimeType=\"video/vnd.dlna.mpeg-tts\" />\n      <mimeMap fileExtension=\".tsv\" mimeType=\"text/tab-separated-values\" />\n      <mimeMap fileExtension=\".ttf\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".tts\" mimeType=\"video/vnd.dlna.mpeg-tts\" />\n      <mimeMap fileExtension=\".txt\" mimeType=\"text/plain\" />\n      <mimeMap fileExtension=\".u32\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".uls\" mimeType=\"text/iuls\" />\n      <mimeMap fileExtension=\".ustar\" mimeType=\"application/x-ustar\" />\n      <mimeMap fileExtension=\".vbs\" mimeType=\"text/vbscript\" />\n      <mimeMap fileExtension=\".vcf\" mimeType=\"text/x-vcard\" />\n      <mimeMap fileExtension=\".vcs\" mimeType=\"text/plain\" />\n      <mimeMap fileExtension=\".vdx\" mimeType=\"application/vnd.ms-visio.viewer\" />\n      <mimeMap fileExtension=\".vml\" mimeType=\"text/xml\" />\n      <mimeMap fileExtension=\".vsd\" mimeType=\"application/vnd.visio\" />\n      <mimeMap fileExtension=\".vss\" mimeType=\"application/vnd.visio\" />\n      <mimeMap fileExtension=\".vst\" mimeType=\"application/vnd.visio\" />\n      <mimeMap fileExtension=\".vsto\" mimeType=\"application/x-ms-vsto\" />\n      <mimeMap fileExtension=\".vsw\" mimeType=\"application/vnd.visio\" />\n      <mimeMap fileExtension=\".vsx\" mimeType=\"application/vnd.visio\" />\n      <mimeMap fileExtension=\".vtx\" mimeType=\"application/vnd.visio\" />\n      <mimeMap fileExtension=\".wav\" mimeType=\"audio/wav\" />\n      <mimeMap fileExtension=\".wax\" mimeType=\"audio/x-ms-wax\" />\n      <mimeMap fileExtension=\".wbmp\" mimeType=\"image/vnd.wap.wbmp\" />\n      <mimeMap fileExtension=\".wcm\" mimeType=\"application/vnd.ms-works\" />\n      <mimeMap fileExtension=\".wdb\" mimeType=\"application/vnd.ms-works\" />\n      <mimeMap fileExtension=\".webm\" mimeType=\"video/webm\" />\n      <mimeMap fileExtension=\".wks\" mimeType=\"application/vnd.ms-works\" />\n      <mimeMap fileExtension=\".wm\" mimeType=\"video/x-ms-wm\" />\n      <mimeMap fileExtension=\".wma\" mimeType=\"audio/x-ms-wma\" />\n      <mimeMap fileExtension=\".wmd\" mimeType=\"application/x-ms-wmd\" />\n      <mimeMap fileExtension=\".wmf\" mimeType=\"application/x-msmetafile\" />\n      <mimeMap fileExtension=\".wml\" mimeType=\"text/vnd.wap.wml\" />\n      <mimeMap fileExtension=\".wmlc\" mimeType=\"application/vnd.wap.wmlc\" />\n      <mimeMap fileExtension=\".wmls\" mimeType=\"text/vnd.wap.wmlscript\" />\n      <mimeMap fileExtension=\".wmlsc\" mimeType=\"application/vnd.wap.wmlscriptc\" />\n      <mimeMap fileExtension=\".wmp\" mimeType=\"video/x-ms-wmp\" />\n      <mimeMap fileExtension=\".wmv\" mimeType=\"video/x-ms-wmv\" />\n      <mimeMap fileExtension=\".wmx\" mimeType=\"video/x-ms-wmx\" />\n      <mimeMap fileExtension=\".wmz\" mimeType=\"application/x-ms-wmz\" />\n      <mimeMap fileExtension=\".woff\" mimeType=\"font/x-woff\" />\n      <mimeMap fileExtension=\".woff2\" mimeType=\"application/font-woff2\" />\n      <mimeMap fileExtension=\".wps\" mimeType=\"application/vnd.ms-works\" />\n      <mimeMap fileExtension=\".wri\" mimeType=\"application/x-mswrite\" />\n      <mimeMap fileExtension=\".wrl\" mimeType=\"x-world/x-vrml\" />\n      <mimeMap fileExtension=\".wrz\" mimeType=\"x-world/x-vrml\" />\n      <mimeMap fileExtension=\".wsdl\" mimeType=\"text/xml\" />\n      <mimeMap fileExtension=\".wtv\" mimeType=\"video/x-ms-wtv\" />\n      <mimeMap fileExtension=\".wvx\" mimeType=\"video/x-ms-wvx\" />\n      <mimeMap fileExtension=\".x\" mimeType=\"application/directx\" />\n      <mimeMap fileExtension=\".xaf\" mimeType=\"x-world/x-vrml\" />\n      <mimeMap fileExtension=\".xaml\" mimeType=\"application/xaml+xml\" />\n      <mimeMap fileExtension=\".xap\" mimeType=\"application/x-silverlight-app\" />\n      <mimeMap fileExtension=\".xbap\" mimeType=\"application/x-ms-xbap\" />\n      <mimeMap fileExtension=\".xbm\" mimeType=\"image/x-xbitmap\" />\n      <mimeMap fileExtension=\".xdr\" mimeType=\"text/plain\" />\n      <mimeMap fileExtension=\".xht\" mimeType=\"application/xhtml+xml\" />\n      <mimeMap fileExtension=\".xhtml\" mimeType=\"application/xhtml+xml\" />\n      <mimeMap fileExtension=\".xla\" mimeType=\"application/vnd.ms-excel\" />\n      <mimeMap fileExtension=\".xlam\" mimeType=\"application/vnd.ms-excel.addin.macroEnabled.12\" />\n      <mimeMap fileExtension=\".xlc\" mimeType=\"application/vnd.ms-excel\" />\n      <mimeMap fileExtension=\".xlm\" mimeType=\"application/vnd.ms-excel\" />\n      <mimeMap fileExtension=\".xls\" mimeType=\"application/vnd.ms-excel\" />\n      <mimeMap fileExtension=\".xlsb\" mimeType=\"application/vnd.ms-excel.sheet.binary.macroEnabled.12\" />\n      <mimeMap fileExtension=\".xlsm\" mimeType=\"application/vnd.ms-excel.sheet.macroEnabled.12\" />\n      <mimeMap fileExtension=\".xlsx\" mimeType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\" />\n      <mimeMap fileExtension=\".xlt\" mimeType=\"application/vnd.ms-excel\" />\n      <mimeMap fileExtension=\".xltm\" mimeType=\"application/vnd.ms-excel.template.macroEnabled.12\" />\n      <mimeMap fileExtension=\".xltx\" mimeType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.template\" />\n      <mimeMap fileExtension=\".xlw\" mimeType=\"application/vnd.ms-excel\" />\n      <mimeMap fileExtension=\".xml\" mimeType=\"text/xml\" />\n      <mimeMap fileExtension=\".xof\" mimeType=\"x-world/x-vrml\" />\n      <mimeMap fileExtension=\".xpm\" mimeType=\"image/x-xpixmap\" />\n      <mimeMap fileExtension=\".xps\" mimeType=\"application/vnd.ms-xpsdocument\" />\n      <mimeMap fileExtension=\".xsd\" mimeType=\"text/xml\" />\n      <mimeMap fileExtension=\".xsf\" mimeType=\"text/xml\" />\n      <mimeMap fileExtension=\".xsl\" mimeType=\"text/xml\" />\n      <mimeMap fileExtension=\".xslt\" mimeType=\"text/xml\" />\n      <mimeMap fileExtension=\".xsn\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".xtp\" mimeType=\"application/octet-stream\" />\n      <mimeMap fileExtension=\".xwd\" mimeType=\"image/x-xwindowdump\" />\n      <mimeMap fileExtension=\".z\" mimeType=\"application/x-compress\" />\n      <mimeMap fileExtension=\".zip\" mimeType=\"application/x-zip-compressed\" />\n    </staticContent>\n    <tracing>\n      <traceProviderDefinitions>\n        <add name=\"WWW Server\" guid=\"{3a2a4e84-4c21-4981-ae10-3fda0d9b0f83}\">\n          <areas>\n            <clear />\n            <add name=\"Authentication\" value=\"2\" />\n            <add name=\"Security\" value=\"4\" />\n            <add name=\"Filter\" value=\"8\" />\n            <add name=\"StaticFile\" value=\"16\" />\n            <add name=\"CGI\" value=\"32\" />\n            <add name=\"Compression\" value=\"64\" />\n            <add name=\"Cache\" value=\"128\" />\n            <add name=\"RequestNotifications\" value=\"256\" />\n            <add name=\"Module\" value=\"512\" />\n            <add name=\"Rewrite\" value=\"1024\" />\n            <add name=\"FastCGI\" value=\"4096\" />\n            <add name=\"WebSocket\" value=\"16384\" />\n          </areas>\n        </add>\n        <add name=\"ASP\" guid=\"{06b94d9a-b15e-456e-a4ef-37c984a2cb4b}\">\n          <areas>\n            <clear />\n          </areas>\n        </add>\n        <add name=\"ISAPI Extension\" guid=\"{a1c2040e-8840-4c31-ba11-9871031a19ea}\">\n          <areas>\n            <clear />\n          </areas>\n        </add>\n        <add name=\"ASPNET\" guid=\"{AFF081FE-0247-4275-9C4E-021F3DC1DA35}\">\n          <areas>\n            <add name=\"Infrastructure\" value=\"1\" />\n            <add name=\"Module\" value=\"2\" />\n            <add name=\"Page\" value=\"4\" />\n            <add name=\"AppServices\" value=\"8\" />\n          </areas>\n        </add>\n      </traceProviderDefinitions>\n      <traceFailedRequests>\n        <add path=\"*\">\n          <traceAreas>\n            <add provider=\"ASP\" verbosity=\"Verbose\" />\n            <add provider=\"ASPNET\" areas=\"Infrastructure,Module,Page,AppServices\" verbosity=\"Verbose\" />\n            <add provider=\"ISAPI Extension\" verbosity=\"Verbose\" />\n            <add provider=\"WWW Server\" areas=\"Authentication,Security,Filter,StaticFile,CGI,Compression,Cache,RequestNotifications,Module,Rewrite,WebSocket\" verbosity=\"Verbose\" />\n          </traceAreas>\n          <failureDefinitions statusCodes=\"200-999\" />\n        </add>\n      </traceFailedRequests>\n    </tracing>\n    <urlCompression />\n    <validation />\n    <webdav>\n      <globalSettings>\n        <propertyStores>\n          <add name=\"webdav_simple_prop\" image=\"%IIS_BIN%\\webdav_simple_prop.dll\" image32=\"%IIS_BIN%\\webdav_simple_prop.dll\" />\n        </propertyStores>\n        <lockStores>\n          <add name=\"webdav_simple_lock\" image=\"%IIS_BIN%\\webdav_simple_lock.dll\" image32=\"%IIS_BIN%\\webdav_simple_lock.dll\" />\n        </lockStores>\n      </globalSettings>\n      <authoring>\n        <locks enabled=\"true\" lockStore=\"webdav_simple_lock\" />\n      </authoring>\n      <authoringRules />\n    </webdav>\n    <webSocket />\n    <applicationInitialization />\n  </system.webServer>\n  <location path=\"\" overrideMode=\"Allow\">\n    <system.webServer>\n      <modules>\n        <add name=\"IsapiFilterModule\" lockItem=\"true\" />\n        <add name=\"BasicAuthenticationModule\" lockItem=\"true\" />\n        <add name=\"IsapiModule\" lockItem=\"true\" />\n        <add name=\"HttpLoggingModule\" lockItem=\"true\" />\n        <!--\n                <add name=\"HttpCacheModule\" lockItem=\"true\" />\n-->\n        <add name=\"DynamicCompressionModule\" lockItem=\"true\" />\n        <add name=\"StaticCompressionModule\" lockItem=\"true\" />\n        <add name=\"DefaultDocumentModule\" lockItem=\"true\" />\n        <add name=\"DirectoryListingModule\" lockItem=\"true\" />\n        <add name=\"ProtocolSupportModule\" lockItem=\"true\" />\n        <add name=\"HttpRedirectionModule\" lockItem=\"true\" />\n        <add name=\"ServerSideIncludeModule\" lockItem=\"true\" />\n        <add name=\"StaticFileModule\" lockItem=\"true\" />\n        <add name=\"AnonymousAuthenticationModule\" lockItem=\"true\" />\n        <add name=\"CertificateMappingAuthenticationModule\" lockItem=\"true\" />\n        <add name=\"UrlAuthorizationModule\" lockItem=\"true\" />\n        <add name=\"WindowsAuthenticationModule\" lockItem=\"true\" />\n        <!--\n                <add name=\"DigestAuthenticationModule\" lockItem=\"true\" />\n-->\n        <add name=\"IISCertificateMappingAuthenticationModule\" lockItem=\"true\" />\n        <add name=\"WebMatrixSupportModule\" lockItem=\"true\" />\n        <add name=\"IpRestrictionModule\" lockItem=\"true\" />\n        <add name=\"DynamicIpRestrictionModule\" lockItem=\"true\" />\n        <add name=\"RequestFilteringModule\" lockItem=\"true\" />\n        <add name=\"CustomLoggingModule\" lockItem=\"true\" />\n        <add name=\"CustomErrorModule\" lockItem=\"true\" />\n        <add name=\"FailedRequestsTracingModule\" lockItem=\"true\" />\n        <add name=\"CgiModule\" lockItem=\"true\" />\n        <add name=\"FastCgiModule\" lockItem=\"true\" />\n        <!--                <add name=\"WebDAVModule\" /> -->\n        <add name=\"RewriteModule\" />\n        <add name=\"OutputCache\" type=\"System.Web.Caching.OutputCacheModule\" preCondition=\"managedHandler\" />\n        <add name=\"Session\" type=\"System.Web.SessionState.SessionStateModule\" preCondition=\"managedHandler\" />\n        <add name=\"WindowsAuthentication\" type=\"System.Web.Security.WindowsAuthenticationModule\" preCondition=\"managedHandler\" />\n        <add name=\"FormsAuthentication\" type=\"System.Web.Security.FormsAuthenticationModule\" preCondition=\"managedHandler\" />\n        <add name=\"DefaultAuthentication\" type=\"System.Web.Security.DefaultAuthenticationModule\" preCondition=\"managedHandler\" />\n        <add name=\"RoleManager\" type=\"System.Web.Security.RoleManagerModule\" preCondition=\"managedHandler\" />\n        <add name=\"UrlAuthorization\" type=\"System.Web.Security.UrlAuthorizationModule\" preCondition=\"managedHandler\" />\n        <add name=\"FileAuthorization\" type=\"System.Web.Security.FileAuthorizationModule\" preCondition=\"managedHandler\" />\n        <add name=\"AnonymousIdentification\" type=\"System.Web.Security.AnonymousIdentificationModule\" preCondition=\"managedHandler\" />\n        <add name=\"Profile\" type=\"System.Web.Profile.ProfileModule\" preCondition=\"managedHandler\" />\n        <add name=\"UrlMappingsModule\" type=\"System.Web.UrlMappingsModule\" preCondition=\"managedHandler\" />\n        <add name=\"ConfigurationValidationModule\" lockItem=\"true\" />\n        <add name=\"WebSocketModule\" lockItem=\"true\" />\n        <add name=\"ServiceModel-4.0\" type=\"System.ServiceModel.Activation.ServiceHttpModule,System.ServiceModel.Activation,Version=4.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35\" preCondition=\"managedHandler,runtimeVersionv4.0\" />\n        <add name=\"UrlRoutingModule-4.0\" type=\"System.Web.Routing.UrlRoutingModule\" preCondition=\"managedHandler,runtimeVersionv4.0\" />\n        <add name=\"ScriptModule-4.0\" type=\"System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\" preCondition=\"managedHandler,runtimeVersionv4.0\" />\n        <add name=\"ServiceModel\" type=\"System.ServiceModel.Activation.HttpModule, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" preCondition=\"managedHandler,runtimeVersionv2.0\" />\n        <add name=\"ApplicationInitializationModule\" lockItem=\"true\" />\n        <add name=\"AspNetCoreModule\" lockItem=\"true\" />\n      </modules>\n      <handlers accessPolicy=\"Read, Script\">\n        <!--                <add name=\"WebDAV\" path=\"*\" verb=\"PROPFIND,PROPPATCH,MKCOL,PUT,COPY,DELETE,MOVE,LOCK,UNLOCK\" modules=\"WebDAVModule\" resourceType=\"Unspecified\" requireAccess=\"None\" /> -->\n        <add name=\"AXD-ISAPI-4.0_64bit\" path=\"*.axd\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework64\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness64\" responseBufferLimit=\"0\" />\n        <add name=\"PageHandlerFactory-ISAPI-4.0_64bit\" path=\"*.aspx\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework64\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness64\" responseBufferLimit=\"0\" />\n        <add name=\"SimpleHandlerFactory-ISAPI-4.0_64bit\" path=\"*.ashx\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework64\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness64\" responseBufferLimit=\"0\" />\n        <add name=\"WebServiceHandlerFactory-ISAPI-4.0_64bit\" path=\"*.asmx\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework64\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness64\" responseBufferLimit=\"0\" />\n        <add name=\"HttpRemotingHandlerFactory-rem-ISAPI-4.0_64bit\" path=\"*.rem\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework64\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness64\" responseBufferLimit=\"0\" />\n        <add name=\"HttpRemotingHandlerFactory-soap-ISAPI-4.0_64bit\" path=\"*.soap\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework64\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness64\" responseBufferLimit=\"0\" />\n        <add name=\"svc-ISAPI-4.0_64bit\" path=\"*.svc\" verb=\"*\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework64\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness64\" />\n        <add name=\"rules-ISAPI-4.0_64bit\" path=\"*.rules\" verb=\"*\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework64\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness64\" />\n        <add name=\"xoml-ISAPI-4.0_64bit\" path=\"*.xoml\" verb=\"*\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework64\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness64\" />\n        <add name=\"xamlx-ISAPI-4.0_64bit\" path=\"*.xamlx\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework64\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness64\" />\n        <add name=\"aspq-ISAPI-4.0_64bit\" path=\"*.aspq\" verb=\"*\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework64\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness64\" responseBufferLimit=\"0\" />\n        <add name=\"cshtm-ISAPI-4.0_64bit\" path=\"*.cshtm\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework64\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness64\" responseBufferLimit=\"0\" />\n        <add name=\"cshtml-ISAPI-4.0_64bit\" path=\"*.cshtml\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework64\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness64\" responseBufferLimit=\"0\" />\n        <add name=\"vbhtm-ISAPI-4.0_64bit\" path=\"*.vbhtm\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework64\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness64\" responseBufferLimit=\"0\" />\n        <add name=\"vbhtml-ISAPI-4.0_64bit\" path=\"*.vbhtml\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework64\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness64\" responseBufferLimit=\"0\" />\n        <add name=\"svc-Integrated\" path=\"*.svc\" verb=\"*\" type=\"System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" preCondition=\"integratedMode,runtimeVersionv2.0\" />\n        <add name=\"svc-ISAPI-2.0\" path=\"*.svc\" verb=\"*\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework\\v2.0.50727\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv2.0,bitness32\" />\n        <add name=\"xoml-Integrated\" path=\"*.xoml\" verb=\"*\" type=\"System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" preCondition=\"integratedMode,runtimeVersionv2.0\" />\n        <add name=\"xoml-ISAPI-2.0\" path=\"*.xoml\" verb=\"*\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework\\v2.0.50727\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv2.0,bitness32\" />\n        <add name=\"rules-Integrated\" path=\"*.rules\" verb=\"*\" type=\"System.ServiceModel.Activation.HttpHandler, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" preCondition=\"integratedMode,runtimeVersionv2.0\" />\n        <add name=\"rules-ISAPI-2.0\" path=\"*.rules\" verb=\"*\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework\\v2.0.50727\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv2.0,bitness32\" />\n        <add name=\"AXD-ISAPI-4.0_32bit\" path=\"*.axd\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness32\" responseBufferLimit=\"0\" />\n        <add name=\"PageHandlerFactory-ISAPI-4.0_32bit\" path=\"*.aspx\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness32\" responseBufferLimit=\"0\" />\n        <add name=\"SimpleHandlerFactory-ISAPI-4.0_32bit\" path=\"*.ashx\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness32\" responseBufferLimit=\"0\" />\n        <add name=\"WebServiceHandlerFactory-ISAPI-4.0_32bit\" path=\"*.asmx\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness32\" responseBufferLimit=\"0\" />\n        <add name=\"HttpRemotingHandlerFactory-rem-ISAPI-4.0_32bit\" path=\"*.rem\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness32\" responseBufferLimit=\"0\" />\n        <add name=\"HttpRemotingHandlerFactory-soap-ISAPI-4.0_32bit\" path=\"*.soap\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness32\" responseBufferLimit=\"0\" />\n        <add name=\"svc-ISAPI-4.0_32bit\" path=\"*.svc\" verb=\"*\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness32\" />\n        <add name=\"rules-ISAPI-4.0_32bit\" path=\"*.rules\" verb=\"*\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness32\" />\n        <add name=\"xoml-ISAPI-4.0_32bit\" path=\"*.xoml\" verb=\"*\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness32\" />\n        <add name=\"xamlx-ISAPI-4.0_32bit\" path=\"*.xamlx\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness32\" />\n        <add name=\"aspq-ISAPI-4.0_32bit\" path=\"*.aspq\" verb=\"*\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness32\" responseBufferLimit=\"0\" />\n        <add name=\"cshtm-ISAPI-4.0_32bit\" path=\"*.cshtm\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness32\" responseBufferLimit=\"0\" />\n        <add name=\"cshtml-ISAPI-4.0_32bit\" path=\"*.cshtml\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness32\" responseBufferLimit=\"0\" />\n        <add name=\"vbhtm-ISAPI-4.0_32bit\" path=\"*.vbhtm\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness32\" responseBufferLimit=\"0\" />\n        <add name=\"vbhtml-ISAPI-4.0_32bit\" path=\"*.vbhtml\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness32\" responseBufferLimit=\"0\" />\n        <add name=\"TraceHandler-Integrated-4.0\" path=\"trace.axd\" verb=\"GET,HEAD,POST,DEBUG\" type=\"System.Web.Handlers.TraceHandler\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n        <add name=\"WebAdminHandler-Integrated-4.0\" path=\"WebAdmin.axd\" verb=\"GET,DEBUG\" type=\"System.Web.Handlers.WebAdminHandler\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n        <add name=\"AssemblyResourceLoader-Integrated-4.0\" path=\"WebResource.axd\" verb=\"GET,DEBUG\" type=\"System.Web.Handlers.AssemblyResourceLoader\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n        <add name=\"PageHandlerFactory-Integrated-4.0\" path=\"*.aspx\" verb=\"GET,HEAD,POST,DEBUG\" type=\"System.Web.UI.PageHandlerFactory\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n        <add name=\"SimpleHandlerFactory-Integrated-4.0\" path=\"*.ashx\" verb=\"GET,HEAD,POST,DEBUG\" type=\"System.Web.UI.SimpleHandlerFactory\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n        <add name=\"WebServiceHandlerFactory-Integrated-4.0\" path=\"*.asmx\" verb=\"GET,HEAD,POST,DEBUG\" type=\"System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n        <add name=\"HttpRemotingHandlerFactory-rem-Integrated-4.0\" path=\"*.rem\" verb=\"GET,HEAD,POST,DEBUG\" type=\"System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n        <add name=\"HttpRemotingHandlerFactory-soap-Integrated-4.0\" path=\"*.soap\" verb=\"GET,HEAD,POST,DEBUG\" type=\"System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory, System.Runtime.Remoting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n        <add name=\"svc-Integrated-4.0\" path=\"*.svc\" verb=\"*\" type=\"System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n        <add name=\"rules-Integrated-4.0\" path=\"*.rules\" verb=\"*\" type=\"System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n        <add name=\"xoml-Integrated-4.0\" path=\"*.xoml\" verb=\"*\" type=\"System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n        <add name=\"xamlx-Integrated-4.0\" path=\"*.xamlx\" verb=\"GET,HEAD,POST,DEBUG\" type=\"System.Xaml.Hosting.XamlHttpHandlerFactory, System.Xaml.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n        <add name=\"aspq-Integrated-4.0\" path=\"*.aspq\" verb=\"GET,HEAD,POST,DEBUG\" type=\"System.Web.HttpForbiddenHandler\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n        <add name=\"cshtm-Integrated-4.0\" path=\"*.cshtm\" verb=\"GET,HEAD,POST,DEBUG\" type=\"System.Web.HttpForbiddenHandler\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n        <add name=\"cshtml-Integrated-4.0\" path=\"*.cshtml\" verb=\"GET,HEAD,POST,DEBUG\" type=\"System.Web.HttpForbiddenHandler\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n        <add name=\"vbhtm-Integrated-4.0\" path=\"*.vbhtm\" verb=\"GET,HEAD,POST,DEBUG\" type=\"System.Web.HttpForbiddenHandler\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n        <add name=\"vbhtml-Integrated-4.0\" path=\"*.vbhtml\" verb=\"GET,HEAD,POST,DEBUG\" type=\"System.Web.HttpForbiddenHandler\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n        <add name=\"ScriptHandlerFactoryAppServices-Integrated-4.0\" path=\"*_AppService.axd\" verb=\"*\" type=\"System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n        <add name=\"ScriptResourceIntegrated-4.0\" path=\"*ScriptResource.axd\" verb=\"GET,HEAD\" type=\"System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35\" preCondition=\"integratedMode,runtimeVersionv4.0\" />\n        <add name=\"ASPClassic\" path=\"*.asp\" verb=\"GET,HEAD,POST\" modules=\"IsapiModule\" scriptProcessor=\"%IIS_BIN%\\asp.dll\" resourceType=\"File\" />\n        <add name=\"SecurityCertificate\" path=\"*.cer\" verb=\"GET,HEAD,POST\" modules=\"IsapiModule\" scriptProcessor=\"%IIS_BIN%\\asp.dll\" resourceType=\"File\" />\n        <add name=\"ISAPI-dll\" path=\"*.dll\" verb=\"*\" modules=\"IsapiModule\" resourceType=\"File\" requireAccess=\"Execute\" allowPathInfo=\"true\" />\n        <add name=\"TraceHandler-Integrated\" path=\"trace.axd\" verb=\"GET,HEAD,POST,DEBUG\" type=\"System.Web.Handlers.TraceHandler\" preCondition=\"integratedMode,runtimeVersionv2.0\" />\n        <add name=\"WebAdminHandler-Integrated\" path=\"WebAdmin.axd\" verb=\"GET,DEBUG\" type=\"System.Web.Handlers.WebAdminHandler\" preCondition=\"integratedMode,runtimeVersionv2.0\" />\n        <add name=\"AssemblyResourceLoader-Integrated\" path=\"WebResource.axd\" verb=\"GET,DEBUG\" type=\"System.Web.Handlers.AssemblyResourceLoader\" preCondition=\"integratedMode,runtimeVersionv2.0\" />\n        <add name=\"PageHandlerFactory-Integrated\" path=\"*.aspx\" verb=\"GET,HEAD,POST,DEBUG\" type=\"System.Web.UI.PageHandlerFactory\" preCondition=\"integratedMode,runtimeVersionv2.0\" />\n        <add name=\"SimpleHandlerFactory-Integrated\" path=\"*.ashx\" verb=\"GET,HEAD,POST,DEBUG\" type=\"System.Web.UI.SimpleHandlerFactory\" preCondition=\"integratedMode,runtimeVersionv2.0\" />\n        <add name=\"WebServiceHandlerFactory-Integrated\" path=\"*.asmx\" verb=\"GET,HEAD,POST,DEBUG\" type=\"System.Web.Services.Protocols.WebServiceHandlerFactory,System.Web.Services,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a\" preCondition=\"integratedMode,runtimeVersionv2.0\" />\n        <add name=\"HttpRemotingHandlerFactory-rem-Integrated\" path=\"*.rem\" verb=\"GET,HEAD,POST,DEBUG\" type=\"System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory,System.Runtime.Remoting,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089\" preCondition=\"integratedMode,runtimeVersionv2.0\" />\n        <add name=\"HttpRemotingHandlerFactory-soap-Integrated\" path=\"*.soap\" verb=\"GET,HEAD,POST,DEBUG\" type=\"System.Runtime.Remoting.Channels.Http.HttpRemotingHandlerFactory,System.Runtime.Remoting,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089\" preCondition=\"integratedMode,runtimeVersionv2.0\" />\n        <add name=\"AXD-ISAPI-2.0\" path=\"*.axd\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework\\v2.0.50727\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv2.0,bitness32\" responseBufferLimit=\"0\" />\n        <add name=\"PageHandlerFactory-ISAPI-2.0\" path=\"*.aspx\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework\\v2.0.50727\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv2.0,bitness32\" responseBufferLimit=\"0\" />\n        <add name=\"SimpleHandlerFactory-ISAPI-2.0\" path=\"*.ashx\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework\\v2.0.50727\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv2.0,bitness32\" responseBufferLimit=\"0\" />\n        <add name=\"WebServiceHandlerFactory-ISAPI-2.0\" path=\"*.asmx\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework\\v2.0.50727\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv2.0,bitness32\" responseBufferLimit=\"0\" />\n        <add name=\"HttpRemotingHandlerFactory-rem-ISAPI-2.0\" path=\"*.rem\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework\\v2.0.50727\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv2.0,bitness32\" responseBufferLimit=\"0\" />\n        <add name=\"HttpRemotingHandlerFactory-soap-ISAPI-2.0\" path=\"*.soap\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework\\v2.0.50727\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv2.0,bitness32\" responseBufferLimit=\"0\" />\n        <add name=\"svc-ISAPI-2.0-64\" path=\"*.svc\" verb=\"*\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework64\\v2.0.50727\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv2.0,bitness64\" />\n        <add name=\"AXD-ISAPI-2.0-64\" path=\"*.axd\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework64\\v2.0.50727\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv2.0,bitness64\" responseBufferLimit=\"0\" />\n        <add name=\"PageHandlerFactory-ISAPI-2.0-64\" path=\"*.aspx\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework64\\v2.0.50727\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv2.0,bitness64\" responseBufferLimit=\"0\" />\n        <add name=\"SimpleHandlerFactory-ISAPI-2.0-64\" path=\"*.ashx\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework64\\v2.0.50727\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv2.0,bitness64\" responseBufferLimit=\"0\" />\n        <add name=\"WebServiceHandlerFactory-ISAPI-2.0-64\" path=\"*.asmx\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework64\\v2.0.50727\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv2.0,bitness64\" responseBufferLimit=\"0\" />\n        <add name=\"HttpRemotingHandlerFactory-rem-ISAPI-2.0-64\" path=\"*.rem\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework64\\v2.0.50727\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv2.0,bitness64\" responseBufferLimit=\"0\" />\n        <add name=\"HttpRemotingHandlerFactory-soap-ISAPI-2.0-64\" path=\"*.soap\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework64\\v2.0.50727\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv2.0,bitness64\" responseBufferLimit=\"0\" />\n        <add name=\"rules-64-ISAPI-2.0\" path=\"*.rules\" verb=\"*\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework64\\v2.0.50727\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv2.0,bitness64\" />\n        <add name=\"xoml-64-ISAPI-2.0\" path=\"*.xoml\" verb=\"*\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework64\\v2.0.50727\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv2.0,bitness64\" />\n        <add name=\"CGI-exe\" path=\"*.exe\" verb=\"*\" modules=\"CgiModule\" resourceType=\"File\" requireAccess=\"Execute\" allowPathInfo=\"true\" />\n        <add name=\"SSINC-stm\" path=\"*.stm\" verb=\"GET,HEAD,POST\" modules=\"ServerSideIncludeModule\" resourceType=\"File\" />\n        <add name=\"SSINC-shtm\" path=\"*.shtm\" verb=\"GET,HEAD,POST\" modules=\"ServerSideIncludeModule\" resourceType=\"File\" />\n        <add name=\"SSINC-shtml\" path=\"*.shtml\" verb=\"GET,HEAD,POST\" modules=\"ServerSideIncludeModule\" resourceType=\"File\" />\n        <add name=\"TRACEVerbHandler\" path=\"*\" verb=\"TRACE\" modules=\"ProtocolSupportModule\" requireAccess=\"None\" />\n        <add name=\"OPTIONSVerbHandler\" path=\"*\" verb=\"OPTIONS\" modules=\"ProtocolSupportModule\" requireAccess=\"None\" />\n        <add name=\"ExtensionlessUrl-ISAPI-4.0_32bit\" path=\"*.\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness32\" responseBufferLimit=\"0\" />\n        <add name=\"ExtensionlessUrlHandler-ISAPI-4.0_64bit\" path=\"*.\" verb=\"GET,HEAD,POST,DEBUG\" modules=\"IsapiModule\" scriptProcessor=\"%windir%\\Microsoft.NET\\Framework64\\v4.0.30319\\aspnet_isapi.dll\" preCondition=\"classicMode,runtimeVersionv4.0,bitness64\" responseBufferLimit=\"0\" />\n        <add name=\"ExtensionlessUrl-Integrated-4.0\" path=\"*.\" verb=\"GET,HEAD,POST,DEBUG\" type=\"System.Web.Handlers.TransferRequestHandler\" preCondition=\"integratedMode,runtimeVersionv4.0\" responseBufferLimit=\"0\" />\n        <add name=\"StaticFile\" path=\"*\" verb=\"*\" modules=\"StaticFileModule,DefaultDocumentModule,DirectoryListingModule\" resourceType=\"Either\" requireAccess=\"Read\" />\n      </handlers>\n    </system.webServer>\n  </location>\n  <location path=\"Sodao.Core.Web\">\n    <system.webServer>\n      <handlers>\n        <add name=\"aspNetCore\" path=\"*\" verb=\"*\" modules=\"AspNetCoreModule\" resourceType=\"Unspecified\" />\n      </handlers>\n      <aspNetCore processPath=\"%LAUNCHER_PATH%\" arguments=\"%LAUNCHER_ARGS%\" forwardWindowsAuthToken=\"false\" stdoutLogEnabled=\"false\" />\n      <httpCompression>\n        <dynamicCompression>\n          <add mimeType=\"text/event-stream\" enabled=\"false\" />\n        </dynamicCompression>\n      </httpCompression>\n    </system.webServer>\n  </location>\n</configuration>"
  },
  {
    "path": "src/Overt.Core.Data/Attribute/SubmeterAttribute.cs",
    "content": "﻿using System;\n\nnamespace Overt.Core.Data\n{\n    /// <summary>\n    /// 分表标识\n    /// </summary>\n    [Obsolete(\"请使用TableNameFunc\")]\n    public class SubmeterAttribute : Attribute\n    {\n        /// <summary>\n        /// 16进制位数\n        /// 1 16\n        /// 2 256\n        /// 3 4096 \n        /// ...\n        /// </summary>\n        public int Bit { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Constants.cs",
    "content": "﻿namespace Overt.Core.Data\n{\n    internal class Constants\n    {\n        public static class MSSQLVersion\n        {\n            /// <summary>\n            /// SQLServer2012版本\n            /// </summary>\n            public const int SQLServer2012Bv = 11;\n        }\n\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Contract/IBaseRepository.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.Linq.Expressions;\nusing System.Threading.Tasks;\n\nnamespace Overt.Core.Data\n{\n    /// <summary>\n    /// 接口\n    /// </summary>\n    public interface IBaseRepository<TEntity> : IPropertyAssist where TEntity : class, new()\n    {\n        #region Sync Method\n        /// <summary>\n        /// 获取主表名\n        /// </summary>\n        /// <returns></returns>\n        string GetMainTableName();\n\n        /// <summary>\n        /// 获取表名:内部会调用TableNameFunc 从主库中查询\n        /// </summary>\n        /// <returns></returns>\n        string GetTableName();\n\n        /// <summary>\n        /// 获取表名：以Submeter分表位数获取表名\n        /// </summary>\n        /// <param name=\"key\"></param>\n        /// <returns></returns>\n        [Obsolete(\"请使用GetTableName\")]\n        string GetTableName(string key);\n\n        /// <summary>\n        /// 是否存在表\n        /// </summary>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"isMaster\"></param>\n        /// <returns></returns>\n        bool IsExistTable(string tableName, bool isMaster = true);\n\n        /// <summary>\n        /// 是否存在字段\n        /// </summary>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"isMaster\"></param>\n        /// <returns></returns>\n        bool IsExistField(string tableName, string fieldName, bool isMaster = true);\n\n        /// <summary>\n        /// 添加\n        /// </summary>\n        /// <param name=\"entity\">数据实体</param>\n        /// <param name=\"returnLastIdentity\">是否赋值最后一次的自增ID</param>\n        /// <returns>添加后的数据实体</returns>\n        bool Add(TEntity entity, bool returnLastIdentity = false);\n\n        /// <summary>\n        /// 批量添加\n        /// </summary>\n        /// <param name=\"entities\">数据实体</param>\n        /// <returns>bool</returns>\n        bool Add(params TEntity[] entities);\n\n        /// <summary>\n        /// 删除\n        /// </summary>\n        /// <param name=\"expression\">删除条件</param>\n        /// <returns>是否成功</returns>\n        bool Delete(Expression<Func<TEntity, bool>> expression);\n\n        /// <summary>\n        /// 更新\n        /// </summary>\n        /// <param name=\"entity\">数据实体</param>\n        /// <param name=\"fields\">x=> x.SomeProperty1 or x=> new { x.SomeProperty1, x.SomeProperty2 }</param>\n        /// <returns>是否成功</returns>\n        bool Set(TEntity entity, Expression<Func<TEntity, object>> fields = null);\n\n        /// <summary>\n        /// 根据字段修改\n        /// </summary>\n        /// <param name=\"setExpress\">修改字段表达式 object =>dynamic 是一个匿名类</param>\n        /// <param name=\"whereExpress\">条件表达式</param>\n        /// <returns>是否成功</returns>\n        bool Set(Expression<Func<object>> setExpress, Expression<Func<TEntity, bool>> whereExpress);\n\n        /// <summary>\n        /// 根据条件 在原字段上增减数据\n        /// </summary>\n        /// <param name=\"field\">增减的字段</param>\n        /// <param name=\"value\">增减的值</param>\n        /// <param name=\"whereExpress\">条件表达式</param>\n        /// <returns></returns>\n        bool Incr<TValue>(string field, TValue value, Expression<Func<TEntity, bool>> whereExpress) where TValue : struct;\n\n        /// <summary>\n        /// 获取一条数据\n        /// </summary>\n        /// <param name=\"expression\">查询条件</param>\n        /// <param name=\"fieldExpressison\">按字段返回</param>\n        /// <param name=\"isMaster\">是否主从</param>\n        /// <returns>实体</returns>\n        TEntity Get(Expression<Func<TEntity, bool>> expression, Expression<Func<TEntity, object>> fieldExpressison = null, bool isMaster = false);\n\n        /// <summary>\n        /// 获取列表 \n        /// </summary>\n        /// <param name=\"page\"></param>\n        /// <param name=\"rows\"></param>\n        /// <param name=\"expression\">条件表达式</param>\n        /// <param name=\"fieldExpressison\">按字段返回</param>\n        /// <param name=\"isMaster\">是否主从</param>\n        /// <param name=\"orderByFields\">排序字段集合</param>\n        /// <returns></returns>\n        IEnumerable<TEntity> GetList(int page, int rows, Expression<Func<TEntity, bool>> expression = null, Expression<Func<TEntity, object>> fieldExpressison = null, bool isMaster = false, params OrderByField[] orderByFields);\n\n        /// <summary>\n        /// 获取列表 Offset\n        /// </summary>\n        /// <param name=\"offset\"></param>\n        /// <param name=\"size\"></param>\n        /// <param name=\"expression\">条件表达式</param>\n        /// <param name=\"fieldExpressison\">按字段返回</param>\n        /// <param name=\"isMaster\">是否主从</param>\n        /// <param name=\"orderByFields\">排序字段集合</param>\n        /// <returns></returns>\n        IEnumerable<TEntity> GetOffsets(int offset, int size, Expression<Func<TEntity, bool>> expression = null, Expression<Func<TEntity, object>> fieldExpressison = null, bool isMaster = false, params OrderByField[] orderByFields);\n\n        /// <summary>\n        /// 获取数量\n        /// </summary>\n        /// <param name=\"expression\">条件表达式</param>\n        /// <param name=\"isMaster\">是否主从</param>\n        /// <returns></returns>\n        int Count(Expression<Func<TEntity, bool>> expression = null, bool isMaster = false);\n        #endregion\n\n        #region Async Method\n        /// <summary>\n        /// 是否存在表\n        /// </summary>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"isMaster\"></param>\n        /// <returns></returns>\n        Task<bool> IsExistTableAsync(string tableName, bool isMaster = true);\n\n        /// <summary>\n        /// 是否存在字段\n        /// </summary>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"isMaster\"></param>\n        /// <returns></returns>\n        Task<bool> IsExistFieldAsync(string tableName, string fieldName, bool isMaster = true);\n\n        /// <summary>\n        /// 异步添加\n        /// </summary>\n        /// <param name=\"entity\"></param>\n        /// <param name=\"returnLastIdentity\">是否赋值最后一次的自增ID</param>\n        /// <returns></returns>\n        Task<bool> AddAsync(TEntity entity, bool returnLastIdentity = false);\n\n        /// <summary>\n        /// 异步批量添加\n        /// </summary>\n        /// <param name=\"entities\">数据实体</param>\n        /// <returns>bool</returns>\n        /// <returns></returns>\n        Task<bool> AddAsync(params TEntity[] entities);\n\n        /// <summary>\n        /// 异步删除\n        /// </summary>\n        /// <param name=\"expression\">删除条件</param>\n        /// <returns>是否成功</returns>\n        Task<bool> DeleteAsync(Expression<Func<TEntity, bool>> expression);\n\n        /// <summary>\n        /// 异步更新\n        /// </summary>\n        /// <param name=\"entity\">数据实体</param>\n        /// <param name=\"fields\">x=> x.SomeProperty1 or x=> new { x.SomeProperty1, x.SomeProperty2 }</param>\n        /// <returns>是否成功</returns>\n        Task<bool> SetAsync(TEntity entity, Expression<Func<TEntity, object>> fields = null);\n\n        /// <summary>\n        /// 异步根据字段修改\n        /// </summary>\n        /// <param name=\"setExpress\">修改字段表达式</param>\n        /// <param name=\"whereExpress\">条件表达式</param>\n        /// <returns>是否成功</returns>\n        Task<bool> SetAsync(Expression<Func<object>> setExpress, Expression<Func<TEntity, bool>> whereExpress);\n\n        /// <summary>\n        /// 根据条件 在原字段上增减数据\n        /// </summary>\n        /// <param name=\"field\">增减的字段</param>\n        /// <param name=\"value\">增减的值</param>\n        /// <param name=\"whereExpress\">条件表达式</param>\n        /// <returns></returns>\n        Task<bool> IncrAsync<TValue>(string field, TValue value, Expression<Func<TEntity, bool>> whereExpress) where TValue : struct;\n\n        /// <summary>\n        /// 异步获取一条数据\n        /// </summary>\n        /// <param name=\"expression\">查询条件</param>\n        /// <param name=\"fieldExpressison\">按字段返回</param>\n        /// <param name=\"isMaster\">是否主从</param>\n        /// <returns>实体</returns>\n        Task<TEntity> GetAsync(Expression<Func<TEntity, bool>> expression, Expression<Func<TEntity, object>> fieldExpressison = null, bool isMaster = false);\n\n        /// <summary>\n        /// 异步获取列表\n        /// </summary>\n        /// <param name=\"page\"></param>\n        /// <param name=\"rows\"></param>\n        /// <param name=\"expression\">条件表达式</param>\n        /// <param name=\"fieldExpressison\">按字段返回</param>\n        /// <param name=\"isMaster\">是否主从</param>\n        /// <param name=\"orderByFields\">排序字段集合</param>\n        /// <returns></returns>\n        Task<IEnumerable<TEntity>> GetListAsync(int page, int rows, Expression<Func<TEntity, bool>> expression = null, Expression<Func<TEntity, object>> fieldExpressison = null, bool isMaster = false, params OrderByField[] orderByFields);\n\n        /// <summary>\n        /// 异步获取列表 Offset\n        /// </summary>\n        /// <param name=\"offset\"></param>\n        /// <param name=\"size\"></param>\n        /// <param name=\"expression\">条件表达式</param>\n        /// <param name=\"fieldExpressison\">按字段返回</param>\n        /// <param name=\"isMaster\">是否主从</param>\n        /// <param name=\"orderByFields\">排序字段集合</param>\n        /// <returns></returns>\n        Task<IEnumerable<TEntity>> GetOffsetsAsync(int offset, int size, Expression<Func<TEntity, bool>> expression = null, Expression<Func<TEntity, object>> fieldExpressison = null, bool isMaster = false, params OrderByField[] orderByFields);\n\n        /// <summary>\n        /// 异步获取数量\n        /// </summary>\n        /// <param name=\"expression\">条件表达式</param>\n        /// <param name=\"isMaster\">是否主从</param>\n        /// <returns></returns>\n        Task<int> CountAsync(Expression<Func<TEntity, bool>> expression = null, bool isMaster = false);\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Contract/IPropertyAssist.cs",
    "content": "﻿using System;\nusing System.Data;\n#if !ASP_NET_CORE\nusing System.Configuration;\n#endif\n\nnamespace Overt.Core.Data\n{\n    /// <summary>\n    /// 通用的接口\n    /// </summary>\n    public interface IPropertyAssist\n    {\n        #region DbStoreKey\n        /// <summary>\n        /// 数据库key\n        /// </summary>\n        string DbStoreKey { get; set; }\n        #endregion\n\n        #region TableName\n        /// <summary>\n        /// 表名生成方法\n        /// </summary>\n        Func<string> TableNameFunc { get; set; }\n\n        /// <summary>\n        /// 创建表的sql语句\n        /// 参数：表名\n        /// </summary>\n        Func<string, string> CreateScriptFunc { get; set; }\n        #endregion\n\n        #region ConnectionString\n        /// <summary>\n        /// 连接方法创建\n        /// </summary>\n\n#if ASP_NET_CORE\n        Func<bool, string> ConnectionFunc { get; set; }\n#else\n        Func<bool, ConnectionStringSettings> ConnectionFunc { get; set; }\n#endif\n        #endregion\n\n        #region Connection\n        /// <summary>\n        /// 打开连接\n        /// </summary>\n        /// <returns></returns>\n        IDbConnection OpenConnection(bool isMaster = false);\n        #endregion\n\n        #region ExecuteScript\n        /// <summary>\n        /// 执行的sql脚本\n        /// </summary>\n        string ExecuteScript { get; set; }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/DataContext/DataContext.cs",
    "content": "﻿#if ASP_NET_CORE\nusing Microsoft.Extensions.Configuration;\nusing System.IO;\n#endif\nusing MySql.Data.MySqlClient;\nusing System;\n#if !ASP_NET_CORE\nusing System.Configuration;\n#endif\nusing System.Data;\nusing System.Data.Common;\nusing System.Data.SqlClient;\n\nnamespace Overt.Core.Data\n{\n    /// <summary>\n    /// 数据库连接工具类\n    /// </summary>\n    public class DataContext : IDisposable\n    {\n        #region Private Members\n        readonly bool _isMaster;\n        readonly string _dbStoreKey;\n        DbProviderFactory _dbFactory;\n\n#if ASP_NET_CORE\n        readonly IConfiguration _configuration;\n        readonly Func<bool, string> _connectionFunc;\n#else\n        readonly Func<bool, ConnectionStringSettings> _connectionFunc;\n#endif\n\n\n        #endregion\n\n        #region Public Members\n        /// <summary>\n        /// 连接对象\n        /// </summary>\n        public IDbConnection DbConnection { get; private set; }\n        #endregion\n\n        #region Constructor\n#if ASP_NET_CORE\n        /// <summary>\n        /// 构造函数\n        /// </summary>\n        /// <param name=\"configuration\">if null 则从appsettings.json中获取</param>\n        /// <param name=\"isMaster\">是否从库</param>\n        /// <param name=\"dbStoreKey\">存储字符串标识</param>\n        /// <param name=\"connectionFunc\">连接字符串Func</param>\n        public DataContext(IConfiguration configuration, bool isMaster = false, string dbStoreKey = \"\", Func<bool, string> connectionFunc = null)\n        {\n            _configuration = configuration;\n            _isMaster = isMaster;\n            _dbStoreKey = dbStoreKey;\n            _connectionFunc = connectionFunc;\n\n            // 打开连接\n            CreateAndOpen();\n        }\n#else\n        /// <summary>\n        /// 构造函数\n        /// </summary>\n        /// <param name=\"isMaster\">是否从库</param>\n        /// <param name=\"dbStoreKey\">存储字符串标识</param>\n        /// <param name=\"connectionFunc\">连接字符串Func</param>\n        public DataContext(bool isMaster = false, string dbStoreKey = \"\", Func<bool, ConnectionStringSettings> connectionFunc = null)\n        {\n            _isMaster = isMaster;\n            _dbStoreKey = dbStoreKey;\n            _connectionFunc = connectionFunc;\n\n            // 打开连接\n            CreateAndOpen();\n        }\n#endif\n        #endregion\n\n        #region Private Method\n        /// <summary>\n        /// 打开链接\n        /// </summary>\n        private void CreateAndOpen()\n        {\n            var connectionString = string.Empty;\n            var settings = DataSettings.Default;\n\n            // 获取连接\n#if ASP_NET_CORE\n            var connectionSetting = settings.Get(_configuration, _isMaster, _dbStoreKey, _connectionFunc);\n            connectionString = connectionSetting.Item1;\n            _dbFactory = GetFactory(connectionSetting.Item2);\n#else\n            var connectionSetting = settings.Get(_isMaster, _dbStoreKey, _connectionFunc);\n            connectionString = connectionSetting?.ConnectionString;\n            _dbFactory = DbProviderFactories.GetFactory(connectionSetting?.ProviderName);\n#endif\n\n            if (string.IsNullOrEmpty(connectionString))\n                throw new Exception($\"连接字符串获取为空，请检查Repository是否指定了dbStoreKey以及检查配置文件是否存在\");\n\n            DbConnection = _dbFactory.CreateConnection();\n            DbConnection.ConnectionString = connectionString;\n            if (DbConnection.State != ConnectionState.Open)\n                DbConnection.Open();\n        }\n\n        /// <summary>\n        /// 获取Factory\n        /// </summary>\n        /// <param name=\"dbType\"></param>\n        /// <returns></returns>\n        private DbProviderFactory GetFactory(DatabaseType dbType)\n        {\n            switch (dbType)\n            {\n                case DatabaseType.SqlServer:\n                case DatabaseType.GteSqlServer2012:\n                    return SqlClientFactory.Instance;\n                case DatabaseType.MySql:\n                    return MySqlClientFactory.Instance;\n                case DatabaseType.PostgreSQL:\n                    return Npgsql.NpgsqlFactory.Instance;\n                case DatabaseType.SQLite:\n#if ASP_NET_CORE\n                    AppDomain.CurrentDomain.SetData(\"DataDirectory\", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, \"App_Data\"));\n                    return Microsoft.Data.Sqlite.SqliteFactory.Instance;\n#else\n                    return System.Data.SQLite.SQLiteFactory.Instance;\n#endif\n            }\n            return null;\n        }\n        #endregion\n\n        #region Public Method\n        /// <summary>\n        /// 垃圾回收\n        /// </summary>\n        public void Dispose()\n        {\n            if (DbConnection == null)\n                return;\n            try\n            {\n                DbConnection.Dispose();\n            }\n            catch { }\n        }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/DataContext/DataSettings.cs",
    "content": "﻿using System;\nusing System.Text.RegularExpressions;\n#if ASP_NET_CORE\nusing Microsoft.Extensions.Configuration;\n#else\nusing System.Configuration;\n#endif\n\nnamespace Overt.Core.Data\n{\n    /// <summary>\n    /// 连接配置信息获取\n    /// 1. master / secondary\n    /// 2. xx.master / xx.secondary\n    /// </summary>\n    public class DataSettings\n    {\n        #region Static Private Members\n        const string _connNmeOfMaster = \"master\";\n        const string _connNameOfSecondary = \"secondary\";\n        const string _connNameOfPoint = \".\";\n        #endregion\n\n        #region Single Instance\n        static readonly object lockHelper = new object();\n        static volatile DataSettings _Default;\n        /// <summary>\n        /// 单例模式\n        /// </summary>\n        static public DataSettings Default\n        {\n            get\n            {\n                if (_Default == null)\n                {\n                    lock (lockHelper)\n                    {\n                        _Default = _Default ?? new DataSettings();\n                    }\n                }\n                return _Default;\n            }\n        }\n        #endregion\n\n        #region Construct Method\n        /// <summary>\n        /// 构造函数\n        /// </summary>\n        private DataSettings()\n        {\n        }\n        #endregion\n\n        #region Public Method\n#if ASP_NET_CORE\n        /// <summary>\n        /// 获取连接字符串\n        /// </summary>\n        /// <param name=\"configuration\"></param>\n        /// <param name=\"isMaster\"></param>\n        /// <param name=\"dbStoreKey\"></param>\n        /// <param name=\"connectionFunc\"></param>\n        /// <returns></returns>\n        public (string, DatabaseType) Get(IConfiguration configuration, bool isMaster, string dbStoreKey, Func<bool, string> connectionFunc = null)\n        {\n            string connectionString;\n            if (connectionFunc != null)\n            {\n                connectionString = connectionFunc.Invoke(isMaster);\n                return ResolveConnectionString(connectionString);\n            }\n\n            if (configuration == null)\n            {\n                throw new Exception($\"请注入IConfiguration\");\n                //configuration = new ConfigurationBuilder()\n                //    .SetBasePath(AppDomain.CurrentDomain.BaseDirectory)\n                //    .AddJsonFile(\"appsettings.json\")\n                //    .Build();\n            }\n\n            var connectionKey = GetKey(isMaster, dbStoreKey);\n            connectionString = configuration.GetConnectionString(connectionKey);\n            if (string.IsNullOrEmpty(connectionString) && !isMaster)\n            {\n                // 从库转主库\n                connectionKey = GetKey(true, dbStoreKey);\n                connectionString = configuration.GetConnectionString(connectionKey);\n            }\n\n            return ResolveConnectionString(connectionString);\n        }\n\n        /// <summary>\n        /// 解析\n        /// </summary>\n        /// <param name=\"connectionString\"></param>\n        /// <param name=\"param\"></param>\n        /// <returns></returns>\n        private (string, DatabaseType) ResolveConnectionString(string connectionString, string param = \"DbType\")\n        {\n            var dbTypeRegex = new Regex($@\"(^|;){param}=(?<dbtype>[A-Za-z]+)(;|$)\");\n            var m = dbTypeRegex.Match(connectionString);\n            var dbTypeString = m?.Groups[\"dbtype\"].Value;\n            DatabaseType dbType;\n            var parseResult = Enum.TryParse(dbTypeString, out dbType);\n            if (!parseResult)\n                dbType = DatabaseType.MySql;\n\n            connectionString = Regex.Replace(connectionString, $@\"{param}=([A-Za-z]+)(;|$)\", \"\");\n            return (connectionString, dbType);\n        }\n#else\n        /// <summary>\n        /// 获取连接字符串\n        /// </summary>\n        /// <param name=\"isMaster\"></param>\n        /// <param name=\"dbStoreKey\"></param>\n        /// <param name=\"connectionFunc\"></param>\n        /// <returns></returns>\n        public ConnectionStringSettings Get(bool isMaster, string dbStoreKey, Func<bool, ConnectionStringSettings> connectionFunc = null)\n        {\n            if (connectionFunc != null)\n                return connectionFunc.Invoke(isMaster);\n\n            var connectionKey = GetKey(isMaster, dbStoreKey);\n            var connectionSetting = ConfigurationManager.ConnectionStrings[connectionKey];\n            if (string.IsNullOrEmpty(connectionSetting?.ConnectionString) && !isMaster)\n            {\n                connectionKey = GetKey(true, dbStoreKey);\n                connectionSetting = ConfigurationManager.ConnectionStrings[connectionKey];\n            }\n            return connectionSetting;\n        }\n#endif\n        #endregion\n\n        #region Private Method\n        /// <summary>\n        /// 获取\n        /// </summary>\n        /// <param name=\"isMaster\"></param>\n        /// <param name=\"dbStoreKey\">不能包含点</param>\n        /// <returns></returns>\n        private string GetKey(bool isMaster = false, string dbStoreKey = \"\")\n        {\n            var connNameOfPrefix = string.IsNullOrWhiteSpace(dbStoreKey) ? \"\" : $\"{dbStoreKey}{_connNameOfPoint}\";\n            string connName;\n            if (isMaster)\n                connName = $\"{connNameOfPrefix}{_connNmeOfMaster}\";\n            else\n                connName = $\"{connNameOfPrefix}{_connNameOfSecondary}\";\n\n            return connName;\n        }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Enums/DataCustomType.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Overt.Core.Data\n{\n    /// <summary>\n    /// 自定义字段类型\n    /// </summary>\n    public enum DataCustomType\n    {\n        /// <summary>\n        /// 未定义\n        /// </summary>\n        None = 0,\n        /// <summary>\n        /// jsonb类型\n        /// </summary>\n        Jsonb = 1,\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Enums/DatabaseType.cs",
    "content": "﻿namespace Overt.Core.Data\n{\n    /// <summary>\n    /// 数据库类型\n    /// </summary>\n\tpublic enum DatabaseType\n    {\n        /// <summary>\n        /// SqlServer\n        /// </summary>\n\t\tSqlServer,\n        /// <summary>\n        /// >=SqlServer2012\n        /// </summary>\n\t\tGteSqlServer2012,\n        /// <summary>\n        /// Mysql\n        /// </summary>\n\t\tMySql,\n        /// <summary>\n        /// Sqlite\n        /// </summary>\n        SQLite,\n        /// <summary>\n        /// PostgreSQL\n        /// </summary>\n        PostgreSQL\n    }\n}"
  },
  {
    "path": "src/Overt.Core.Data/Enums/FieldSortType.cs",
    "content": "﻿namespace Overt.Core.Data\n{\n    /// <summary>\n    /// 字段排序类型\n    /// </summary>\n    public enum FieldSortType\n    {\n        /// <summary>\n        /// 顺序\n        /// </summary>\n        Asc = 1,\n        /// <summary>\n        /// 倒序\n        /// </summary>\n        Desc = 2\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Expressions/ExpressionHelper.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq.Expressions;\n\nnamespace Overt.Core.Data.Expressions\n{\n    /// <summary>\n    /// 解析为 Dictionary 获取表达式中的key - value\n    /// 只需要有等于号的\n    /// </summary>\n    internal class ExpressionHelper\n    {\n        /// <summary>\n        /// 获取参数\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"dictionary\"></param>\n        public static void Resolve(Expression expression, ref Dictionary<object, object> dictionary)\n        {\n            if (expression == null)\n                return;\n\n            if (expression is BinaryExpression)\n            {\n                var binaryExpression = ((BinaryExpression)expression);\n                ResolveBinary(binaryExpression, ref dictionary);\n            }\n        }\n\n        #region Binary\n        private static void ResolveBinary(BinaryExpression expression, ref Dictionary<object, object> dictionary)\n        {\n            object left = null, right = null;\n            if (expression.NodeType == ExpressionType.AndAlso || expression.NodeType == ExpressionType.OrElse)\n            {\n                if (expression.Left.IsBooleanComparison())\n                    left = ResolveMemberOrConstant(expression.Left);\n                else\n                    Resolve(expression.Left, ref dictionary);\n\n                if (expression.Right.IsBooleanComparison())\n                    right = ResolveMemberOrConstant(expression.Right);\n                else\n                    Resolve(expression.Right, ref dictionary);\n            }\n            else if (expression.NodeType == ExpressionType.Equal)\n            {\n                left = ResolveMemberOrConstant(expression.Left);\n                right = ResolveMemberOrConstant(expression.Right);\n            }\n\n            if (left != null && !dictionary.ContainsKey(left))\n            {\n                dictionary.Add(left, right);\n            }\n        }\n        #endregion\n\n        #region Member / Constant\n        private static object ResolveMemberOrConstant(Expression expression)\n        {\n            if (expression == null)\n                return null;\n\n            if (expression is MemberExpression)\n                return ResolveMember((MemberExpression)expression);\n            if (expression is ConstantExpression)\n                return ResolveConstant((ConstantExpression)expression);\n            return null;\n        }\n\n        private static object ResolveMember(MemberExpression expression)\n        {\n            if (expression.Expression != null)\n            {\n                if (expression.Member.DeclaringType.IsNullableType())\n                    return null;\n\n                if (expression.IsParameterOrConvertAccess())\n                    return expression.Member.Name;\n            }\n\n            var val = SqlExpressionCompiler.Evaluate(expression);\n            return val;\n        }\n\n        private static object ResolveConstant(ConstantExpression expression)\n        {\n            return expression.Value;\n        }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Expressions/Extensions/Expression.Extensions.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Linq.Expressions;\n\nnamespace Overt.Core.Data.Expressions\n{\n    /// <summary>\n    /// 表达式扩展\n    /// </summary>\n    public static class ExpressionExtensions\n    {\n        /// <summary>\n        /// 是否为空类型\n        /// </summary>\n        /// <param name=\"type\"></param>\n        /// <returns></returns>\n        public static bool IsNullableType(this Type type)\n        {\n            return type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>);\n        }\n\n        /// <summary>\n        /// 是否是\n        /// </summary>\n        /// <param name=\"type\"></param>\n        /// <param name=\"genericTypeDefinition\"></param>\n        /// <returns></returns>\n        public static bool IsOrHasGenericInterfaceTypeOf(this Type type, Type genericTypeDefinition)\n        {\n            return (type.GetTypeWithGenericTypeDefinitionOf(genericTypeDefinition) != null)\n                || (type == genericTypeDefinition);\n        }\n\n        /// <summary>\n        /// 是否是泛型\n        /// </summary>\n        /// <param name=\"type\"></param>\n        /// <param name=\"genericTypeDefinition\"></param>\n        /// <returns></returns>\n        public static Type GetTypeWithGenericTypeDefinitionOf(this Type type, Type genericTypeDefinition)\n        {\n            foreach (var t in type.GetInterfaces())\n            {\n                if (t.IsGenericType && t.GetGenericTypeDefinition() == genericTypeDefinition)\n                {\n                    return t;\n                }\n            }\n\n            var genericType = type.FirstGenericType();\n            if (genericType != null && genericType.GetGenericTypeDefinition() == genericTypeDefinition)\n            {\n                return genericType;\n            }\n\n            return null;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"type\"></param>\n        /// <returns></returns>\n        public static Type FirstGenericType(this Type type)\n        {\n            while (type != null)\n            {\n                if (type.IsGenericType)\n                    return type;\n\n                type = type.BaseType;\n            }\n            return null;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"m\"></param>\n        /// <returns></returns>\n        public static string GetMemberExpression(this MemberExpression m)\n        {\n            return m.Member.Name;\n        }\n\n        /// <summary>\n        /// Determines whether the expression is the parameter.\n        /// </summary>\n        /// <returns>Returns true if the specified expression is parameter;\n        /// otherwise, false.</returns>\n        public static bool IsParameterAccess(Expression e)\n        {\n            return e.CheckExpressionForTypes(new[] { ExpressionType.Parameter });\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"e\"></param>\n        /// <returns></returns>\n        public static bool IsParameterOrConvertAccess(this Expression e)\n        {\n            return e.CheckExpressionForTypes(new[] { ExpressionType.Parameter, ExpressionType.Convert });\n        }\n\n        /// <summary>\n        /// 检查类型\n        /// </summary>\n        /// <param name=\"e\"></param>\n        /// <param name=\"types\"></param>\n        /// <returns></returns>\n        public static bool CheckExpressionForTypes(this Expression e, ExpressionType[] types)\n        {\n            while (e != null)\n            {\n                if (types.Contains(e.NodeType))\n                {\n                    var subUnaryExpr = e as UnaryExpression;\n                    var isSubExprAccess = subUnaryExpr?.Operand is IndexExpression;\n                    if (!isSubExprAccess)\n                        return true;\n                }\n\n                var binaryExpr = e as BinaryExpression;\n                if (binaryExpr != null)\n                {\n                    if (CheckExpressionForTypes(binaryExpr.Left, types))\n                        return true;\n\n                    if (CheckExpressionForTypes(binaryExpr.Right, types))\n                        return true;\n                }\n\n                var methodCallExpr = e as MethodCallExpression;\n                if (methodCallExpr != null)\n                {\n                    for (var i = 0; i < methodCallExpr.Arguments.Count; i++)\n                    {\n                        if (CheckExpressionForTypes(methodCallExpr.Arguments[i], types))\n                            return true;\n                    }\n\n                    if (CheckExpressionForTypes(methodCallExpr.Object, types))\n                        return true;\n                }\n\n                var unaryExpr = e as UnaryExpression;\n                if (unaryExpr != null)\n                {\n                    if (CheckExpressionForTypes(unaryExpr.Operand, types))\n                        return true;\n                }\n\n                var condExpr = e as ConditionalExpression;\n                if (condExpr != null)\n                {\n                    if (CheckExpressionForTypes(condExpr.Test, types))\n                        return true;\n\n                    if (CheckExpressionForTypes(condExpr.IfTrue, types))\n                        return true;\n\n                    if (CheckExpressionForTypes(condExpr.IfFalse, types))\n                        return true;\n                }\n\n                var memberExpr = e as MemberExpression;\n                e = memberExpr?.Expression;\n            }\n\n            return false;\n        }\n\n        /// <summary>\n        /// 是否是Boolean\n        /// </summary>\n        /// <param name=\"e\"></param>\n        /// <returns></returns>\n        public static bool IsBooleanComparison(this Expression e)\n        {\n            if (!(e is MemberExpression))\n                return false;\n\n            var m = (MemberExpression)e;\n\n            if (m.Member.DeclaringType.IsNullableType() &&\n                m.Member.Name == \"HasValue\") //nameof(Nullable<bool>.HasValue)\n                return false;\n\n            return IsParameterAccess(m);\n        }\n\n        /// <summary>\n        /// 获取Value\n        /// </summary>\n        /// <param name=\"binding\"></param>\n        /// <returns></returns>\n        public static object GetValue(this MemberBinding binding)\n        {\n            switch (binding.BindingType)\n            {\n                case MemberBindingType.Assignment:\n                    var assign = (MemberAssignment)binding;\n                    if (assign.Expression is ConstantExpression constant)\n                        return constant.Value;\n\n                    try\n                    {\n                        return SqlExpressionCompiler.Evaluate(assign.Expression);\n                    }\n                    catch (Exception ex)\n                    {\n                        var member = Expression.Convert(assign.Expression, typeof(object));\n                        var lambda = Expression.Lambda<Func<object>>(member);\n                        var getter = lambda.Compile();\n                        return getter();\n                    }\n            }\n            return null;\n        }\n\n        /// <summary>\n        /// 获取Fields\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"expr\"></param>\n        /// <returns></returns>\n        public static string[] GetFieldNames<T>(this Expression<Func<T, object>> expr)\n        {\n            if (expr == null)\n                return null;\n\n            if (expr.Body is MemberExpression member)\n            {\n                if (member.Member.DeclaringType.IsAssignableFrom(typeof(T)))\n                    return new[] { member.Member.Name };\n\n                var array = SqlExpressionCompiler.Evaluate(member);\n                if (array is IEnumerable<string> strEnum)\n                    return strEnum.ToArray();\n            }\n\n            if (expr.Body is NewExpression newExpr)\n                return newExpr.Arguments.OfType<MemberExpression>().Select(x => x.Member.Name).ToArray();\n\n            if (expr.Body is MemberInitExpression init)\n                return init.Bindings.Select(x => x.Member.Name).ToArray();\n\n            if (expr.Body is UnaryExpression unary)\n            {\n                member = unary.Operand as MemberExpression;\n                if (member != null)\n                    return new[] { member.Member.Name };\n            }\n\n            throw new ArgumentException(\"Invalid Fields List Expression: \" + expr);\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"list\"></param>\n        /// <returns></returns>\n        public static List<object> Flatten(this IEnumerable list)\n        {\n            var ret = new List<object>();\n            if (list == null) return ret;\n\n            foreach (var item in list)\n            {\n                if (item == null) continue;\n\n                var arr = item as IEnumerable;\n                if (arr != null && !(item is string))\n                {\n                    ret.AddRange(arr.Cast<object>());\n                }\n                else\n                {\n                    ret.Add(item);\n                }\n            }\n            return ret;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Expressions/SqlExpression/Resolve/Basic/BaseSqlExpression.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq.Expressions;\n\nnamespace Overt.Core.Data.Expressions\n{\n    /// <summary>\n    /// BaseSqlExpression\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public abstract class BaseSqlExpression<T> : ISqlExpression where T : Expression\n    {\n        /// <summary>\n        /// Update\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tprotected virtual SqlGenerate Update(T expression, SqlGenerate sqlGenerate)\n        {\n            throw new NotImplementedException(\"未实现\" + typeof(T).Name + \"2Sql.Update方法\");\n        }\n\n        /// <summary>\n        /// Select\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tprotected virtual SqlGenerate Select(T expression, SqlGenerate sqlGenerate)\n        {\n            throw new NotImplementedException(\"未实现\" + typeof(T).Name + \"2Sql.Select方法\");\n        }\n\n        /// <summary>\n        /// Where\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tprotected virtual SqlGenerate Where(T expression, SqlGenerate sqlGenerate)\n        {\n            throw new NotImplementedException(\"未实现\" + typeof(T).Name + \"2Sql.Where方法\");\n        }\n\n        /// <summary>\n        /// In\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tprotected virtual SqlGenerate In(T expression, SqlGenerate sqlGenerate)\n        {\n            throw new NotImplementedException(\"未实现\" + typeof(T).Name + \"2Sql.In方法\");\n        }\n\n        /// <summary>\n        /// OrderBy\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tprotected virtual SqlGenerate OrderBy(T expression, SqlGenerate sqlGenerate)\n        {\n            throw new NotImplementedException(\"未实现\" + typeof(T).Name + \"2Sql.OrderBy方法\");\n        }\n\n        /// <summary>\n        /// Max\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tprotected virtual SqlGenerate Max(T expression, SqlGenerate sqlGenerate)\n        {\n            throw new NotImplementedException(\"未实现\" + typeof(T).Name + \"2Sql.Max方法\");\n        }\n\n        /// <summary>\n        /// Min\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tprotected virtual SqlGenerate Min(T expression, SqlGenerate sqlGenerate)\n        {\n            throw new NotImplementedException(\"未实现\" + typeof(T).Name + \"2Sql.Min方法\");\n        }\n\n        /// <summary>\n        /// Avg\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tprotected virtual SqlGenerate Avg(T expression, SqlGenerate sqlGenerate)\n        {\n            throw new NotImplementedException(\"未实现\" + typeof(T).Name + \"2Sql.Avg方法\");\n        }\n\n        /// <summary>\n        /// Count\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tprotected virtual SqlGenerate Count(T expression, SqlGenerate sqlGenerate)\n        {\n            throw new NotImplementedException(\"未实现\" + typeof(T).Name + \"2Sql.Count方法\");\n        }\n        /// <summary>\n        /// Sum\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tprotected virtual SqlGenerate Sum(T expression, SqlGenerate sqlGenerate)\n        {\n            throw new NotImplementedException(\"未实现\" + typeof(T).Name + \"2Sql.Sum方法\");\n        }\n\n        /// <summary>\n        /// Update\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tpublic SqlGenerate Update(Expression expression, SqlGenerate sqlGenerate)\n        {\n            return Update((T)expression, sqlGenerate);\n        }\n\n        /// <summary>\n        /// Select\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tpublic SqlGenerate Select(Expression expression, SqlGenerate sqlGenerate)\n        {\n            return Select((T)expression, sqlGenerate);\n        }\n\n        /// <summary>\n        /// Where\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tpublic SqlGenerate Where(Expression expression, SqlGenerate sqlGenerate)\n        {\n            return Where((T)expression, sqlGenerate);\n        }\n\n        /// <summary>\n        /// In\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tpublic SqlGenerate In(Expression expression, SqlGenerate sqlGenerate)\n        {\n            return In((T)expression, sqlGenerate);\n        }\n\n        /// <summary>\n        /// OrderBy\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tpublic SqlGenerate OrderBy(Expression expression, SqlGenerate sqlGenerate)\n        {\n            return OrderBy((T)expression, sqlGenerate);\n        }\n\n        /// <summary>\n        /// Max\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tpublic SqlGenerate Max(Expression expression, SqlGenerate sqlGenerate)\n        {\n            return Max((T)expression, sqlGenerate);\n        }\n\n        /// <summary>\n        /// Min\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tpublic SqlGenerate Min(Expression expression, SqlGenerate sqlGenerate)\n        {\n            return Min((T)expression, sqlGenerate);\n        }\n\n        /// <summary>\n        /// Avg\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tpublic SqlGenerate Avg(Expression expression, SqlGenerate sqlGenerate)\n        {\n            return Avg((T)expression, sqlGenerate);\n        }\n\n        /// <summary>\n        /// Count\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tpublic SqlGenerate Count(Expression expression, SqlGenerate sqlGenerate)\n        {\n            return Count((T)expression, sqlGenerate);\n        }\n\n        /// <summary>\n        /// Sum\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tpublic SqlGenerate Sum(Expression expression, SqlGenerate sqlGenerate)\n        {\n            return Sum((T)expression, sqlGenerate);\n        }\n\n        #region Internal Method\n        /// <summary>\n        /// 是否是静态集合方法\n        /// </summary>\n        /// <param name=\"m\"></param>\n        /// <returns></returns>\n        internal static bool IsStaticArrayMethod(MethodCallExpression m)\n        {\n            return (m.Object == null\n                && m.Arguments.Count == 2);\n        }\n\n        /// <summary>\n        /// 是否是集合方法\n        /// </summary>\n        /// <param name=\"m\"></param>\n        /// <returns></returns>\n        internal static bool IsEnumerableMethod(MethodCallExpression m)\n        {\n            return m.Object != null\n                && m.Object.Type.IsOrHasGenericInterfaceTypeOf(typeof(IEnumerable<>))\n                && m.Object.Type != typeof(string)\n                && m.Arguments.Count == 1;\n        }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Expressions/SqlExpression/Resolve/Basic/ISqlExpression.cs",
    "content": "﻿using System.Linq.Expressions;\n\nnamespace Overt.Core.Data.Expressions\n{\n    /// <summary>\n    /// interface\n    /// </summary>\n    public interface ISqlExpression\n    {\n        /// <summary>\n        /// Update\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tSqlGenerate Update(Expression expression, SqlGenerate sqlGenerate);\n        /// <summary>\n        /// Select\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tSqlGenerate Select(Expression expression, SqlGenerate sqlGenerate);\n        /// <summary>\n        /// Where\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tSqlGenerate Where(Expression expression, SqlGenerate sqlGenerate);\n        /// <summary>\n        /// In\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tSqlGenerate In(Expression expression, SqlGenerate sqlGenerate);\n        /// <summary>\n        /// OrderBy\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tSqlGenerate OrderBy(Expression expression, SqlGenerate sqlGenerate);\n        /// <summary>\n        /// Max\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tSqlGenerate Max(Expression expression, SqlGenerate sqlGenerate);\n        /// <summary>\n        /// Min\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tSqlGenerate Min(Expression expression, SqlGenerate sqlGenerate);\n        /// <summary>\n        /// Avg\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tSqlGenerate Avg(Expression expression, SqlGenerate sqlGenerate);\n        /// <summary>\n        /// Count\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tSqlGenerate Count(Expression expression, SqlGenerate sqlGenerate);\n        /// <summary>\n        /// Sum\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n\t\tSqlGenerate Sum(Expression expression, SqlGenerate sqlGenerate);\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Expressions/SqlExpression/Resolve/BinarySqlExpression.cs",
    "content": "﻿using System;\nusing System.Linq.Expressions;\n\nnamespace Overt.Core.Data.Expressions\n{\n    class BinarySqlExpression : BaseSqlExpression<BinaryExpression>\n    {\n        private void OperatorParser(ExpressionType expressionNodeType, int operatorIndex, SqlGenerate sqlGenerate, bool useIs = false)\n        {\n            switch (expressionNodeType)\n            {\n                case ExpressionType.And:\n                    sqlGenerate.Sql.Insert(operatorIndex, \" & \");\n                    break;\n                case ExpressionType.AndAlso:\n                    sqlGenerate.Sql.Insert(operatorIndex, \" and \");\n                    break;\n                case ExpressionType.Equal:\n                    if (useIs)\n                        sqlGenerate.Sql.Insert(operatorIndex, \" is \");\n                    else\n                        sqlGenerate.Sql.Insert(operatorIndex, \" = \");\n                    break;\n                case ExpressionType.GreaterThan:\n                    sqlGenerate.Sql.Insert(operatorIndex, \" >\");\n                    break;\n                case ExpressionType.GreaterThanOrEqual:\n                    sqlGenerate.Sql.Insert(operatorIndex, \" >=\");\n                    break;\n                case ExpressionType.NotEqual:\n                    if (useIs)\n                        sqlGenerate.Sql.Insert(operatorIndex, \" is not \");\n                    else\n                        sqlGenerate.Sql.Insert(operatorIndex, \" <> \");\n                    break;\n                case ExpressionType.Or:\n                    sqlGenerate.Sql.Insert(operatorIndex, \" | \");\n                    break;\n                case ExpressionType.OrElse:\n                    sqlGenerate.Sql.Insert(operatorIndex, \" or \");\n                    break;\n                case ExpressionType.LessThan:\n                    sqlGenerate.Sql.Insert(operatorIndex, \" < \");\n                    break;\n                case ExpressionType.LessThanOrEqual:\n                    sqlGenerate.Sql.Insert(operatorIndex, \" <= \");\n                    break;\n                default:\n                    throw new NotImplementedException(\"未实现的节点类型\" + expressionNodeType);\n            }\n        }\n\n        protected override SqlGenerate Where(BinaryExpression expression, SqlGenerate sqlGenerate)\n        {\n            int leftBracketIndex = -1, rightBracketIndex = -1, signIndex = -1, sqlLength = -1;\n\n            leftBracketIndex = sqlGenerate.Length;\n\n            #region 内部内容\n            if (expression.NodeType == ExpressionType.AndAlso || expression.NodeType == ExpressionType.OrElse)\n            {\n                if (expression.Left.IsBooleanComparison())\n                {\n                    SqlExpressionProvider.Where(expression.Left, sqlGenerate);\n                    sqlGenerate += $\" = 1\";\n                }\n                else\n                {\n                    SqlExpressionProvider.Where(expression.Left, sqlGenerate);\n                }\n                signIndex = sqlGenerate.Length;\n\n\n                if (expression.Right.IsBooleanComparison())\n                {\n                    SqlExpressionProvider.Where(expression.Right, sqlGenerate);\n                    sqlGenerate += $\" = 1\";\n                }\n                else\n                {\n                    SqlExpressionProvider.Where(expression.Right, sqlGenerate);\n                }\n                sqlLength = sqlGenerate.Length;\n            }\n            else\n            {\n                SqlExpressionProvider.Where(expression.Left, sqlGenerate);\n                signIndex = sqlGenerate.Length;\n\n                SqlExpressionProvider.Where(expression.Right, sqlGenerate);\n                sqlLength = sqlGenerate.Length;\n            }\n\n            if (sqlLength - signIndex == 5 && sqlGenerate.ToString().EndsWith(\"null\"))\n                OperatorParser(expression.NodeType, signIndex, sqlGenerate, true);\n            else\n                OperatorParser(expression.NodeType, signIndex, sqlGenerate);\n            #endregion\n\n            if (expression.NodeType == ExpressionType.OrElse || expression.NodeType == ExpressionType.AndAlso ||\n                expression.NodeType == ExpressionType.Or || expression.NodeType == ExpressionType.And)\n            {\n                sqlGenerate.Sql.Insert(leftBracketIndex, \" ( \");\n                rightBracketIndex = sqlGenerate.Length;\n                sqlGenerate.Sql.Insert(rightBracketIndex, \" ) \");\n            }\n\n            return sqlGenerate;\n        }\n    }\n}"
  },
  {
    "path": "src/Overt.Core.Data/Expressions/SqlExpression/Resolve/ConstantSqlExpression.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq.Expressions;\n\nnamespace Overt.Core.Data.Expressions\n{\n    class ConstantSqlExpression : BaseSqlExpression<ConstantExpression>\n    {\n        protected override SqlGenerate Where(ConstantExpression expression, SqlGenerate sqlGenerate)\n        {\n            sqlGenerate.AddDbParameter(expression.Value);\n            return sqlGenerate;\n        }\n\n        protected override SqlGenerate In(ConstantExpression expression, SqlGenerate sqlGenerate)\n        {\n            sqlGenerate.AddDbParameter(expression.Value);\n            sqlGenerate += \",\";\n            return sqlGenerate;\n        }\n\n        protected override SqlGenerate Select(ConstantExpression expression, SqlGenerate sqlGenerate)\n        {\n            if (expression.Value == null)\n                sqlGenerate.SelectFields = new List<string>() { \"*\" };\n            else\n                sqlGenerate.SelectFields = new List<string>() { expression.Value.ToString() };\n            return sqlGenerate;\n        }\n    }\n}"
  },
  {
    "path": "src/Overt.Core.Data/Expressions/SqlExpression/Resolve/LambdaSqlExpression.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq.Expressions;\nusing System.Text;\n\nnamespace Overt.Core.Data.Expressions\n{\n    public class LambdaSqlExpression : BaseSqlExpression<LambdaExpression>\n    {\n        protected override SqlGenerate Update(LambdaExpression expression, SqlGenerate sqlGenerate)\n        {\n            SqlExpressionProvider.Update(expression.Body, sqlGenerate);\n            return sqlGenerate;\n        }\n        protected override SqlGenerate Select(LambdaExpression expression, SqlGenerate sqlGenerate)\n        {\n            SqlExpressionProvider.Select(expression.Body, sqlGenerate);\n            return sqlGenerate;\n        }\n        protected override SqlGenerate Where(LambdaExpression expression, SqlGenerate sqlGenerate)\n        {\n            if (expression.Body.NodeType == ExpressionType.MemberAccess)\n            {\n                var memberExpression = expression.Body as MemberExpression;\n                if (memberExpression.Expression == null)\n                    return sqlGenerate;\n\n                //添加属性\n                SqlExpressionProvider.Where(memberExpression, sqlGenerate);\n\n                if (memberExpression.Expression.Type.IsNullableType())\n                    return sqlGenerate;\n\n                sqlGenerate += \" = 1\";\n                return sqlGenerate;\n            }\n\n            SqlExpressionProvider.Where(expression.Body, sqlGenerate);\n            return sqlGenerate;\n        }\n        protected override SqlGenerate In(LambdaExpression expression, SqlGenerate sqlGenerate)\n        {\n            SqlExpressionProvider.In(expression.Body, sqlGenerate);\n            return sqlGenerate;\n        }\n        protected override SqlGenerate OrderBy(LambdaExpression expression, SqlGenerate sqlGenerate)\n        {\n            SqlExpressionProvider.OrderBy(expression.Body, sqlGenerate);\n            return sqlGenerate;\n        }\n        protected override SqlGenerate Max(LambdaExpression expression, SqlGenerate sqlGenerate)\n        {\n            SqlExpressionProvider.Max(expression.Body, sqlGenerate);\n            return sqlGenerate;\n        }\n        protected override SqlGenerate Min(LambdaExpression expression, SqlGenerate sqlGenerate)\n        {\n            SqlExpressionProvider.Min(expression.Body, sqlGenerate);\n            return sqlGenerate;\n        }\n        protected override SqlGenerate Avg(LambdaExpression expression, SqlGenerate sqlGenerate)\n        {\n            SqlExpressionProvider.Avg(expression.Body, sqlGenerate);\n            return sqlGenerate;\n        }\n        protected override SqlGenerate Count(LambdaExpression expression, SqlGenerate sqlGenerate)\n        {\n            SqlExpressionProvider.Count(expression.Body, sqlGenerate);\n            return sqlGenerate;\n        }\n        protected override SqlGenerate Sum(LambdaExpression expression, SqlGenerate sqlGenerate)\n        {\n            SqlExpressionProvider.Sum(expression.Body, sqlGenerate);\n            return sqlGenerate;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Expressions/SqlExpression/Resolve/ListInitSqlExpression.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq.Expressions;\n\nnamespace Overt.Core.Data.Expressions\n{\n    class ListInitSqlExpression : BaseSqlExpression<ListInitExpression>\n    {\n        protected override SqlGenerate In(ListInitExpression expression, SqlGenerate sqlGenerate)\n        {\n            var list = new List<object>();\n            foreach (var elementInit in expression.Initializers)\n            {\n                foreach (var expre in elementInit.Arguments)\n                {\n                    var obj = SqlExpressionCompiler.Evaluate(expre);\n                    list.Add(obj);\n                }\n            }\n            sqlGenerate.AddDbParameter(list);\n            return sqlGenerate;\n        }\n\n        protected override SqlGenerate Select(ListInitExpression expression, SqlGenerate sqlGenerate)\n        {\n            foreach (var elementInit in expression.Initializers)\n            {\n                foreach (var expre in elementInit.Arguments)\n                {\n                    var obj = SqlExpressionCompiler.Evaluate(expre);\n                    if (obj == null)\n                        continue;\n\n                    var fieldName = obj.ToString();\n                    if (string.IsNullOrEmpty(fieldName))\n                        continue;\n                    sqlGenerate.SelectFields.Add(fieldName.ParamSql(sqlGenerate));\n                }\n            }\n            return sqlGenerate;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Expressions/SqlExpression/Resolve/MemberSqlExpression.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Linq.Expressions;\n\nnamespace Overt.Core.Data.Expressions\n{\n    class MemberSqlExpression : BaseSqlExpression<MemberExpression>\n    {\n        protected override SqlGenerate Select(MemberExpression expression, SqlGenerate sqlGenerate)\n        {\n            if (IsEnumerable(expression))\n            {\n                var result = SqlExpressionCompiler.Evaluate(expression);\n                var fields = (result as IEnumerable).Flatten();\n                if (fields?.Count > 0)\n                    sqlGenerate.SelectFields.AddRange(fields.Select(field => field.ToString().ParamSql(sqlGenerate)));\n                else\n                    sqlGenerate.SelectFields = new List<string>() { \"*\" };\n\n                return sqlGenerate;\n            }\n\n            sqlGenerate.SelectFields.Add(expression.Member.Name.ParamSql(sqlGenerate));\n            return sqlGenerate;\n        }\n\n        protected override SqlGenerate Where(MemberExpression expression, SqlGenerate sqlGenerate)\n        {\n            if (expression.Expression != null)\n            {\n                if (expression.Member.DeclaringType.IsNullableType())\n                {\n                    if (expression.Member.Name == \"Value\") //Can't use C# 6 yet: nameof(Nullable<bool>.Value)\n                    {\n                        SqlExpressionProvider.Where(expression.Expression, sqlGenerate);\n                        return sqlGenerate;\n                    }\n                    if (expression.Member.Name == \"HasValue\")\n                    {\n                        var doesNotEqualNull = Expression.MakeBinary(ExpressionType.NotEqual, expression.Expression, Expression.Constant(null));\n                        SqlExpressionProvider.Where(doesNotEqualNull, sqlGenerate);\n                        return sqlGenerate;\n                    }\n                    throw new ArgumentException($\"Expression '{expression}' accesses unsupported property '{expression.Member}' of Nullable<T>\");\n                }\n\n                if (expression.IsParameterOrConvertAccess())\n                {\n                    sqlGenerate += $\" {expression.Member.Name.ParamSql(sqlGenerate)}\";\n                    return sqlGenerate;\n                }\n            }\n\n            var val = SqlExpressionCompiler.Evaluate(expression);\n            sqlGenerate.AddDbParameter(val);\n            return sqlGenerate;\n\n        }\n\n        protected override SqlGenerate In(MemberExpression expression, SqlGenerate sqlGenerate)\n        {\n            var result = SqlExpressionCompiler.Evaluate(expression);\n            var inArgs = (result as IEnumerable).Flatten();\n            if (sqlGenerate.DatabaseType == DatabaseType.PostgreSQL)  // pg的in查询需要手动拼接，不然npgsql客户不支持list类型参数化\n                sqlGenerate.CombineInParameters(inArgs);\n            else\n                sqlGenerate.AddDbParameter(inArgs);\n            return sqlGenerate;\n        }\n\n        protected override SqlGenerate OrderBy(MemberExpression expression, SqlGenerate sqlGenerate)\n        {\n            sqlGenerate += expression.Member.Name.ParamSql(sqlGenerate);\n            return sqlGenerate;\n        }\n\n        protected override SqlGenerate Update(MemberExpression expression, SqlGenerate sqlGenerate)\n        {\n            var obj = SqlExpressionCompiler.Evaluate(expression);\n            if (obj == null)\n                throw new ArgumentException($\"Expression '{expression}' accesses unsupported property '{expression.Member}' of Nullable<T>\");\n\n            if (obj.GetType().IsValueType)\n                throw new ArgumentException($\"Expression '{expression}' accesses unsupported valuetype\");\n\n            if (obj.GetType() == typeof(string))\n            {\n                sqlGenerate += obj.ToString();\n            }\n            else if (obj is IDictionary dictionary)\n            {\n                foreach (string key in dictionary.Keys)\n                {\n                    sqlGenerate += $\"{key.ParamSql(sqlGenerate)} = \";\n                    sqlGenerate.AddDbParameter(dictionary[key]);\n                    sqlGenerate += \",\";\n                }\n            }\n            else\n            {\n                var pis = obj.GetType().GetProperties();\n                foreach (var p in pis)\n                {\n                    sqlGenerate += $\"{p.Name.ParamSql(sqlGenerate)} = \";\n                    sqlGenerate.AddDbParameter(p.GetValue(obj));\n                    sqlGenerate += \",\";\n                }\n            }\n\n            if (sqlGenerate[sqlGenerate.Length - 1] == ',')\n                sqlGenerate.Sql.Remove(sqlGenerate.Length - 1, 1);\n\n            return sqlGenerate;\n        }\n\n        protected override SqlGenerate Max(MemberExpression expression, SqlGenerate sqlGenerate)\n        {\n            sqlGenerate.Sql.AppendFormat(\"select max({0}) from {1}\", expression.Member.Name.ParamSql(sqlGenerate), sqlGenerate.TableName);\n            return sqlGenerate;\n        }\n\n        protected override SqlGenerate Min(MemberExpression expression, SqlGenerate sqlGenerate)\n        {\n            sqlGenerate.Sql.AppendFormat(\"select min({0}) from {1}\", expression.Member.Name.ParamSql(sqlGenerate), sqlGenerate.TableName);\n            return sqlGenerate;\n        }\n\n        protected override SqlGenerate Avg(MemberExpression expression, SqlGenerate sqlGenerate)\n        {\n            sqlGenerate.Sql.AppendFormat(\"select avg({0}) from {1}\", expression.Member.Name.ParamSql(sqlGenerate), sqlGenerate.TableName);\n            return sqlGenerate;\n        }\n\n        protected override SqlGenerate Count(MemberExpression expression, SqlGenerate sqlGenerate)\n        {\n            sqlGenerate.Sql.AppendFormat(\"select count({0}) from {1}\", expression.Member.Name.ParamSql(sqlGenerate), sqlGenerate.TableName);\n            return sqlGenerate;\n        }\n\n        protected override SqlGenerate Sum(MemberExpression expression, SqlGenerate sqlGenerate)\n        {\n            sqlGenerate.Sql.AppendFormat(\"select sum({0}) from {1}\", expression.Member.Name.ParamSql(sqlGenerate), sqlGenerate.TableName);\n            return sqlGenerate;\n        }\n\n        /// <summary>\n        /// 是否是集合方法\n        /// </summary>\n        /// <param name=\"m\"></param>\n        /// <returns></returns>\n        internal static bool IsEnumerable(MemberExpression m)\n        {\n            return m.Type.IsOrHasGenericInterfaceTypeOf(typeof(IEnumerable<>))\n                && m.Type != typeof(string);\n        }\n    }\n}"
  },
  {
    "path": "src/Overt.Core.Data/Expressions/SqlExpression/Resolve/MethodCallSqlExpression.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq.Expressions;\n\nnamespace Overt.Core.Data.Expressions\n{\n    class MethodCallSqlExpression : BaseSqlExpression<MethodCallExpression>\n    {\n        static Dictionary<string, Action<MethodCallExpression, SqlGenerate>> _Methods = new Dictionary<string, Action<MethodCallExpression, SqlGenerate>>\n        {\n            {\"In\", In},\n            {\"Equals\", Equals},\n            {\"Contains\", Contains},\n            {\"StartsWith\", StartsWith},\n            {\"EndsWith\", EndsWith},\n            {\"Format\", Format}\n        };\n\n        private static new void In(MethodCallExpression expression, SqlGenerate sqlGenerate)\n        {\n            SqlExpressionProvider.Where(expression.Arguments[0], sqlGenerate);\n            sqlGenerate += \" in \";\n            SqlExpressionProvider.In(expression.Arguments[1], sqlGenerate);\n        }\n\n        private static void Equals(MethodCallExpression expression, SqlGenerate sqlGenerate)\n        {\n            SqlExpressionProvider.Where(expression.Object, sqlGenerate);\n            sqlGenerate += \" = \";\n            SqlExpressionProvider.Where(expression.Arguments[0], sqlGenerate);\n        }\n\n        private static void Contains(MethodCallExpression expression, SqlGenerate sqlGenerate)\n        {\n            if (IsStaticArrayMethod(expression))\n            {\n                DoStaticArrayMethodCall(expression, sqlGenerate);\n                return;\n            }\n            if (IsEnumerableMethod(expression))\n            {\n                DoEnumerableMethodCall(expression, sqlGenerate);\n                return;\n            }\n\n            SqlExpressionProvider.Where(expression.Object, sqlGenerate);\n            sqlGenerate += \" like \";\n            var val = SqlExpressionCompiler.Evaluate(expression.Arguments[0]);\n            sqlGenerate.AddDbParameter($\"%{val}%\");\n        }\n\n        private static void EndsWith(MethodCallExpression expression, SqlGenerate sqlGenerate)\n        {\n            SqlExpressionProvider.Where(expression.Object, sqlGenerate);\n            //SqlExpressionProvider.Where(expression.Arguments[0], sqlGenerate);\n            sqlGenerate += \" like \";\n\n            var val = SqlExpressionCompiler.Evaluate(expression.Arguments[0]);\n            sqlGenerate.AddDbParameter($\"%{val}\");\n        }\n\n        private static void StartsWith(MethodCallExpression expression, SqlGenerate sqlGenerate)\n        {\n            SqlExpressionProvider.Where(expression.Object, sqlGenerate);\n            //SqlExpressionProvider.Where(expression.Arguments[0], sqlGenerate);\n            sqlGenerate += \" like \";\n\n            var val = SqlExpressionCompiler.Evaluate(expression.Arguments[0]);\n            sqlGenerate.AddDbParameter($\"{val}%\");\n        }\n\n        private static void Format(MethodCallExpression expression, SqlGenerate sqlGenerate)\n        {\n            var formatString = SqlExpressionCompiler.Evaluate(expression.Arguments[0]);\n            var formatArgs = new List<string>();\n            var args = expression.Arguments;\n            if (args.Count > 1)\n            {\n                for (int i = 1; i < args.Count; i++)\n                {\n                    var val = SqlExpressionCompiler.Evaluate(expression.Arguments[i]);\n                    formatArgs.Add(val?.ToString());\n                }\n            }\n            sqlGenerate += string.Format(formatString.ToString(), formatArgs.ToArray());\n        }\n\n        protected override SqlGenerate Where(MethodCallExpression expression, SqlGenerate sqlGenerate)\n        {\n            var key = expression.Method;\n            if (key.IsGenericMethod)\n                key = key.GetGenericMethodDefinition();\n\n            Action<MethodCallExpression, SqlGenerate> action;\n            if (_Methods.TryGetValue(key.Name, out action))\n            {\n                action(expression, sqlGenerate);\n                return sqlGenerate;\n            }\n\n            throw new NotImplementedException(\"无法解析方法\" + expression.Method);\n        }\n\n        protected override SqlGenerate Update(MethodCallExpression expression, SqlGenerate sqlGenerate)\n        {\n            var key = expression.Method;\n            if (key.IsGenericMethod)\n                key = key.GetGenericMethodDefinition();\n\n            Action<MethodCallExpression, SqlGenerate> action;\n            if (_Methods.TryGetValue(key.Name, out action))\n            {\n                action(expression, sqlGenerate);\n                return sqlGenerate;\n            }\n\n            throw new NotImplementedException(\"无法解析方法\" + expression.Method);\n        }\n\n\n        #region Internal Method\n\n        internal static void DoEnumerableMethodCall(MethodCallExpression expression, SqlGenerate sqlGenerate)\n        {\n            SqlExpressionProvider.Where(expression.Arguments[0], sqlGenerate);\n            sqlGenerate += \" in \";\n            SqlExpressionProvider.In(expression.Object, sqlGenerate);\n        }\n\n        internal static void DoStaticArrayMethodCall(MethodCallExpression expression, SqlGenerate sqlGenerate)\n        {\n            SqlExpressionProvider.Where(expression.Arguments[expression.Arguments.Count - 1], sqlGenerate);\n            sqlGenerate += \" in \";\n\n            var memberExpr = expression.Arguments[0];\n            if (memberExpr.NodeType == ExpressionType.MemberAccess)\n                memberExpr = expression.Arguments[0] as MemberExpression;\n\n            SqlExpressionProvider.In(memberExpr, sqlGenerate);\n        }\n\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Expressions/SqlExpression/Resolve/NewArraySqlExpression.cs",
    "content": "﻿using System.Collections.Generic;\nusing System.Linq.Expressions;\n\nnamespace Overt.Core.Data.Expressions\n{\n    class NewArraySqlExpression : BaseSqlExpression<NewArrayExpression>\n    {\n        protected override SqlGenerate In(NewArrayExpression expression, SqlGenerate sqlGenerate)\n        {\n            var list = new List<object>();\n            foreach (var expressionItem in expression.Expressions)\n            {\n                var obj = SqlExpressionCompiler.Evaluate(expressionItem);\n                list.Add(obj);\n            }\n            sqlGenerate.AddDbParameter(list);\n            return sqlGenerate;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Expressions/SqlExpression/Resolve/NewSqlExpression.cs",
    "content": "﻿using System.Linq.Expressions;\nusing System.Reflection;\n\nnamespace Overt.Core.Data.Expressions\n{\n    class NewSqlExpression : BaseSqlExpression<NewExpression>\n    {\n        protected override SqlGenerate Update(NewExpression expression, SqlGenerate sqlGenerate)\n        {\n            for (int i = 0; i < expression.Members.Count; i++)\n            {\n                var m = expression.Members[i];\n                sqlGenerate += $\"{m.Name.ParamSql(sqlGenerate)} = \";\n\n                var val = SqlExpressionCompiler.Evaluate(expression.Arguments[i]);\n                sqlGenerate.AddDbParameter(val);\n                sqlGenerate += \",\";\n            }\n            if (sqlGenerate[sqlGenerate.Length - 1] == ',')\n                sqlGenerate.Sql.Remove(sqlGenerate.Length - 1, 1);\n            \n            return sqlGenerate;\n        }\n\n        protected override SqlGenerate Select(NewExpression expression, SqlGenerate sqlGenerate)\n        {\n            foreach (Expression item in expression.Arguments)\n            {\n                SqlExpressionProvider.Select(item, sqlGenerate);\n            }\n            return sqlGenerate;\n        }\n\n        protected override SqlGenerate OrderBy(NewExpression expression, SqlGenerate sqlGenerate)\n        {\n            foreach (Expression item in expression.Arguments)\n            {\n                SqlExpressionProvider.OrderBy(item, sqlGenerate);\n                sqlGenerate += \",\";\n            }\n            if (sqlGenerate[sqlGenerate.Length - 1] == ',')\n                sqlGenerate.Sql.Remove(sqlGenerate.Length - 1, 1);\n\n            return sqlGenerate;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Expressions/SqlExpression/Resolve/UnarySqlExpression.cs",
    "content": "﻿using System.Linq.Expressions;\n\nnamespace Overt.Core.Data.Expressions\n{\n    class UnarySqlExpression : BaseSqlExpression<UnaryExpression>\n    {\n        protected override SqlGenerate Select(UnaryExpression expression, SqlGenerate sqlGenerate)\n        {\n            SqlExpressionProvider.Select(expression.Operand, sqlGenerate);\n            return sqlGenerate;\n        }\n\n        protected override SqlGenerate Where(UnaryExpression expression, SqlGenerate sqlGenerate)\n        {\n            SqlExpressionProvider.Where(expression.Operand, sqlGenerate);\n            switch (expression.NodeType)\n            {\n                case ExpressionType.Not:\n                    if (expression.Operand is MethodCallExpression)\n                    {\n                        if (IsStaticArrayMethod(expression.Operand as MethodCallExpression) ||\n                            IsEnumerableMethod(expression.Operand as MethodCallExpression))\n                        {\n                            sqlGenerate.RelaceLast(\"in\", \"not in\");\n                        }\n                        else\n                        {\n                            sqlGenerate.RelaceLast(\"like\", \"not like\");\n                        }\n                    }\n                    else\n                        sqlGenerate += \" = 0\";\n                    break;\n            }\n\n            return sqlGenerate;\n        }\n\n        protected override SqlGenerate OrderBy(UnaryExpression expression, SqlGenerate sqlGenerate)\n        {\n            SqlExpressionProvider.OrderBy(expression.Operand, sqlGenerate);\n            return sqlGenerate;\n        }\n\n        protected override SqlGenerate Max(UnaryExpression expression, SqlGenerate sqlGenerate)\n        {\n            SqlExpressionProvider.Max(expression.Operand, sqlGenerate);\n            return sqlGenerate;\n        }\n\n        protected override SqlGenerate Min(UnaryExpression expression, SqlGenerate sqlGenerate)\n        {\n            SqlExpressionProvider.Min(expression.Operand, sqlGenerate);\n            return sqlGenerate;\n        }\n\n        protected override SqlGenerate Avg(UnaryExpression expression, SqlGenerate sqlGenerate)\n        {\n            SqlExpressionProvider.Avg(expression.Operand, sqlGenerate);\n            return sqlGenerate;\n        }\n\n        protected override SqlGenerate Count(UnaryExpression expression, SqlGenerate sqlGenerate)\n        {\n            SqlExpressionProvider.Count(expression.Operand, sqlGenerate);\n            return sqlGenerate;\n        }\n\n        protected override SqlGenerate Sum(UnaryExpression expression, SqlGenerate sqlGenerate)\n        {\n            SqlExpressionProvider.Sum(expression.Operand, sqlGenerate);\n            return sqlGenerate;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Expressions/SqlExpression/SqlExpression.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq.Expressions;\n\nnamespace Overt.Core.Data.Expressions\n{\n    /// <summary>\n    /// Expression => Sql \n    /// </summary>\n    public static class SqlExpression\n    {\n        /// <summary>\n        /// \n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"dbType\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"returnLastIdentity\"></param>\n        /// <returns></returns>\n        public static SqlExpressionCore<T> Insert<T>(DatabaseType dbType, string tableName = \"\", bool returnLastIdentity = false)\n        {\n            return new SqlExpressionCore<T>(dbType, tableName).Insert(returnLastIdentity);\n        }\n\n        /// <summary>\n        /// 删除\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"dbType\">数据库类型</param>\n        /// <param name=\"tableName\"></param>\n        /// <returns></returns>\n        public static SqlExpressionCore<T> Delete<T>(DatabaseType dbType, string tableName = \"\")\n        {\n            return new SqlExpressionCore<T>(dbType, tableName).Delete();\n        }\n\n        /// <summary>\n        /// 修改\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"dbType\">数据库类型</param>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <returns></returns>\n        public static SqlExpressionCore<T> Update<T>(DatabaseType dbType, Expression<Func<object>> expression = null, string tableName = \"\")\n        {\n            return new SqlExpressionCore<T>(dbType, tableName).Update(expression);\n        }\n\n        /// <summary>\n        /// 修改\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"dbType\">数据库类型</param>\n        /// <param name=\"fields\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <returns></returns>\n        public static SqlExpressionCore<T> Update<T>(DatabaseType dbType, IEnumerable<string> fields = null, string tableName = \"\")\n        {\n            return new SqlExpressionCore<T>(dbType, tableName).Update(fields);\n        }\n\n        /// <summary>\n        /// 查询\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"dbType\">数据库类型</param>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <returns></returns>\n        public static SqlExpressionCore<T> Select<T>(DatabaseType dbType, Expression<Func<T, object>> expression = null, string tableName = \"\")\n        {\n            return new SqlExpressionCore<T>(dbType, tableName).Select(expression);\n        }\n\n        /// <summary>\n        /// 数量\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"dbType\">数据库类型</param>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <returns></returns>\n        public static SqlExpressionCore<T> Count<T>(DatabaseType dbType, Expression<Func<T, object>> expression = null, string tableName = \"\")\n        {\n            return new SqlExpressionCore<T>(dbType, tableName).Count(expression);\n        }\n\n        /// <summary>\n        /// 最大\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"dbType\">数据库类型</param>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <returns></returns>\n        public static SqlExpressionCore<T> Max<T>(DatabaseType dbType, Expression<Func<T, object>> expression, string tableName = \"\")\n        {\n            return new SqlExpressionCore<T>(dbType, tableName).Max(expression);\n        }\n\n        /// <summary>\n        /// 最小\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"dbType\">数据库类型</param>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <returns></returns>\n        public static SqlExpressionCore<T> Min<T>(DatabaseType dbType, Expression<Func<T, object>> expression, string tableName = \"\")\n        {\n            return new SqlExpressionCore<T>(dbType, tableName).Min(expression);\n        }\n\n        /// <summary>\n        /// 平均值\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"dbType\">数据库类型</param>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <returns></returns>\n        public static SqlExpressionCore<T> Avg<T>(DatabaseType dbType, Expression<Func<T, object>> expression, string tableName = \"\")\n        {\n            return new SqlExpressionCore<T>(dbType, tableName).Avg(expression);\n        }\n\n        /// <summary>\n        /// 求和\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"dbType\">数据库类型</param>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <returns></returns>\n        public static SqlExpressionCore<T> Sum<T>(DatabaseType dbType, Expression<Func<T, object>> expression, string tableName = \"\")\n        {\n            return new SqlExpressionCore<T>(dbType, tableName).Sum(expression);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Expressions/SqlExpression/SqlExpressionCompiler.cs",
    "content": "﻿using System;\nusing System.Linq.Expressions;\nusing static Overt.Core.Data.Expressions.SqlExpressionFingerprint;\n\nnamespace Overt.Core.Data.Expressions\n{\n    /// <summary>\n    /// 参数编译器 \n    /// base ServiceStack\n    /// </summary>\n    public static class SqlExpressionCompiler\n    {\n        private static readonly ParameterExpression _unusedParameterExpr = Expression.Parameter(typeof(object), \"_unused\");\n\n        /// <summary>\n        /// 编译\n        /// </summary>\n        /// <typeparam name=\"TModel\"></typeparam>\n        /// <typeparam name=\"TValue\"></typeparam>\n        /// <param name=\"lambdaExpression\"></param>\n        /// <returns></returns>\n        public static Func<TModel, TValue> Compile<TModel, TValue>(this Expression<Func<TModel, TValue>> lambdaExpression)\n        {\n            if (lambdaExpression == null)\n                throw new ArgumentNullException(nameof(lambdaExpression));\n\n            return ExpressionCompiler.Process(lambdaExpression);\n        }\n        /// <summary>\n        /// 编译\n        /// </summary>\n        /// <param name=\"arg\"></param>\n        /// <returns></returns>\n        public static object Evaluate(Expression arg)\n        {\n            if (arg == null)\n                throw new ArgumentNullException(nameof(arg));\n\n            var func = Wrap(arg);\n            return func(null);\n        }\n\n        private static Func<object, object> Wrap(Expression arg)\n        {\n            var lambdaExpr = Expression.Lambda<Func<object, object>>(Expression.Convert(arg, typeof(object)), _unusedParameterExpr);\n            return ExpressionCompiler.Process(lambdaExpr);\n        }\n    }\n}"
  },
  {
    "path": "src/Overt.Core.Data/Expressions/SqlExpression/SqlExpressionCore.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.Linq;\nusing System.Linq.Expressions;\nusing System.Text;\n\nnamespace Overt.Core.Data.Expressions\n{\n    /// <summary>\n    /// Expression核心\n    /// </summary>\n    /// <typeparam name=\"T\"></typeparam>\n    public class SqlExpressionCore<T>\n    {\n        private SqlGenerate sqlGenerate = new SqlGenerate();\n        /// <summary>\n        /// 脚本\n        /// </summary>\n\t\tpublic string Script { get { return sqlGenerate.ToString(); } }\n        /// <summary>\n        /// 参数\n        /// </summary>\n        public Dictionary<string, object> DbParams { get { return sqlGenerate.DbParams; } }\n\n        /// <summary>\n        /// 构造函数\n        /// </summary>\n        /// <param name=\"dbType\"></param>\n        /// <param name=\"tableName\"></param>\n        public SqlExpressionCore(DatabaseType dbType, string tableName = \"\")\n        {\n            if (string.IsNullOrEmpty(tableName))\n                tableName = typeof(T).Name;\n\n            sqlGenerate.DatabaseType = dbType;\n            sqlGenerate.TableName = tableName.ParamSql(dbType);\n        }\n\n        /// <summary>\n        /// 清除\n        /// </summary>\n        public void Clear()\n        {\n            sqlGenerate.Clear();\n        }\n\n        /// <summary>\n        /// 新增\n        /// </summary>\n        /// <param name=\"returnLastIdentity\"></param>\n        /// <returns></returns>\n        public SqlExpressionCore<T> Insert(bool returnLastIdentity)\n        {\n            var addFields = new List<string>();\n            var atFields = new List<string>();\n\n            var identityPi = typeof(T).GetIdentityField();\n            var customPis = typeof(T).GetCustomFields();\n            var pis = typeof(T).GetProperties();\n            foreach (var pi in pis)\n            {\n                if (identityPi?.Name == pi.Name)\n                    continue;\n\n                addFields.Add($\"{pi.Name.ParamSql(sqlGenerate.DatabaseType)}\");\n                atFields.Add($\"{pi.Name.ParamValue(sqlGenerate.DatabaseType, customPis)}\");\n            }\n\n            sqlGenerate.Clear();\n            sqlGenerate += $\"insert into {sqlGenerate.TableName}({string.Join(\", \", addFields)}) values({string.Join(\", \", atFields)});\";\n            if (identityPi != null && returnLastIdentity)\n                sqlGenerate += sqlGenerate.DatabaseType.SelectLastIdentity();\n\n            return this;\n        }\n\n        /// <summary>\n        /// 查询\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <param name=\"orderBy\">排序字段</param>\n        /// <returns></returns>\n        public SqlExpressionCore<T> Select(Expression<Func<T, object>> expression = null, string orderBy = \"\")\n        {\n            var sql = $\"select {{0}}{Environment.NewLine}from {sqlGenerate.TableName}\";\n            var fields = string.Empty;\n\n            if (expression == null)\n                fields = \"*\";\n            else\n            {\n                SqlExpressionProvider.Select(expression, sqlGenerate);\n                fields = sqlGenerate.SelectFieldsStr;\n            }\n\n            sqlGenerate.Sql.AppendFormat(sql, fields);\n            return this;\n        }\n\n        /// <summary>\n        /// Where条件\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <returns></returns>\n        public SqlExpressionCore<T> Where(Expression<Func<T, bool>> expression)\n        {\n            if (expression == null)\n                return this;\n\n            sqlGenerate += $\"{Environment.NewLine}where\";\n            SqlExpressionProvider.Where(expression, sqlGenerate);\n            return this;\n        }\n\n        /// <summary>\n        /// OrderBy\n        /// </summary>\n        /// <param name=\"orderBy\"></param>\n        /// <returns></returns>\n        public SqlExpressionCore<T> OrderBy(string orderBy)\n        {\n            if (string.IsNullOrEmpty(orderBy))\n            {\n                var property = typeof(T).GetProperty<KeyAttribute>();\n                if (property == null)\n                    property = typeof(T).GetProperties()[0];\n\n                var propertyName = property.Name;\n                if (sqlGenerate.DatabaseType == DatabaseType.PostgreSQL)\n                    propertyName = $\"\\\"{propertyName}\\\"\";\n                orderBy = $\"order by {propertyName} desc\";\n            }\n\n            if (!orderBy.StartsWith(\"order by\"))\n                orderBy = $\"order by {orderBy}\";\n\n            switch (sqlGenerate.DatabaseType)\n            {\n                case DatabaseType.SqlServer: // 2012版本支持 内部数据库版本706 【select DATABASEPROPERTYEX('master','version')】\n                    sqlGenerate.Sql.Replace(\"select\", $\"select row_number() over({orderBy}) as RowNumber,\");\n                    break;\n                case DatabaseType.GteSqlServer2012:\n                    sqlGenerate += $\"{Environment.NewLine}{orderBy}\";\n                    break;\n                case DatabaseType.MySql:\n                    sqlGenerate += $\"{Environment.NewLine}{orderBy}\";\n                    break;\n                case DatabaseType.SQLite:\n                    sqlGenerate += $\"{Environment.NewLine}{orderBy}\";\n                    break;\n                case DatabaseType.PostgreSQL:\n                    sqlGenerate += $\"{Environment.NewLine}{orderBy}\";\n                    break;\n            }\n            return this;\n        }\n\n        /// <summary>\n        /// Top1\n        /// </summary>\n        /// <returns></returns>\n        public SqlExpressionCore<T> TopOne()\n        {\n            switch (sqlGenerate.DatabaseType)\n            {\n                case DatabaseType.SqlServer: // 2012版本支持 内部数据库版本706 【select DATABASEPROPERTYEX('master','version')】\n                    sqlGenerate.Sql.Replace(\"select\", $\"select top 1{Environment.NewLine}\");\n                    break;\n                case DatabaseType.GteSqlServer2012:\n                    sqlGenerate.Sql.Replace(\"select\", $\"select top 1{Environment.NewLine}\");\n                    break;\n                case DatabaseType.MySql:\n                    sqlGenerate += $\"{Environment.NewLine}limit 1\";\n                    break;\n                case DatabaseType.SQLite:\n                    sqlGenerate += $\"{Environment.NewLine}limit 1\";\n                    break;\n                case DatabaseType.PostgreSQL:\n                    sqlGenerate += $\"{Environment.NewLine}limit 1\";\n                    break;\n            }\n            return this;\n        }\n\n        /// <summary>\n        /// Limit\n        /// </summary>\n        /// <param name=\"page\"></param>\n        /// <param name=\"rows\"></param>\n        /// <returns></returns>\n        public SqlExpressionCore<T> Limit(int page, int rows)\n        {\n            var skip = (page - 1) * rows;\n            switch (sqlGenerate.DatabaseType)\n            {\n                case DatabaseType.SqlServer:\n                    sqlGenerate.Sql = new StringBuilder($\"SELECT it.* FROM ({sqlGenerate.Sql}) it where it.RowNumber > {skip} AND it.RowNumber <= {page * rows}\");\n                    break;\n                case DatabaseType.GteSqlServer2012:\n                    sqlGenerate += $\" OFFSET {skip} ROW FETCH NEXT {rows} rows only\";\n                    break;\n                case DatabaseType.MySql:\n                    sqlGenerate += $\" limit {skip}, {rows}\";\n                    break;\n                case DatabaseType.SQLite:\n                    sqlGenerate += $\" limit {rows} offset {skip}\";\n                    break;\n                case DatabaseType.PostgreSQL:\n                    sqlGenerate += $\" limit {rows} offset {skip}\";\n                    break;\n                default:\n                    break;\n            }\n            return this;\n        }\n\n        /// <summary>\n        /// Offset\n        /// </summary>\n        /// <param name=\"offset\"></param>\n        /// <param name=\"size\"></param>\n        /// <returns></returns>\n        public SqlExpressionCore<T> Offset(int offset, int size)\n        {\n            switch (sqlGenerate.DatabaseType)\n            {\n                case DatabaseType.SqlServer:\n                    sqlGenerate.Sql = new StringBuilder($\"SELECT it.* FROM ({sqlGenerate.Sql}) it where it.RowNumber > {offset} AND it.RowNumber <= {offset + size}\");\n                    break;\n                case DatabaseType.GteSqlServer2012:\n                    sqlGenerate += $\" OFFSET {offset} ROW FETCH NEXT {size} rows only\";\n                    break;\n                case DatabaseType.MySql:\n                    sqlGenerate += $\" limit {offset}, {size}\";\n                    break;\n                case DatabaseType.SQLite:\n                    sqlGenerate += $\" limit {size} offset {offset}\";\n                    break;\n                case DatabaseType.PostgreSQL:\n                    sqlGenerate += $\" limit {size} offset {offset}\";\n                    break;\n                default:\n                    break;\n            }\n            return this;\n        }\n\n        /// <summary>\n        /// 最大\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <returns></returns>\n        public SqlExpressionCore<T> Max(Expression<Func<T, object>> expression)\n        {\n            sqlGenerate.Clear();\n            SqlExpressionProvider.Max(expression, sqlGenerate);\n            return this;\n        }\n\n        /// <summary>\n        /// 最小值\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <returns></returns>\n        public SqlExpressionCore<T> Min(Expression<Func<T, object>> expression)\n        {\n            sqlGenerate.Clear();\n            SqlExpressionProvider.Min(expression, sqlGenerate);\n            return this;\n        }\n\n        /// <summary>\n        /// 平均值\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <returns></returns>\n        public SqlExpressionCore<T> Avg(Expression<Func<T, object>> expression)\n        {\n            sqlGenerate.Clear();\n            SqlExpressionProvider.Avg(expression, sqlGenerate);\n            return this;\n        }\n\n        /// <summary>\n        /// 行数\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <returns></returns>\n        public SqlExpressionCore<T> Count(Expression<Func<T, object>> expression = null)\n        {\n            sqlGenerate.Clear();\n            if (expression == null)\n                sqlGenerate.Sql.Append($\"select count(*) from {sqlGenerate.TableName}\");\n            else\n                SqlExpressionProvider.Count(expression, this.sqlGenerate);\n\n            return this;\n        }\n\n        /// <summary>\n        /// 总计\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <returns></returns>\n        public SqlExpressionCore<T> Sum(Expression<Func<T, object>> expression)\n        {\n            sqlGenerate.Clear();\n            SqlExpressionProvider.Sum(expression, sqlGenerate);\n            return this;\n        }\n\n        /// <summary>\n        /// 删除\n        /// </summary>\n        /// <returns></returns>\n        public SqlExpressionCore<T> Delete()\n        {\n            sqlGenerate.Clear();\n            sqlGenerate += $\"delete from {sqlGenerate.TableName}\";\n            return this;\n        }\n\n        /// <summary>\n        /// 修改\n        /// </summary>\n        /// <param name=\"expression\"></param>\n        /// <returns></returns>\n        public SqlExpressionCore<T> Update(Expression<Func<object>> expression = null)\n        {\n            sqlGenerate.Clear();\n            sqlGenerate += $\"update {sqlGenerate.TableName} set \";\n            SqlExpressionProvider.Update(expression, sqlGenerate);\n            return this;\n        }\n\n        /// <summary>\n        /// 修改\n        /// </summary>\n        /// <param name=\"fields\"></param>\n        /// <returns></returns>\n        public SqlExpressionCore<T> Update(IEnumerable<string> fields = null)\n        {\n            var setFields = new List<string>();\n            var whereFields = new List<string>();\n\n            var pis = typeof(T).GetProperties();\n            var customPis = typeof(T).GetCustomFields();\n            foreach (var pi in pis)\n            {\n                var obs = pi.GetCustomAttributes(typeof(KeyAttribute), false);\n                if (obs?.Count() > 0)\n                    whereFields.Add($\"{pi.Name.ParamSql(sqlGenerate.DatabaseType)} = @{pi.Name}\");\n                else\n                {\n                    if ((fields?.Count() ?? 0) <= 0 || fields.Contains(pi.Name))\n                        setFields.Add($\"{pi.Name.ParamSql(sqlGenerate.DatabaseType)} = {pi.Name.ParamValue(sqlGenerate.DatabaseType, customPis)}\");\n                }\n            }\n            if (whereFields.Count <= 0)\n                throw new Exception($\"实体未设置主键Key属性\");\n            if (setFields.Count <= 0)\n                throw new Exception($\"实体未标记任何更新字段\");\n\n            sqlGenerate.Clear();\n            sqlGenerate += $\"update {sqlGenerate.TableName} set {string.Join(\", \", setFields)} where {string.Join(\", \", whereFields)}\";\n            return this;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Expressions/SqlExpression/SqlExpressionFingerprint.cs",
    "content": "﻿using System;\nusing System.Collections;\nusing System.Collections.Concurrent;\nusing System.Collections.Generic;\nusing System.Linq.Expressions;\nusing System.Reflection;\nusing System.Text;\n\nnamespace Overt.Core.Data.Expressions\n{\n    /// <summary>\n    /// base ServiceStack\n    /// </summary>\n    public class SqlExpressionFingerprint\n    {\n        internal sealed class BinaryExpressionFingerprint : ExpressionFingerprint\n        {\n            public BinaryExpressionFingerprint(ExpressionType nodeType, Type type, MethodInfo method)\n                : base(nodeType, type)\n            {\n                // Other properties on BinaryExpression (like IsLifted / IsLiftedToNull) are simply derived\n                // from Type and NodeType, so they're not necessary for inclusion in the fingerprint.\n\n                Method = method;\n            }\n\n            // http://msdn.microsoft.com/en-us/library/system.linq.expressions.binaryexpression.method.aspx\n            public MethodInfo Method { get; private set; }\n\n            public override bool Equals(object obj)\n            {\n                BinaryExpressionFingerprint other = obj as BinaryExpressionFingerprint;\n                return (other != null)\n                       && Equals(this.Method, other.Method)\n                       && this.Equals(other);\n            }\n\n            public override int GetHashCode()\n            {\n                return base.GetHashCode();\n            }\n\n            internal override void AddToHashCodeCombiner(HashCodeCombiner combiner)\n            {\n                combiner.AddObject(Method);\n                base.AddToHashCodeCombiner(combiner);\n            }\n        }\n\n        internal static class ExpressionCompiler\n        {\n            // This is the entry point to the cached expression compilation system. The system\n            // will try to turn the expression into an actual delegate as quickly as possible,\n            // relying on cache lookups and other techniques to save time if appropriate.\n            // If the provided expression is particularly obscure and the system doesn't know\n            // how to handle it, we'll just compile the expression as normal.\n            public static Func<TModel, TValue> Process<TModel, TValue>(Expression<Func<TModel, TValue>> lambdaExpression)\n            {\n                return Compiler<TModel, TValue>.Compile(lambdaExpression);\n            }\n\n            private static class Compiler<TIn, TOut>\n            {\n                private static Func<TIn, TOut> _identityFunc;\n\n                private static readonly ConcurrentDictionary<MemberInfo, Func<TIn, TOut>> _simpleMemberAccessDict =\n                    new ConcurrentDictionary<MemberInfo, Func<TIn, TOut>>();\n\n                private static readonly ConcurrentDictionary<MemberInfo, Func<object, TOut>> _constMemberAccessDict =\n                    new ConcurrentDictionary<MemberInfo, Func<object, TOut>>();\n\n                private static readonly ConcurrentDictionary<ExpressionFingerprintChain, Hoisted<TIn, TOut>> _fingerprintedCache =\n                    new ConcurrentDictionary<ExpressionFingerprintChain, Hoisted<TIn, TOut>>();\n\n                public static Func<TIn, TOut> Compile(Expression<Func<TIn, TOut>> expr)\n                {\n                    return CompileFromIdentityFunc(expr)\n                           ?? CompileFromConstLookup(expr)\n                           ?? CompileFromMemberAccess(expr)\n                           ?? CompileFromFingerprint(expr)\n                           ?? CompileSlow(expr);\n                }\n\n                private static Func<TIn, TOut> CompileFromConstLookup(Expression<Func<TIn, TOut>> expr)\n                {\n                    ConstantExpression constExpr = expr.Body as ConstantExpression;\n                    if (constExpr != null)\n                    {\n                        // model => {const}\n\n                        TOut constantValue = (TOut)constExpr.Value;\n                        return _ => constantValue;\n                    }\n\n                    return null;\n                }\n\n                private static Func<TIn, TOut> CompileFromIdentityFunc(Expression<Func<TIn, TOut>> expr)\n                {\n                    if (expr.Body == expr.Parameters[0])\n                    {\n                        // model => model\n\n                        // don't need to lock, as all identity funcs are identical\n                        if (_identityFunc == null)\n                        {\n                            _identityFunc = expr.Compile();\n                        }\n\n                        return _identityFunc;\n                    }\n\n                    return null;\n                }\n\n                private static Func<TIn, TOut> CompileFromFingerprint(Expression<Func<TIn, TOut>> expr)\n                {\n                    List<object> capturedConstants;\n                    ExpressionFingerprintChain fingerprint = FingerprintingExpressionVisitor.GetFingerprintChain(expr, out capturedConstants);\n\n                    if (fingerprint != null)\n                    {\n                        var del = _fingerprintedCache.GetOrAdd(fingerprint, _ =>\n                        {\n                            // Fingerprinting succeeded, but there was a cache miss. Rewrite the expression\n                            // and add the rewritten expression to the cache.\n\n                            var hoistedExpr = HoistingExpressionVisitor<TIn, TOut>.Hoist(expr);\n                            return hoistedExpr.Compile();\n                        });\n                        return model => del(model, capturedConstants);\n                    }\n\n                    // couldn't be fingerprinted\n                    return null;\n                }\n\n                private static Func<TIn, TOut> CompileFromMemberAccess(Expression<Func<TIn, TOut>> expr)\n                {\n                    // Performance tests show that on the x64 platform, special-casing static member and\n                    // captured local variable accesses is faster than letting the fingerprinting system\n                    // handle them. On the x86 platform, the fingerprinting system is faster, but only\n                    // by around one microsecond, so it's not worth it to complicate the logic here with\n                    // an architecture check.\n\n                    MemberExpression memberExpr = expr.Body as MemberExpression;\n                    if (memberExpr != null)\n                    {\n                        if (memberExpr.Expression == expr.Parameters[0] || memberExpr.Expression == null)\n                        {\n                            // model => model.Member or model => StaticMember\n                            return _simpleMemberAccessDict.GetOrAdd(memberExpr.Member, _ => expr.Compile());\n                        }\n\n                        ConstantExpression constExpr = memberExpr.Expression as ConstantExpression;\n                        if (constExpr != null)\n                        {\n                            // model => {const}.Member (captured local variable)\n                            var del = _constMemberAccessDict.GetOrAdd(memberExpr.Member, _ =>\n                            {\n                                // rewrite as capturedLocal => ((TDeclaringType)capturedLocal).Member\n                                var constParamExpr = Expression.Parameter(typeof(object), \"capturedLocal\");\n                                var constCastExpr = Expression.Convert(constParamExpr, memberExpr.Member.DeclaringType);\n                                var newMemberAccessExpr = memberExpr.Update(constCastExpr);\n                                var newLambdaExpr = Expression.Lambda<Func<object, TOut>>(newMemberAccessExpr, constParamExpr);\n                                return newLambdaExpr.Compile();\n                            });\n\n                            object capturedLocal = constExpr.Value;\n                            return _ => del(capturedLocal);\n                        }\n                    }\n\n                    return null;\n                }\n\n                private static Func<TIn, TOut> CompileSlow(Expression<Func<TIn, TOut>> expr)\n                {\n                    // fallback compilation system - just compile the expression directly\n                    return expr.Compile();\n                }\n            }\n        }\n\n        internal sealed class ConditionalExpressionFingerprint : ExpressionFingerprint\n        {\n            public ConditionalExpressionFingerprint(ExpressionType nodeType, Type type)\n                : base(nodeType, type)\n            {\n                // There are no properties on ConditionalExpression that are worth including in\n                // the fingerprint.\n            }\n\n            public override bool Equals(object obj)\n            {\n                ConditionalExpressionFingerprint other = obj as ConditionalExpressionFingerprint;\n                return (other != null)\n                       && this.Equals(other);\n            }\n\n            public override int GetHashCode()\n            {\n                return base.GetHashCode();\n            }\n        }\n\n        internal sealed class ConstantExpressionFingerprint : ExpressionFingerprint\n        {\n            public ConstantExpressionFingerprint(ExpressionType nodeType, Type type)\n                : base(nodeType, type)\n            {\n                // There are no properties on ConstantExpression that are worth including in\n                // the fingerprint.\n            }\n\n            public override bool Equals(object obj)\n            {\n                ConstantExpressionFingerprint other = obj as ConstantExpressionFingerprint;\n                return (other != null)\n                       && this.Equals(other);\n            }\n\n            public override int GetHashCode()\n            {\n                return base.GetHashCode();\n            }\n        }\n\n        internal sealed class DefaultExpressionFingerprint : ExpressionFingerprint\n        {\n            public DefaultExpressionFingerprint(ExpressionType nodeType, Type type)\n                : base(nodeType, type)\n            {\n                // There are no properties on DefaultExpression that are worth including in\n                // the fingerprint.\n            }\n\n            public override bool Equals(object obj)\n            {\n                DefaultExpressionFingerprint other = obj as DefaultExpressionFingerprint;\n                return (other != null)\n                       && this.Equals(other);\n            }\n\n            public override int GetHashCode()\n            {\n                return base.GetHashCode();\n            }\n        }\n\n        internal abstract class ExpressionFingerprint\n        {\n            protected ExpressionFingerprint(ExpressionType nodeType, Type type)\n            {\n                NodeType = nodeType;\n                Type = type;\n            }\n\n            // the type of expression node, e.g. OP_ADD, MEMBER_ACCESS, etc.\n            public ExpressionType NodeType { get; private set; }\n\n            // the CLR type resulting from this expression, e.g. int, string, etc.\n            public Type Type { get; private set; }\n\n            internal virtual void AddToHashCodeCombiner(HashCodeCombiner combiner)\n            {\n                combiner.AddInt32((int)NodeType);\n                combiner.AddObject(Type);\n            }\n\n            protected bool Equals(ExpressionFingerprint other)\n            {\n                return (other != null)\n                       && (this.NodeType == other.NodeType)\n                       && Equals(this.Type, other.Type);\n            }\n\n            public override bool Equals(object obj)\n            {\n                return Equals(obj as ExpressionFingerprint);\n            }\n\n            public override int GetHashCode()\n            {\n                HashCodeCombiner combiner = new HashCodeCombiner();\n                AddToHashCodeCombiner(combiner);\n                return combiner.CombinedHash;\n            }\n        }\n\n        internal sealed class ExpressionFingerprintChain : IEquatable<ExpressionFingerprintChain>\n        {\n            public readonly List<ExpressionFingerprint> Elements = new List<ExpressionFingerprint>();\n\n            public bool Equals(ExpressionFingerprintChain other)\n            {\n                // Two chains are considered equal if two elements appearing in the same index in\n                // each chain are equal (value equality, not referential equality).\n\n                if (other == null)\n                {\n                    return false;\n                }\n\n                if (this.Elements.Count != other.Elements.Count)\n                {\n                    return false;\n                }\n\n                for (int i = 0; i < this.Elements.Count; i++)\n                {\n                    if (!Equals(this.Elements[i], other.Elements[i]))\n                    {\n                        return false;\n                    }\n                }\n\n                return true;\n            }\n\n            public override bool Equals(object obj)\n            {\n                return Equals(obj as ExpressionFingerprintChain);\n            }\n\n            public override int GetHashCode()\n            {\n                HashCodeCombiner combiner = new HashCodeCombiner();\n                Elements.ForEach(combiner.AddFingerprint);\n\n                return combiner.CombinedHash;\n            }\n        }\n\n        internal sealed class FingerprintingExpressionVisitor : ExpressionVisitor\n        {\n            private readonly List<object> _seenConstants = new List<object>();\n            private readonly List<ParameterExpression> _seenParameters = new List<ParameterExpression>();\n            private readonly ExpressionFingerprintChain _currentChain = new ExpressionFingerprintChain();\n            private bool _gaveUp;\n\n            private FingerprintingExpressionVisitor()\n            {\n            }\n\n            private T GiveUp<T>(T node)\n            {\n                // We don't understand this node, so just quit.\n\n                _gaveUp = true;\n                return node;\n            }\n\n            // Returns the fingerprint chain + captured constants list for this expression, or null\n            // if the expression couldn't be fingerprinted.\n            public static ExpressionFingerprintChain GetFingerprintChain(Expression expr, out List<object> capturedConstants)\n            {\n                FingerprintingExpressionVisitor visitor = new FingerprintingExpressionVisitor();\n                visitor.Visit(expr);\n\n                if (visitor._gaveUp)\n                {\n                    capturedConstants = null;\n                    return null;\n                }\n                else\n                {\n                    capturedConstants = visitor._seenConstants;\n                    return visitor._currentChain;\n                }\n            }\n\n            public override Expression Visit(Expression node)\n            {\n                if (node == null)\n                {\n                    _currentChain.Elements.Add(null);\n                    return null;\n                }\n                else\n                {\n                    return base.Visit(node);\n                }\n            }\n\n            protected override Expression VisitBinary(BinaryExpression node)\n            {\n                if (_gaveUp)\n                {\n                    return node;\n                }\n                _currentChain.Elements.Add(new BinaryExpressionFingerprint(node.NodeType, node.Type, node.Method));\n                return base.VisitBinary(node);\n            }\n\n            protected override Expression VisitBlock(BlockExpression node)\n            {\n                return GiveUp(node);\n            }\n\n            protected override CatchBlock VisitCatchBlock(CatchBlock node)\n            {\n                return GiveUp(node);\n            }\n\n            protected override Expression VisitConditional(ConditionalExpression node)\n            {\n                if (_gaveUp)\n                {\n                    return node;\n                }\n                _currentChain.Elements.Add(new ConditionalExpressionFingerprint(node.NodeType, node.Type));\n                return base.VisitConditional(node);\n            }\n\n            protected override Expression VisitConstant(ConstantExpression node)\n            {\n                if (_gaveUp)\n                {\n                    return node;\n                }\n\n                _seenConstants.Add(node.Value);\n                _currentChain.Elements.Add(new ConstantExpressionFingerprint(node.NodeType, node.Type));\n                return base.VisitConstant(node);\n            }\n\n            protected override Expression VisitDebugInfo(DebugInfoExpression node)\n            {\n                return GiveUp(node);\n            }\n\n            protected override Expression VisitDefault(DefaultExpression node)\n            {\n                if (_gaveUp)\n                {\n                    return node;\n                }\n                _currentChain.Elements.Add(new DefaultExpressionFingerprint(node.NodeType, node.Type));\n                return base.VisitDefault(node);\n            }\n\n            protected\n#if !ASP_NET_CORE\n        override\n#endif\n        Expression VisitDynamic(DynamicExpression node)\n            {\n                return GiveUp(node);\n            }\n\n            protected override ElementInit VisitElementInit(ElementInit node)\n            {\n                return GiveUp(node);\n            }\n\n            protected override Expression VisitExtension(Expression node)\n            {\n                return GiveUp(node);\n            }\n\n            protected override Expression VisitGoto(GotoExpression node)\n            {\n                return GiveUp(node);\n            }\n\n            protected override Expression VisitIndex(IndexExpression node)\n            {\n                if (_gaveUp)\n                {\n                    return node;\n                }\n                _currentChain.Elements.Add(new IndexExpressionFingerprint(node.NodeType, node.Type, node.Indexer));\n                return base.VisitIndex(node);\n            }\n\n            protected override Expression VisitInvocation(InvocationExpression node)\n            {\n                return GiveUp(node);\n            }\n\n            protected override Expression VisitLabel(LabelExpression node)\n            {\n                return GiveUp(node);\n            }\n\n            protected override LabelTarget VisitLabelTarget(LabelTarget node)\n            {\n                return GiveUp(node);\n            }\n\n            protected override Expression VisitLambda<T>(Expression<T> node)\n            {\n                if (_gaveUp)\n                {\n                    return node;\n                }\n                _currentChain.Elements.Add(new LambdaExpressionFingerprint(node.NodeType, node.Type));\n                return base.VisitLambda(node);\n            }\n\n            protected override Expression VisitListInit(ListInitExpression node)\n            {\n                return GiveUp(node);\n            }\n\n            protected override Expression VisitLoop(LoopExpression node)\n            {\n                return GiveUp(node);\n            }\n\n            protected override Expression VisitMember(MemberExpression node)\n            {\n                if (_gaveUp)\n                {\n                    return node;\n                }\n                _currentChain.Elements.Add(new MemberExpressionFingerprint(node.NodeType, node.Type, node.Member));\n                return base.VisitMember(node);\n            }\n\n            protected override MemberAssignment VisitMemberAssignment(MemberAssignment node)\n            {\n                return GiveUp(node);\n            }\n\n            protected override MemberBinding VisitMemberBinding(MemberBinding node)\n            {\n                return GiveUp(node);\n            }\n\n            protected override Expression VisitMemberInit(MemberInitExpression node)\n            {\n                return GiveUp(node);\n            }\n\n            protected override MemberListBinding VisitMemberListBinding(MemberListBinding node)\n            {\n                return GiveUp(node);\n            }\n\n            protected override MemberMemberBinding VisitMemberMemberBinding(MemberMemberBinding node)\n            {\n                return GiveUp(node);\n            }\n\n            protected override Expression VisitMethodCall(MethodCallExpression node)\n            {\n                if (_gaveUp)\n                {\n                    return node;\n                }\n                _currentChain.Elements.Add(new MethodCallExpressionFingerprint(node.NodeType, node.Type, node.Method));\n                return base.VisitMethodCall(node);\n            }\n\n            protected override Expression VisitNew(NewExpression node)\n            {\n                return GiveUp(node);\n            }\n\n            protected override Expression VisitNewArray(NewArrayExpression node)\n            {\n                return GiveUp(node);\n            }\n\n            protected override Expression VisitParameter(ParameterExpression node)\n            {\n                if (_gaveUp)\n                {\n                    return node;\n                }\n\n                int parameterIndex = _seenParameters.IndexOf(node);\n                if (parameterIndex < 0)\n                {\n                    // first time seeing this parameter\n                    parameterIndex = _seenParameters.Count;\n                    _seenParameters.Add(node);\n                }\n\n                _currentChain.Elements.Add(new ParameterExpressionFingerprint(node.NodeType, node.Type, parameterIndex));\n                return base.VisitParameter(node);\n            }\n\n            protected override Expression VisitRuntimeVariables(RuntimeVariablesExpression node)\n            {\n                return GiveUp(node);\n            }\n\n            protected override Expression VisitSwitch(SwitchExpression node)\n            {\n                return GiveUp(node);\n            }\n\n            protected override SwitchCase VisitSwitchCase(SwitchCase node)\n            {\n                return GiveUp(node);\n            }\n\n            protected override Expression VisitTry(TryExpression node)\n            {\n                return GiveUp(node);\n            }\n\n            protected override Expression VisitTypeBinary(TypeBinaryExpression node)\n            {\n                if (_gaveUp)\n                {\n                    return node;\n                }\n                _currentChain.Elements.Add(new TypeBinaryExpressionFingerprint(node.NodeType, node.Type, node.TypeOperand));\n                return base.VisitTypeBinary(node);\n            }\n\n            protected override Expression VisitUnary(UnaryExpression node)\n            {\n                if (_gaveUp)\n                {\n                    return node;\n                }\n                _currentChain.Elements.Add(new UnaryExpressionFingerprint(node.NodeType, node.Type, node.Method));\n                return base.VisitUnary(node);\n            }\n        }\n\n        internal class HashCodeCombiner\n        {\n            private long _combinedHash64 = 0x1505L;\n\n            public int CombinedHash\n            {\n                get { return _combinedHash64.GetHashCode(); }\n            }\n\n            public void AddFingerprint(ExpressionFingerprint fingerprint)\n            {\n                if (fingerprint != null)\n                {\n                    fingerprint.AddToHashCodeCombiner(this);\n                }\n                else\n                {\n                    AddInt32(0);\n                }\n            }\n\n            public void AddEnumerable(IEnumerable e)\n            {\n                if (e == null)\n                {\n                    AddInt32(0);\n                }\n                else\n                {\n                    int count = 0;\n                    foreach (object o in e)\n                    {\n                        AddObject(o);\n                        count++;\n                    }\n                    AddInt32(count);\n                }\n            }\n\n            public void AddInt32(int i)\n            {\n                _combinedHash64 = ((_combinedHash64 << 5) + _combinedHash64) ^ i;\n            }\n\n            public void AddObject(object o)\n            {\n                int hashCode = (o != null) ? o.GetHashCode() : 0;\n                AddInt32(hashCode);\n            }\n        }\n\n        internal delegate TValue Hoisted<in TModel, out TValue>(TModel model, List<object> capturedConstants);\n\n        internal sealed class HoistingExpressionVisitor<TIn, TOut> : ExpressionVisitor\n        {\n            private static readonly ParameterExpression _hoistedConstantsParamExpr = Expression.Parameter(typeof(List<object>), \"hoistedConstants\");\n            private int _numConstantsProcessed;\n\n            // factory will create instance\n            private HoistingExpressionVisitor()\n            {\n            }\n\n            public static Expression<Hoisted<TIn, TOut>> Hoist(Expression<Func<TIn, TOut>> expr)\n            {\n                // rewrite Expression<Func<TIn, TOut>> as Expression<Hoisted<TIn, TOut>>\n\n                var visitor = new HoistingExpressionVisitor<TIn, TOut>();\n                var rewrittenBodyExpr = visitor.Visit(expr.Body);\n                var rewrittenLambdaExpr = Expression.Lambda<Hoisted<TIn, TOut>>(rewrittenBodyExpr, expr.Parameters[0], _hoistedConstantsParamExpr);\n                return rewrittenLambdaExpr;\n            }\n\n            protected override Expression VisitConstant(ConstantExpression node)\n            {\n                // rewrite the constant expression as (TConst)hoistedConstants[i];\n                return Expression.Convert(Expression.Property(_hoistedConstantsParamExpr, \"Item\", Expression.Constant(_numConstantsProcessed++)), node.Type);\n            }\n        }\n\n        internal sealed class IndexExpressionFingerprint : ExpressionFingerprint\n        {\n            public IndexExpressionFingerprint(ExpressionType nodeType, Type type, PropertyInfo indexer)\n                : base(nodeType, type)\n            {\n                // Other properties on IndexExpression (like the argument count) are simply derived\n                // from Type and Indexer, so they're not necessary for inclusion in the fingerprint.\n\n                Indexer = indexer;\n            }\n\n            // http://msdn.microsoft.com/en-us/library/system.linq.expressions.indexexpression.indexer.aspx\n            public PropertyInfo Indexer { get; private set; }\n\n            public override bool Equals(object obj)\n            {\n                IndexExpressionFingerprint other = obj as IndexExpressionFingerprint;\n                return (other != null)\n                       && Equals(this.Indexer, other.Indexer)\n                       && this.Equals(other);\n            }\n\n            public override int GetHashCode()\n            {\n                return base.GetHashCode();\n            }\n\n            internal override void AddToHashCodeCombiner(HashCodeCombiner combiner)\n            {\n                combiner.AddObject(Indexer);\n                base.AddToHashCodeCombiner(combiner);\n            }\n        }\n\n        internal sealed class LambdaExpressionFingerprint : ExpressionFingerprint\n        {\n            public LambdaExpressionFingerprint(ExpressionType nodeType, Type type)\n                : base(nodeType, type)\n            {\n                // There are no properties on LambdaExpression that are worth including in\n                // the fingerprint.\n            }\n\n            public override bool Equals(object obj)\n            {\n                LambdaExpressionFingerprint other = obj as LambdaExpressionFingerprint;\n                return (other != null)\n                       && this.Equals(other);\n            }\n\n            public override int GetHashCode()\n            {\n                return base.GetHashCode();\n            }\n        }\n\n        internal sealed class MemberExpressionFingerprint : ExpressionFingerprint\n        {\n            public MemberExpressionFingerprint(ExpressionType nodeType, Type type, MemberInfo member)\n                : base(nodeType, type)\n            {\n                Member = member;\n            }\n\n            // http://msdn.microsoft.com/en-us/library/system.linq.expressions.memberexpression.member.aspx\n            public MemberInfo Member { get; private set; }\n\n            public override bool Equals(object obj)\n            {\n                MemberExpressionFingerprint other = obj as MemberExpressionFingerprint;\n                return (other != null)\n                       && Equals(this.Member, other.Member)\n                       && this.Equals(other);\n            }\n\n            public override int GetHashCode()\n            {\n                return base.GetHashCode();\n            }\n\n            internal override void AddToHashCodeCombiner(HashCodeCombiner combiner)\n            {\n                combiner.AddObject(Member);\n                base.AddToHashCodeCombiner(combiner);\n            }\n        }\n\n        internal sealed class MethodCallExpressionFingerprint : ExpressionFingerprint\n        {\n            public MethodCallExpressionFingerprint(ExpressionType nodeType, Type type, MethodInfo method)\n                : base(nodeType, type)\n            {\n                // Other properties on MethodCallExpression (like the argument count) are simply derived\n                // from Type and Indexer, so they're not necessary for inclusion in the fingerprint.\n\n                Method = method;\n            }\n\n            // http://msdn.microsoft.com/en-us/library/system.linq.expressions.methodcallexpression.method.aspx\n            public MethodInfo Method { get; private set; }\n\n            public override bool Equals(object obj)\n            {\n                MethodCallExpressionFingerprint other = obj as MethodCallExpressionFingerprint;\n                return (other != null)\n                       && Equals(this.Method, other.Method)\n                       && this.Equals(other);\n            }\n\n            public override int GetHashCode()\n            {\n                return base.GetHashCode();\n            }\n\n            internal override void AddToHashCodeCombiner(HashCodeCombiner combiner)\n            {\n                combiner.AddObject(Method);\n                base.AddToHashCodeCombiner(combiner);\n            }\n        }\n\n        internal sealed class ParameterExpressionFingerprint : ExpressionFingerprint\n        {\n            public ParameterExpressionFingerprint(ExpressionType nodeType, Type type, int parameterIndex)\n                : base(nodeType, type)\n            {\n                ParameterIndex = parameterIndex;\n            }\n\n            // Parameter position within the overall expression, used to maintain alpha equivalence.\n            public int ParameterIndex { get; private set; }\n\n            public override bool Equals(object obj)\n            {\n                ParameterExpressionFingerprint other = obj as ParameterExpressionFingerprint;\n                return (other != null)\n                       && (this.ParameterIndex == other.ParameterIndex)\n                       && this.Equals(other);\n            }\n\n            public override int GetHashCode()\n            {\n                return base.GetHashCode();\n            }\n\n            internal override void AddToHashCodeCombiner(HashCodeCombiner combiner)\n            {\n                combiner.AddInt32(ParameterIndex);\n                base.AddToHashCodeCombiner(combiner);\n            }\n        }\n\n        internal sealed class TypeBinaryExpressionFingerprint : ExpressionFingerprint\n        {\n            public TypeBinaryExpressionFingerprint(ExpressionType nodeType, Type type, Type typeOperand)\n                : base(nodeType, type)\n            {\n                TypeOperand = typeOperand;\n            }\n\n            // http://msdn.microsoft.com/en-us/library/system.linq.expressions.typebinaryexpression.typeoperand.aspx\n            public Type TypeOperand { get; private set; }\n\n            public override bool Equals(object obj)\n            {\n                TypeBinaryExpressionFingerprint other = obj as TypeBinaryExpressionFingerprint;\n                return (other != null)\n                       && Equals(this.TypeOperand, other.TypeOperand)\n                       && this.Equals(other);\n            }\n\n            public override int GetHashCode()\n            {\n                return base.GetHashCode();\n            }\n\n            internal override void AddToHashCodeCombiner(HashCodeCombiner combiner)\n            {\n                combiner.AddObject(TypeOperand);\n                base.AddToHashCodeCombiner(combiner);\n            }\n        }\n\n        internal sealed class UnaryExpressionFingerprint : ExpressionFingerprint\n        {\n            public UnaryExpressionFingerprint(ExpressionType nodeType, Type type, MethodInfo method)\n                : base(nodeType, type)\n            {\n                // Other properties on UnaryExpression (like IsLifted / IsLiftedToNull) are simply derived\n                // from Type and NodeType, so they're not necessary for inclusion in the fingerprint.\n\n                Method = method;\n            }\n\n            // http://msdn.microsoft.com/en-us/library/system.linq.expressions.unaryexpression.method.aspx\n            public MethodInfo Method { get; private set; }\n\n            public override bool Equals(object obj)\n            {\n                UnaryExpressionFingerprint other = obj as UnaryExpressionFingerprint;\n                return (other != null)\n                       && Equals(this.Method, other.Method)\n                       && this.Equals(other);\n            }\n\n            public override int GetHashCode()\n            {\n                return base.GetHashCode();\n            }\n\n            internal override void AddToHashCodeCombiner(HashCodeCombiner combiner)\n            {\n                combiner.AddObject(Method);\n                base.AddToHashCodeCombiner(combiner);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Expressions/SqlExpression/SqlExpressionProvider.cs",
    "content": "﻿using System;\nusing System.Linq.Expressions;\n\nnamespace Overt.Core.Data.Expressions\n{\n    internal class SqlExpressionProvider\n    {\n        internal static ISqlExpression GetSqlExpression(Expression expression)\n        {\n            if (expression == null)\n            {\n                throw new ArgumentNullException(\"expression\", \"不能为null\");\n            }\n\n            if (expression is LambdaExpression)\n            {\n                return new LambdaSqlExpression();\n            }\n\n            if (expression is BinaryExpression)\n            {\n                return new BinarySqlExpression();\n            }\n            if (expression is BlockExpression)\n            {\n                throw new NotImplementedException(\"未实现的BlockSqlExpression\");\n            }\n            if (expression is ConditionalExpression)\n            {\n                throw new NotImplementedException(\"未实现的ConditionalSqlExpression\");\n            }\n            if (expression is ConstantExpression)\n            {\n                return new ConstantSqlExpression();\n            }\n            if (expression is DebugInfoExpression)\n            {\n                throw new NotImplementedException(\"未实现的DebugInfoSqlExpression\");\n            }\n            if (expression is DefaultExpression)\n            {\n                throw new NotImplementedException(\"未实现的DefaultSqlExpression\");\n            }\n            if (expression is DynamicExpression)\n            {\n                throw new NotImplementedException(\"未实现的DynamicSqlExpression\");\n            }\n            if (expression is GotoExpression)\n            {\n                throw new NotImplementedException(\"未实现的GotoSqlExpression\");\n            }\n            if (expression is IndexExpression)\n            {\n                throw new NotImplementedException(\"未实现的IndexSqlExpression\");\n            }\n            if (expression is InvocationExpression)\n            {\n                throw new NotImplementedException(\"未实现的InvocationSqlExpression\");\n            }\n            if (expression is LabelExpression)\n            {\n                throw new NotImplementedException(\"未实现的LabelSqlExpression\");\n            }\n            if (expression is LambdaExpression)\n            {\n                throw new NotImplementedException(\"未实现的LambdaSqlExpression\");\n            }\n            if (expression is ListInitExpression)\n            {\n                return new ListInitSqlExpression();\n            }\n            if (expression is LoopExpression)\n            {\n                throw new NotImplementedException(\"未实现的LoopSqlExpression\");\n            }\n            if (expression is MemberExpression)\n            {\n                return new MemberSqlExpression();\n            }\n            if (expression is MemberInitExpression)\n            {\n                throw new NotImplementedException(\"未实现的MemberInitSqlExpression\");\n            }\n            if (expression is MethodCallExpression)\n            {\n                return new MethodCallSqlExpression();\n            }\n            if (expression is NewArrayExpression)\n            {\n                return new NewArraySqlExpression();\n            }\n            if (expression is NewExpression)\n            {\n                return new NewSqlExpression();\n            }\n            if (expression is ParameterExpression)\n            {\n                throw new NotImplementedException(\"未实现的ParameterSqlExpression\");\n            }\n            if (expression is RuntimeVariablesExpression)\n            {\n                throw new NotImplementedException(\"未实现的RuntimeVariablesSqlExpression\");\n            }\n            if (expression is SwitchExpression)\n            {\n                throw new NotImplementedException(\"未实现的SwitchSqlExpression\");\n            }\n            if (expression is TryExpression)\n            {\n                throw new NotImplementedException(\"未实现的TrySqlExpression\");\n            }\n            if (expression is TypeBinaryExpression)\n            {\n                throw new NotImplementedException(\"未实现的TypeBinarySqlExpression\");\n            }\n            if (expression is UnaryExpression)\n            {\n                return new UnarySqlExpression();\n            }\n            throw new NotImplementedException(\"未实现的SqlExpression\");\n        }\n\n        public static void Update(Expression expression, SqlGenerate sqlGenerate)\n        {\n            GetSqlExpression(expression).Update(expression, sqlGenerate);\n        }\n\n        public static void Select(Expression expression, SqlGenerate sqlGenerate)\n        {\n            GetSqlExpression(expression).Select(expression, sqlGenerate);\n        }\n\n        public static void Where(Expression expression, SqlGenerate sqlGenerate)\n        {\n            GetSqlExpression(expression).Where(expression, sqlGenerate);\n        }\n\n        public static void In(Expression expression, SqlGenerate sqlGenerate)\n        {\n            GetSqlExpression(expression).In(expression, sqlGenerate);\n        }\n\n        public static void OrderBy(Expression expression, SqlGenerate sqlGenerate)\n        {\n            GetSqlExpression(expression).OrderBy(expression, sqlGenerate);\n        }\n\n        public static void Max(Expression expression, SqlGenerate sqlGenerate)\n        {\n            GetSqlExpression(expression).Max(expression, sqlGenerate);\n        }\n\n        public static void Min(Expression expression, SqlGenerate sqlGenerate)\n        {\n            GetSqlExpression(expression).Min(expression, sqlGenerate);\n        }\n\n        public static void Avg(Expression expression, SqlGenerate sqlGenerate)\n        {\n            GetSqlExpression(expression).Avg(expression, sqlGenerate);\n        }\n\n        public static void Count(Expression expression, SqlGenerate sqlGenerate)\n        {\n            GetSqlExpression(expression).Count(expression, sqlGenerate);\n        }\n\n        public static void Sum(Expression expression, SqlGenerate sqlGenerate)\n        {\n            GetSqlExpression(expression).Sum(expression, sqlGenerate);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Expressions/SqlExpression/SqlGenerate.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace Overt.Core.Data.Expressions\n{\n    /// <summary>\n    /// SqlGenrate\n    /// </summary>\n\tpublic class SqlGenerate\n    {\n        #region Private Property\n        private static readonly List<string> S_listEnglishWords = new List<string> { \"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\", \"k\", \"l\", \"m\", \"n\", \"o\", \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\", \"w\", \"x\", \"y\", \"z\", };\n\n        private Dictionary<string, string> _dicTableName = new Dictionary<string, string>();\n        private Queue<string> _queueEnglishWords = new Queue<string>(S_listEnglishWords);\n        #endregion\n\n        #region Public Property\n        /// <summary>\n        /// 字段\n        /// </summary>\n        public List<string> SelectFields { get; set; }\n        /// <summary>\n        /// 表名\n        /// </summary>\n        public string TableName { get; set; }\n\n        /// <summary>\n        /// 字段字符串\n        /// </summary>\n        public string SelectFieldsStr\n        {\n            get\n            {\n                return string.Join(\", \", this.SelectFields);\n            }\n        }\n\n        /// <summary>\n        /// sql长度\n        /// </summary>\n        public int Length\n        {\n            get\n            {\n                return Sql.Length;\n            }\n        }\n\n        /// <summary>\n        /// 脚本\n        /// </summary>\n        public StringBuilder Sql { get; set; }\n\n        /// <summary>\n        /// 数据库类型\n        /// </summary>\n        public DatabaseType DatabaseType { get; set; }\n\n        /// <summary>\n        /// 数据库参数\n        /// </summary>\n        public Dictionary<string, object> DbParams { get; private set; }\n\n        /// <summary>\n        /// 索引数据\n        /// </summary>\n        /// <param name=\"index\"></param>\n        /// <returns></returns>\n        public char this[int index]\n        {\n            get\n            {\n                return this.Sql[index];\n            }\n        }\n        #endregion\n\n\n        #region Constructor \n        /// <summary>\n        /// 构造函数\n        /// </summary>\n        public SqlGenerate()\n        {\n            DbParams = new Dictionary<string, object>();\n            Sql = new StringBuilder();\n            SelectFields = new List<string>();\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <param name=\"sql\"></param>\n        /// <returns></returns>\n        public static SqlGenerate operator +(SqlGenerate sqlGenerate, string sql)\n        {\n            sqlGenerate.Sql.Append(sql);\n            return sqlGenerate;\n        }\n        #endregion\n\n        #region Public Method\n        /// <summary>\n        /// 清除\n        /// </summary>\n        public void Clear()\n        {\n            SelectFields.Clear();\n            Sql.Clear();\n            DbParams.Clear();\n            _dicTableName.Clear();\n            _queueEnglishWords = new Queue<string>(S_listEnglishWords);\n        }\n\n        /// <summary>\n        /// 替换最后一次出现字符\n        /// </summary>\n        /// <param name=\"oldStr\"></param>\n        /// <param name=\"newStr\"></param>\n        public void RelaceLast(string oldStr, string newStr)\n        {\n            if (Sql.ToString().LastIndexOf(oldStr) == -1)\n                return;\n\n            Sql = Sql.Replace(oldStr, newStr, Sql.ToString().LastIndexOf(oldStr), newStr.Length);\n        }\n\n        /// <summary>\n        /// 添加参数\n        /// </summary>\n        /// <param name=\"parameterValue\"></param>\n\t\tpublic void AddDbParameter(object parameterValue)\n        {\n            if (parameterValue == null || parameterValue == DBNull.Value)\n                Sql.Append(\" null\");\n            else\n            {\n                var name = DatabaseType.ParamPrefix() + \"param\" + DbParams.Count;\n                DbParams.Add(name, parameterValue);\n                Sql.Append(\" \" + name);\n            }\n        }\n\n        /// <summary>\n        /// 拼接in参数\n        /// </summary>\n        /// <param name=\"parameterValues\"></param>\n        public void CombineInParameters(List<object> parameterValues)\n        {\n            if (parameterValues == null || parameterValues.Count == 0)\n                return;\n            Sql.Append(\" \" + $\"({string.Join(\",\", parameterValues.Select(n => $\"'{n}'\"))})\");\n        }\n\n        /// <summary>\n        /// ToString\n        /// </summary>\n        /// <returns></returns>\n        public override string ToString()\n        {\n            return Sql.ToString();\n        }\n        #endregion\n    }\n}"
  },
  {
    "path": "src/Overt.Core.Data/Extensions/Dapper.Async.Extensions.cs",
    "content": "﻿using Dapper;\nusing Overt.Core.Data.Expressions;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.Data;\nusing System.Linq;\nusing System.Linq.Expressions;\nusing System.Threading.Tasks;\n\nnamespace Overt.Core.Data\n{\n    /// <summary>\n    /// Dapper扩展\n    /// </summary>\n    public static partial class DapperExtensions\n    {\n        #region Public Method\n        /// <summary>\n        /// 是否存在表\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"outSqlAction\"></param>\n        /// <returns></returns>\n        public static async Task<bool> IsExistTableAsync(this IDbConnection connection, string tableName, Action<string> outSqlAction = null)\n        {\n            if (string.IsNullOrEmpty(tableName))\n                return false;\n            var dbType = connection.GetDbType();\n            var dbName = connection.Database;\n            var sql = dbType.ExistTableSql(dbName, tableName);\n            outSqlAction?.Invoke(sql); // 返回sql\n\n            var result = await connection.QueryFirstOrDefaultAsync<int>(sql);\n            return result > 0;\n        }\n\n        /// <summary>\n        /// 是否存在字段\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"outSqlAction\"></param>\n        /// <returns></returns>\n        public static async Task<bool> IsExistFieldAsync(this IDbConnection connection, string tableName, string fieldName, Action<string> outSqlAction = null)\n        {\n            if (string.IsNullOrEmpty(tableName))\n                return false;\n            var dbType = connection.GetDbType();\n            var dbName = connection.Database;\n            var sql = dbType.ExistFieldSql(dbName, tableName, fieldName);\n            outSqlAction?.Invoke(sql);\n\n            var result = await connection.QueryFirstOrDefaultAsync<int>(sql);\n            return result > 0;\n        }\n\n        /// <summary>\n        /// 插入数据\n        /// </summary>\n        /// <typeparam name=\"TEntity\"></typeparam>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"entity\"></param>\n        /// <param name=\"returnLastIdentity\">是否返回自增的数据</param>\n        /// <param name=\"outSqlAction\">返回sql语句</param>\n        /// <returns>-1 参数为空</returns>\n        public static async Task<bool> InsertAsync<TEntity>(this\n            IDbConnection connection,\n            string tableName,\n            TEntity entity,\n            bool returnLastIdentity = false,\n            Action<string> outSqlAction = null)\n            where TEntity : class, new()\n        {\n            if (string.IsNullOrEmpty(tableName))\n                throw new ArgumentNullException(nameof(tableName));\n            if (entity == null)\n                throw new ArgumentNullException(nameof(entity));\n\n            var dbType = connection.GetDbType();\n            var sqlExpression = SqlExpression.Insert<TEntity>(dbType, tableName, returnLastIdentity);\n            outSqlAction?.Invoke(sqlExpression.Script);\n\n            var identityPI = typeof(TEntity).GetIdentityField();\n            if (identityPI != null && returnLastIdentity)\n            {\n                if (identityPI.PropertyType == typeof(int))\n                {\n                    var intResult = await connection.ExecuteScalarAsync<int>(sqlExpression.Script, entity);\n                    if (intResult > 0)\n                        identityPI.SetValue(entity, intResult);\n                    return intResult > 0;\n                }\n                var longResult = await connection.ExecuteScalarAsync<long>(sqlExpression.Script, entity);\n                if (longResult > 0)\n                    identityPI.SetValue(entity, longResult);\n                return longResult > 0;\n            }\n\n            var result = await connection.ExecuteAsync(sqlExpression.Script, entity);\n            return result > 0;\n        }\n\n        /// <summary>\n        /// 批量插入数据\n        /// </summary>\n        /// <typeparam name=\"TEntity\"></typeparam>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"entities\"></param>\n        /// <param name=\"outSqlAction\">返回sql语句</param>\n        /// <returns>-1 参数为空</returns>\n        public static async Task<int> InsertAsync<TEntity>(this\n            IDbConnection connection,\n            string tableName,\n            IEnumerable<TEntity> entities,\n            Action<string> outSqlAction = null)\n            where TEntity : class, new()\n        {\n            if (string.IsNullOrEmpty(tableName))\n                throw new ArgumentNullException(nameof(tableName));\n            if ((entities?.Count() ?? 0) <= 0)\n                throw new ArgumentNullException(nameof(entities));\n\n            var dbType = connection.GetDbType();\n            var sqlExpression = SqlExpression.Insert<TEntity>(dbType, tableName);\n            outSqlAction?.Invoke(sqlExpression.Script);\n\n            var result = await connection.ExecuteAsync(sqlExpression.Script, entities);\n            return result;\n        }\n\n        /// <summary>\n        /// 删除数据\n        /// </summary>\n        /// <typeparam name=\"TEntity\"></typeparam>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"whereExpress\"></param>\n        /// <param name=\"outSqlAction\">返回sql语句</param>\n        /// <returns>-1 参数为空</returns>\n        public static async Task<int> DeleteAsync<TEntity>(this\n            IDbConnection connection,\n            string tableName,\n            Expression<Func<TEntity, bool>> whereExpress,\n            Action<string> outSqlAction = null)\n            where TEntity : class, new()\n        {\n            if (string.IsNullOrEmpty(tableName))\n                throw new ArgumentNullException(nameof(tableName));\n            if (whereExpress == null)\n                throw new ArgumentNullException(nameof(whereExpress));\n\n            var dbType = connection.GetDbType();\n            var sqlExpression = SqlExpression.Delete<TEntity>(dbType, tableName).Where(whereExpress);\n            outSqlAction?.Invoke(sqlExpression.Script);\n\n            var result = await connection.ExecuteAsync(sqlExpression.Script, sqlExpression.DbParams);\n            return result;\n        }\n\n        /// <summary>\n        /// 对象修改\n        /// </summary>\n        /// <typeparam name=\"TEntity\"></typeparam>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"entity\"></param>\n        /// <param name=\"fields\">选择字段</param>\n        /// <param name=\"outSqlAction\">返回sql语句</param>\n        /// <returns></returns>\n        public static async Task<bool> SetAsync<TEntity>(this\n            IDbConnection connection,\n            string tableName,\n            TEntity entity,\n            IEnumerable<string> fields = null,\n            Action<string> outSqlAction = null)\n            where TEntity : class, new()\n        {\n            if (string.IsNullOrEmpty(tableName))\n                throw new ArgumentNullException(nameof(tableName));\n            if (entity == null)\n                throw new ArgumentNullException(nameof(entity));\n\n            var dbType = connection.GetDbType();\n            var sqlExpression = SqlExpression.Update<TEntity>(dbType, fields, tableName);\n            outSqlAction?.Invoke(sqlExpression.Script);\n\n            var result = await connection.ExecuteAsync(sqlExpression.Script, entity);\n            return result > 0;\n        }\n\n        /// <summary>\n        /// 条件修改\n        /// </summary>\n        /// <typeparam name=\"TEntity\"></typeparam>\n        /// <param name=\"connection\">连接</param>\n        /// <param name=\"tableName\">表名</param>\n        /// <param name=\"setExpress\">修改内容表达式</param>\n        /// <param name=\"whereExpress\">条件表达式</param>\n        /// <param name=\"outSqlAction\">返回sql语句</param>\n        /// <returns></returns>\n        public static async Task<bool> SetAsync<TEntity>(this\n            IDbConnection connection,\n            string tableName,\n            Expression<Func<object>> setExpress,\n            Expression<Func<TEntity, bool>> whereExpress,\n            Action<string> outSqlAction = null)\n            where TEntity : class, new()\n        {\n            if (string.IsNullOrEmpty(tableName))\n                throw new ArgumentNullException(nameof(tableName));\n            if (setExpress == null || whereExpress == null)\n                throw new ArgumentNullException($\"{nameof(setExpress)} / {nameof(whereExpress)}\");\n\n            var dbType = connection.GetDbType();\n            var sqlExpression = SqlExpression.Update<TEntity>(dbType, setExpress, tableName).Where(whereExpress);\n            outSqlAction?.Invoke(sqlExpression.Script); // 返回sql\n\n            var result = await connection.ExecuteAsync(sqlExpression.Script, sqlExpression.DbParams);\n            return result > 0;\n        }\n\n        /// <summary>\n        /// 条件修改 在字段上增减\n        /// </summary>\n        /// <typeparam name=\"TEntity\"></typeparam>\n        /// <typeparam name=\"TValue\"></typeparam>\n        /// <param name=\"connection\">连接</param>\n        /// <param name=\"tableName\">表名</param>\n        /// <param name=\"field\">增减的字段</param>\n        /// <param name=\"value\">增减的值</param>\n        /// <param name=\"whereExpress\">条件表达式</param>\n        /// <param name=\"outSqlAction\">返回sql语句</param>\n        /// <returns></returns>\n        public static async Task<bool> IncrAsync<TEntity, TValue>(this\n            IDbConnection connection,\n            string tableName,\n            string field,\n            TValue value,\n            Expression<Func<TEntity, bool>> whereExpress,\n            Action<string> outSqlAction = null)\n            where TEntity : class, new()\n        {\n            if (string.IsNullOrEmpty(tableName))\n                throw new ArgumentNullException(nameof(tableName));\n            if (string.IsNullOrEmpty(field))\n                throw new ArgumentNullException(field, \"增减字段不能为空\");\n\n            var dbType = connection.GetDbType();\n            var setExpressString = $\"{field.ParamSql(dbType)} = {field.ParamSql(dbType)} + ({value})\";\n            var sqlExpression = SqlExpression.Update<TEntity>(dbType, () => setExpressString, tableName).Where(whereExpress);\n            outSqlAction?.Invoke(sqlExpression.Script); // 返回sql\n\n            var result = await connection.ExecuteAsync(sqlExpression.Script, sqlExpression.DbParams);\n            return result > 0;\n        }\n\n        /// <summary>\n        /// 获取单条数据\n        /// </summary>\n        /// <typeparam name=\"TEntity\"></typeparam>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"tableName\">表名</param>\n        /// <param name=\"whereExpress\">条件表达式</param>\n        /// <param name=\"fieldExpress\">选择字段，默认为*</param>\n        /// <param name=\"outSqlAction\">返回sql语句</param>\n        /// <returns></returns>\n        public static async Task<TEntity> GetAsync<TEntity>(this\n            IDbConnection connection,\n            string tableName,\n            Expression<Func<TEntity, bool>> whereExpress,\n            Expression<Func<TEntity, object>> fieldExpress = null,\n            Action<string> outSqlAction = null)\n            where TEntity : class, new()\n        {\n            if (string.IsNullOrEmpty(tableName))\n                throw new ArgumentNullException(nameof(tableName));\n            if (whereExpress == null)\n                throw new ArgumentNullException(nameof(whereExpress));\n\n            var dbType = connection.GetDbType();\n            var sqlExpression = SqlExpression.Select(dbType, fieldExpress, tableName).Where(whereExpress);\n            sqlExpression = sqlExpression.TopOne();\n            outSqlAction?.Invoke(sqlExpression.Script); // 返回sql\n\n            var result = await connection.QueryFirstOrDefaultAsync<TEntity>(sqlExpression.Script, sqlExpression.DbParams);\n            return result;\n        }\n\n        /// <summary>\n        /// 获取分页数据\n        /// </summary>\n        /// <typeparam name=\"TEntity\"></typeparam>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"page\"></param>\n        /// <param name=\"rows\"></param>\n        /// <param name=\"whereExpress\">条件表达式</param>\n        /// <param name=\"fieldExpress\">选择字段，默认为*</param>\n        /// <param name=\"orderByFields\">排序字段集合</param>\n        /// <param name=\"outSqlAction\">返回sql语句</param>\n        /// <returns></returns>\n        public static async Task<IEnumerable<TEntity>> GetListAsync<TEntity>(this\n            IDbConnection connection,\n            string tableName,\n            int page,\n            int rows,\n            Expression<Func<TEntity, bool>> whereExpress,\n            Expression<Func<TEntity, object>> fieldExpress = null,\n            List<OrderByField> orderByFields = null,\n            Action<string> outSqlAction = null)\n            where TEntity : class, new()\n        {\n            if (string.IsNullOrEmpty(tableName))\n                throw new ArgumentNullException(nameof(tableName));\n\n            var dbType = connection.GetDbType();\n            var sqlExpression = SqlExpression.Select(dbType, fieldExpress, tableName);\n            if (whereExpress != null)\n                sqlExpression.Where(whereExpress);\n\n            var orderBy = string.Empty;\n            if ((orderByFields?.Count ?? 0) > 0)\n                orderBy = $\" {string.Join(\", \", orderByFields.Select(oo => oo.Field.ParamSql(dbType) + \" \" + oo.OrderBy))}\";\n            sqlExpression.OrderBy(orderBy).Limit(page, rows);\n            outSqlAction?.Invoke(sqlExpression.Script); // 返回sql\n\n            var result = await connection.QueryAsync<TEntity>(sqlExpression.Script, sqlExpression.DbParams);\n            return result;\n        }\n\n        /// <summary>\n        /// 获取分页数据 Offset\n        /// </summary>\n        /// <typeparam name=\"TEntity\"></typeparam>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"offset\"></param>\n        /// <param name=\"size\"></param>\n        /// <param name=\"whereExpress\">条件表达式</param>\n        /// <param name=\"fieldExpress\">选择字段，默认为*</param>\n        /// <param name=\"orderByFields\">排序字段集合</param>\n        /// <param name=\"outSqlAction\">返回sql语句</param>\n        /// <returns></returns>\n        public static async Task<IEnumerable<TEntity>> GetOffsetsAsync<TEntity>(this\n            IDbConnection connection,\n            string tableName,\n            int offset,\n            int size,\n            Expression<Func<TEntity, bool>> whereExpress,\n            Expression<Func<TEntity, object>> fieldExpress = null,\n            List<OrderByField> orderByFields = null,\n            Action<string> outSqlAction = null)\n            where TEntity : class, new()\n        {\n            if (string.IsNullOrEmpty(tableName))\n                throw new ArgumentNullException(nameof(tableName));\n\n            var dbType = connection.GetDbType();\n            var sqlExpression = SqlExpression.Select(dbType, fieldExpress, tableName);\n            if (whereExpress != null)\n                sqlExpression.Where(whereExpress);\n\n            var orderBy = string.Empty;\n            if ((orderByFields?.Count ?? 0) > 0)\n                orderBy = $\" {string.Join(\", \", orderByFields.Select(oo => oo.Field.ParamSql(dbType) + \" \" + oo.OrderBy))}\";\n            sqlExpression.OrderBy(orderBy).Offset(offset, size);\n            outSqlAction?.Invoke(sqlExpression.Script); // 返回sql\n\n            var result = await connection.QueryAsync<TEntity>(sqlExpression.Script, sqlExpression.DbParams);\n            return result;\n        }\n\n        /// <summary>\n        /// 获取数量\n        /// </summary>\n        /// <typeparam name=\"TEntity\"></typeparam>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"whereExpress\">条件表达式</param>\n        /// <param name=\"outSqlAction\">返回sql语句</param>\n        /// <returns></returns>\n        public static async Task<int> CountAsync<TEntity>(this\n            IDbConnection connection,\n            string tableName,\n            Expression<Func<TEntity, bool>> whereExpress,\n            Action<string> outSqlAction = null)\n            where TEntity : class, new()\n        {\n            if (string.IsNullOrEmpty(tableName))\n                throw new ArgumentNullException(nameof(tableName));\n\n            var dbType = connection.GetDbType();\n            var sqlExpression = SqlExpression.Count<TEntity>(dbType, tableName: tableName).Where(whereExpress);\n            outSqlAction?.Invoke(sqlExpression.Script); // 返回sql\n\n            var result = await connection.QueryFirstOrDefaultAsync<int>(sqlExpression.Script, sqlExpression.DbParams);\n            return result;\n        }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Extensions/Dapper.Extensions.cs",
    "content": "﻿using Dapper;\nusing MySql.Data.MySqlClient;\nusing Overt.Core.Data.Expressions;\nusing System;\nusing System.Collections.Concurrent;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\nusing System.Data;\nusing System.Data.SqlClient;\nusing System.Linq;\nusing System.Linq.Expressions;\nusing System.Reflection;\nusing System.Security.Cryptography;\nusing System.Text;\n\nnamespace Overt.Core.Data\n{\n    /// <summary>\n    /// Dapper扩展\n    /// </summary>\n    public static partial class DapperExtensions\n    {\n        #region TableName\n        /// <summary>\n        /// 获取主表名称\n        /// </summary>\n        /// <param name=\"entity\"></param>\n        /// <returns></returns>\n        public static string GetMainTableName(this Type entity)\n        {\n            var attribute = entity.GetAttribute<TableAttribute>();\n            string mTableName;\n            if (attribute == null)\n                mTableName = entity.Name;\n            else\n                mTableName = attribute.Name;\n            return mTableName;\n        }\n\n        /// <summary>\n        /// 获取表名\n        /// </summary>\n        /// <param name=\"val\"></param>\n        /// <param name=\"tableNameFunc\"></param>\n        /// <returns></returns>\n        public static string GetTableName<TEntity>(this string val, Func<string> tableNameFunc = null) where TEntity : class, new()\n        {\n            if (tableNameFunc != null)\n                return tableNameFunc.Invoke();\n\n            var t = typeof(TEntity);\n            var mTableName = t.GetMainTableName();\n            var propertyInfo = t.GetProperty<SubmeterAttribute>();\n            if (propertyInfo == null) // 代表没有分表特性\n                return mTableName;\n\n            // 获取分表\n            var suffix = propertyInfo.GetSuffix(val);\n            return $\"{mTableName}_{suffix}\";\n        }\n\n        /// <summary>\n        /// 获取表名\n        /// </summary>\n        /// <param name=\"entity\">实体实例</param>\n        /// <param name=\"tableNameFunc\"></param>\n        /// <returns></returns>\n        public static string GetTableName<TEntity>(this TEntity entity, Func<string> tableNameFunc = null) where TEntity : class, new()\n        {\n            if (tableNameFunc != null)\n                return tableNameFunc.Invoke();\n\n            var t = typeof(TEntity);\n            var mTableName = t.GetMainTableName();\n            var propertyInfo = t.GetProperty<SubmeterAttribute>();\n            if (propertyInfo == null) // 代表没有分表特性\n                return mTableName;\n\n            // 获取分表\n            var suffix = propertyInfo.GetSuffix(entity);\n            return $\"{mTableName}_{suffix}\";\n        }\n\n        /// <summary>\n        /// 获取表名\n        /// </summary>\n        /// <param name=\"expression\">表达式数据</param>\n        /// <param name=\"tableNameFunc\"></param>\n        /// <returns></returns>\n        public static string GetTableName<TEntity>(this Expression<Func<TEntity, bool>> expression, Func<string> tableNameFunc = null) where TEntity : class, new()\n        {\n            if (tableNameFunc != null)\n                return tableNameFunc.Invoke();\n\n            var t = typeof(TEntity);\n            var mTableName = t.GetMainTableName();\n            var propertyInfo = t.GetProperty<SubmeterAttribute>();\n            if (propertyInfo == null) // 代表没有分表特性\n                return mTableName;\n\n            // 获取分表\n            var suffix = propertyInfo.GetSuffix(expression);\n            return $\"{mTableName}_{suffix}\";\n        }\n        #endregion\n\n        #region Field\n        /// <summary>\n        /// 获取自增字段\n        /// </summary>\n        /// <param name=\"type\"></param>\n        /// <returns></returns>\n        public static PropertyInfo GetIdentityField(this Type type)\n        {\n            var propertyInfos = type.GetProperties<DatabaseGeneratedAttribute>();\n            if ((propertyInfos?.Count ?? 0) <= 0) // 代表没有主键\n                return null;\n\n            foreach (var pi in propertyInfos)\n            {\n                var attribute = pi.GetAttribute<DatabaseGeneratedAttribute>();\n                if (attribute != null && attribute.DatabaseGeneratedOption == DatabaseGeneratedOption.Identity)\n                {\n                    return pi;\n                }\n            }\n            return null;\n        }\n\n        /// <summary>\n        /// 获取自定义类型的字段列表\n        /// </summary>\n        /// <param name=\"type\"></param>\n        /// <returns></returns>\n        public static List<PropertyInfo> GetCustomFields(this Type type)\n        {\n            var propertyInfos = type.GetProperties<DataTypeAttribute>();\n            if ((propertyInfos?.Count ?? 0) <= 0) // 代表没有自定义字段\n                return null;\n\n            var result = new List<PropertyInfo>();\n            foreach (var pi in propertyInfos)\n            {\n                var attribute = pi.GetAttribute<DataTypeAttribute>();\n                if (attribute != null)\n                {\n                    result.Add(pi);\n                }\n            }\n            return result;\n        }\n        #endregion\n\n        #region Public Method\n        /// <summary>\n        /// 是否存在表\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"outSqlAction\"></param>\n        /// <returns></returns>\n        public static bool IsExistTable(this IDbConnection connection, string tableName, Action<string> outSqlAction = null)\n        {\n            if (string.IsNullOrEmpty(tableName))\n                return false;\n            var dbType = connection.GetDbType();\n            var dbName = connection.Database;\n            var sql = dbType.ExistTableSql(dbName, tableName);\n            outSqlAction?.Invoke(sql); // 返回sql\n\n            var result = connection.QueryFirstOrDefault<int>(sql);\n            return result > 0;\n        }\n\n        /// <summary>\n        /// 是否存在字段\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"outSqlAction\"></param>\n        /// <returns></returns>\n        public static bool IsExistField(this IDbConnection connection, string tableName, string fieldName, Action<string> outSqlAction = null)\n        {\n            if (string.IsNullOrEmpty(tableName))\n                return false;\n            var dbType = connection.GetDbType();\n            var dbName = connection.Database;\n            var sql = dbType.ExistFieldSql(dbName, tableName, fieldName);\n            outSqlAction?.Invoke(sql);\n\n            var result = connection.QueryFirstOrDefault<int>(sql);\n            return result > 0;\n        }\n\n        /// <summary>\n        /// 插入数据\n        /// </summary>\n        /// <typeparam name=\"TEntity\"></typeparam>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"entity\"></param>\n        /// <param name=\"returnLastIdentity\">是否返回自增的数据</param>\n        /// <param name=\"outSqlAction\">返回sql语句</param>\n        /// <returns>-1 参数为空</returns>\n        public static bool Insert<TEntity>(this\n            IDbConnection connection,\n            string tableName,\n            TEntity entity,\n            bool returnLastIdentity = false,\n            Action<string> outSqlAction = null)\n            where TEntity : class, new()\n        {\n            if (string.IsNullOrEmpty(tableName))\n                throw new ArgumentNullException(nameof(tableName));\n            if (entity == null)\n                throw new ArgumentNullException(nameof(entity));\n\n            var dbType = connection.GetDbType();\n            var sqlExpression = SqlExpression.Insert<TEntity>(dbType, tableName, returnLastIdentity);\n            outSqlAction?.Invoke(sqlExpression.Script);\n\n            var identityPI = typeof(TEntity).GetIdentityField();\n            if (identityPI != null && returnLastIdentity)\n            {\n                if (identityPI.PropertyType == typeof(int))\n                {\n                    var intResult = connection.ExecuteScalar<int>(sqlExpression.Script, entity);\n                    if (intResult > 0)\n                        identityPI.SetValue(entity, intResult);\n                    return intResult > 0;\n                }\n                var longResult = connection.ExecuteScalar<long>(sqlExpression.Script, entity);\n                if (longResult > 0)\n                    identityPI.SetValue(entity, longResult);\n                return longResult > 0;\n            }\n\n            var result = connection.Execute(sqlExpression.Script, entity);\n            return result > 0;\n        }\n\n        /// <summary>\n        /// 批量插入数据\n        /// </summary>\n        /// <typeparam name=\"TEntity\"></typeparam>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"entities\"></param>\n        /// <param name=\"outSqlAction\">返回sql语句</param>\n        /// <returns>执行条数</returns>\n        public static int Insert<TEntity>(this\n            IDbConnection connection,\n            string tableName,\n            IEnumerable<TEntity> entities,\n            Action<string> outSqlAction = null)\n            where TEntity : class, new()\n        {\n            if (string.IsNullOrEmpty(tableName))\n                throw new ArgumentNullException(nameof(tableName));\n            if ((entities?.Count() ?? 0) <= 0)\n                throw new ArgumentNullException(nameof(entities));\n\n            var dbType = connection.GetDbType();\n            var sqlExpression = SqlExpression.Insert<TEntity>(dbType, tableName);\n            outSqlAction?.Invoke(sqlExpression.Script);\n\n            var result = connection.Execute(sqlExpression.Script, entities);\n            return result;\n        }\n\n        /// <summary>\n        /// 删除数据\n        /// </summary>\n        /// <typeparam name=\"TEntity\"></typeparam>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"whereExpress\"></param>\n        /// <param name=\"outSqlAction\">返回sql语句</param>\n        /// <returns>-1 参数为空</returns>\n        public static int Delete<TEntity>(this\n            IDbConnection connection,\n            string tableName,\n            Expression<Func<TEntity, bool>> whereExpress,\n            Action<string> outSqlAction = null)\n            where TEntity : class, new()\n        {\n            if (string.IsNullOrEmpty(tableName))\n                throw new ArgumentNullException(nameof(tableName));\n            if (whereExpress == null)\n                throw new ArgumentNullException(nameof(whereExpress));\n\n            var dbType = connection.GetDbType();\n            var sqlExpression = SqlExpression.Delete<TEntity>(dbType, tableName).Where(whereExpress);\n            outSqlAction?.Invoke(sqlExpression.Script);\n\n            var result = connection.Execute(sqlExpression.Script, sqlExpression.DbParams);\n            return result;\n        }\n\n        /// <summary>\n        /// 对象修改\n        /// </summary>\n        /// <typeparam name=\"TEntity\"></typeparam>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"entity\"></param>\n        /// <param name=\"fields\">选择字段</param>\n        /// <param name=\"outSqlAction\">返回sql语句</param>\n        /// <returns></returns>\n        public static bool Set<TEntity>(this\n            IDbConnection connection,\n            string tableName,\n            TEntity entity,\n            IEnumerable<string> fields = null,\n            Action<string> outSqlAction = null)\n            where TEntity : class, new()\n        {\n            if (string.IsNullOrEmpty(tableName))\n                throw new ArgumentNullException(nameof(tableName));\n            if (entity == null)\n                throw new ArgumentNullException(nameof(entity));\n\n            var dbType = connection.GetDbType();\n            var sqlExpression = SqlExpression.Update<TEntity>(dbType, fields, tableName);\n            outSqlAction?.Invoke(sqlExpression.Script);\n\n            var result = connection.Execute(sqlExpression.Script, entity);\n            return result > 0;\n        }\n\n        /// <summary>\n        /// 条件修改\n        /// </summary>\n        /// <typeparam name=\"TEntity\"></typeparam>\n        /// <param name=\"connection\">连接</param>\n        /// <param name=\"tableName\">表名</param>\n        /// <param name=\"setExpress\">修改内容表达式</param>\n        /// <param name=\"whereExpress\">条件表达式</param>\n        /// <param name=\"outSqlAction\">返回sql语句</param>\n        /// <returns></returns>\n        public static bool Set<TEntity>(this\n            IDbConnection connection,\n            string tableName,\n            Expression<Func<object>> setExpress,\n            Expression<Func<TEntity, bool>> whereExpress,\n            Action<string> outSqlAction = null)\n            where TEntity : class, new()\n        {\n            if (string.IsNullOrEmpty(tableName))\n                throw new ArgumentNullException(nameof(tableName));\n            if (setExpress == null || whereExpress == null)\n                throw new ArgumentNullException($\"{nameof(setExpress)} / {nameof(whereExpress)}\");\n\n            var dbType = connection.GetDbType();\n            var sqlExpression = SqlExpression.Update<TEntity>(dbType, setExpress, tableName).Where(whereExpress);\n            outSqlAction?.Invoke(sqlExpression.Script); // 返回sql\n\n            var result = connection.Execute(sqlExpression.Script, sqlExpression.DbParams);\n            return result > 0;\n        }\n\n        /// <summary>\n        /// 条件修改 在字段上增减\n        /// </summary>\n        /// <typeparam name=\"TEntity\"></typeparam>\n        /// <typeparam name=\"TValue\"></typeparam>\n        /// <param name=\"connection\">连接</param>\n        /// <param name=\"tableName\">表名</param>\n        /// <param name=\"field\">增减的字段</param>\n        /// <param name=\"value\">增减的值</param>\n        /// <param name=\"whereExpress\">条件表达式</param>\n        /// <param name=\"outSqlAction\">返回sql语句</param>\n        /// <returns></returns>\n        public static bool Incr<TEntity, TValue>(this\n            IDbConnection connection,\n            string tableName,\n            string field,\n            TValue value,\n            Expression<Func<TEntity, bool>> whereExpress,\n            Action<string> outSqlAction = null)\n            where TEntity : class, new()\n        {\n            if (string.IsNullOrEmpty(tableName))\n                throw new ArgumentNullException(nameof(tableName));\n            if (string.IsNullOrEmpty(field))\n                throw new ArgumentNullException(field, \"增减字段不能为空\");\n\n            var dbType = connection.GetDbType();\n            var setExpressString = $\"{field.ParamSql(dbType)} = {field.ParamSql(dbType)} + ({value})\";\n            var sqlExpression = SqlExpression.Update<TEntity>(dbType, () => setExpressString, tableName).Where(whereExpress);\n            outSqlAction?.Invoke(sqlExpression.Script); // 返回sql\n\n            var result = connection.Execute(sqlExpression.Script, sqlExpression.DbParams);\n            return result > 0;\n        }\n\n        /// <summary>\n        /// 获取单条数据\n        /// </summary>\n        /// <typeparam name=\"TEntity\"></typeparam>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"tableName\">表名</param>\n        /// <param name=\"whereExpress\">条件表达式</param>\n        /// <param name=\"fieldExpress\">选择字段，默认为*</param>\n        /// <param name=\"outSqlAction\">返回sql语句</param>\n        /// <returns></returns>\n        public static TEntity Get<TEntity>(this\n            IDbConnection connection,\n            string tableName,\n            Expression<Func<TEntity, bool>> whereExpress,\n            Expression<Func<TEntity, object>> fieldExpress = null,\n            Action<string> outSqlAction = null)\n            where TEntity : class, new()\n        {\n            if (string.IsNullOrEmpty(tableName))\n                throw new ArgumentNullException(nameof(tableName));\n            if (whereExpress == null)\n                throw new ArgumentNullException(nameof(whereExpress));\n\n            var dbType = connection.GetDbType();\n            var sqlExpression = SqlExpression.Select(dbType, fieldExpress, tableName).Where(whereExpress);\n            sqlExpression = sqlExpression.TopOne();\n            outSqlAction?.Invoke(sqlExpression.Script); // 返回sql\n\n            var result = connection.QueryFirstOrDefault<TEntity>(sqlExpression.Script, sqlExpression.DbParams);\n            return result;\n        }\n\n        /// <summary>\n        /// 获取分页数据\n        /// </summary>\n        /// <typeparam name=\"TEntity\"></typeparam>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"page\"></param>\n        /// <param name=\"rows\"></param>\n        /// <param name=\"whereExpress\">条件表达式</param>\n        /// <param name=\"fieldExpress\">选择字段，默认为*</param>\n        /// <param name=\"orderByFields\">排序字段集合</param>\n        /// <param name=\"outSqlAction\">返回sql语句</param>\n        /// <returns></returns>\n        public static IEnumerable<TEntity> GetList<TEntity>(this\n            IDbConnection connection,\n            string tableName,\n            int page,\n            int rows,\n            Expression<Func<TEntity, bool>> whereExpress,\n            Expression<Func<TEntity, object>> fieldExpress = null,\n            List<OrderByField> orderByFields = null,\n            Action<string> outSqlAction = null)\n            where TEntity : class, new()\n        {\n            if (string.IsNullOrEmpty(tableName))\n                throw new ArgumentNullException(nameof(tableName));\n\n            var dbType = connection.GetDbType();\n            var sqlExpression = SqlExpression.Select(dbType, fieldExpress, tableName);\n            if (whereExpress != null)\n                sqlExpression.Where(whereExpress);\n\n            var orderBy = string.Empty;\n            if ((orderByFields?.Count ?? 0) > 0)\n                orderBy = $\" {string.Join(\", \", orderByFields.Select(oo => oo.Field.ParamSql(dbType) + \" \" + oo.OrderBy))}\";\n            sqlExpression.OrderBy(orderBy).Limit(page, rows);\n            outSqlAction?.Invoke(sqlExpression.Script); // 返回sql\n\n            var result = connection.Query<TEntity>(sqlExpression.Script, sqlExpression.DbParams);\n            return result;\n        }\n\n        /// <summary>\n        /// 获取分页数据 Offset\n        /// </summary>\n        /// <typeparam name=\"TEntity\"></typeparam>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"offset\"></param>\n        /// <param name=\"size\"></param>\n        /// <param name=\"whereExpress\">条件表达式</param>\n        /// <param name=\"fieldExpress\">选择字段，默认为*</param>\n        /// <param name=\"orderByFields\">排序字段集合</param>\n        /// <param name=\"outSqlAction\">返回sql语句</param>\n        /// <returns></returns>\n        public static IEnumerable<TEntity> GetOffsets<TEntity>(this\n            IDbConnection connection,\n            string tableName,\n            int offset,\n            int size,\n            Expression<Func<TEntity, bool>> whereExpress,\n            Expression<Func<TEntity, object>> fieldExpress = null,\n            List<OrderByField> orderByFields = null,\n            Action<string> outSqlAction = null)\n            where TEntity : class, new()\n        {\n            if (string.IsNullOrEmpty(tableName))\n                throw new ArgumentNullException(nameof(tableName));\n\n            var dbType = connection.GetDbType();\n            var sqlExpression = SqlExpression.Select(dbType, fieldExpress, tableName);\n            if (whereExpress != null)\n                sqlExpression.Where(whereExpress);\n\n            var orderBy = string.Empty;\n            if ((orderByFields?.Count ?? 0) > 0)\n                orderBy = $\" {string.Join(\", \", orderByFields.Select(oo => oo.Field.ParamSql(dbType) + \" \" + oo.OrderBy))}\";\n            sqlExpression.OrderBy(orderBy).Offset(offset, size);\n            outSqlAction?.Invoke(sqlExpression.Script); // 返回sql\n\n            var result = connection.Query<TEntity>(sqlExpression.Script, sqlExpression.DbParams);\n            return result;\n        }\n\n        /// <summary>\n        /// 获取数量\n        /// </summary>\n        /// <typeparam name=\"TEntity\"></typeparam>\n        /// <param name=\"connection\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"whereExpress\">条件表达式</param>\n        /// <param name=\"outSqlAction\">返回sql语句</param>\n        /// <returns></returns>\n        public static int Count<TEntity>(this\n            IDbConnection connection,\n            string tableName,\n            Expression<Func<TEntity, bool>> whereExpress,\n            Action<string> outSqlAction = null)\n            where TEntity : class, new()\n        {\n            if (string.IsNullOrEmpty(tableName))\n                throw new ArgumentNullException(nameof(tableName));\n\n            var dbType = connection.GetDbType();\n            var sqlExpression = SqlExpression.Count<TEntity>(dbType, tableName: tableName).Where(whereExpress);\n            outSqlAction?.Invoke(sqlExpression.Script); // 返回sql\n\n            var result = connection.QueryFirstOrDefault<int>(sqlExpression.Script, sqlExpression.DbParams);\n            return result;\n        }\n        #endregion\n\n        #region Private Method\n        static ConcurrentDictionary<string, DatabaseType> MSSqlDbType = new ConcurrentDictionary<string, DatabaseType>();\n        /// <summary>\n        /// 获取db类型\n        /// </summary>\n        /// <param name=\"connection\"></param>\n        /// <returns></returns>\n        internal static DatabaseType GetDbType(this IDbConnection connection)\n        {\n            if (connection is MySqlConnection)\n                return DatabaseType.MySql;\n            if (connection is SqlConnection)\n            {\n                return MSSqlDbType.GetOrAdd(connection.ConnectionString, (connectionString) =>\n                {\n                    var sqlConnection = (SqlConnection)connection;\n                    var v = sqlConnection.ServerVersion;\n                    int.TryParse(v.Substring(0, v.IndexOf(\".\")), out int bV);\n                    if (bV >= Constants.MSSQLVersion.SQLServer2012Bv)\n                        return DatabaseType.GteSqlServer2012;\n                    return DatabaseType.SqlServer;\n                });\n            }\n#if ASP_NET_CORE\n            if (connection is Microsoft.Data.Sqlite.SqliteConnection)\n#else\n            if (connection is System.Data.SQLite.SQLiteConnection)\n#endif\n                return DatabaseType.SQLite;\n\n            if (connection is Npgsql.NpgsqlConnection)\n                return DatabaseType.PostgreSQL;\n\n            return DatabaseType.MySql;\n        }\n\n        /// <summary>\n        /// 获取值\n        /// </summary>\n        /// <typeparam name=\"TEntity\"></typeparam>\n        /// <param name=\"propertyInfo\"></param>\n        /// <param name=\"expression\"></param>\n        /// <returns></returns>\n        internal static object GetValueFromExpression<TEntity>(this PropertyInfo propertyInfo, Expression<Func<TEntity, bool>> expression)\n        {\n            var dictionary = new Dictionary<object, object>();\n            ExpressionHelper.Resolve(expression.Body, ref dictionary);\n            if ((dictionary?.Count ?? 0) <= 0)\n                throw new ArgumentNullException($\"Property [{propertyInfo.Name}] 数据为空\");\n\n            dictionary.TryGetValue(propertyInfo.Name, out object val);\n            return val;\n        }\n\n        /// <summary>\n        /// 获取位数\n        /// </summary>\n        /// <param name=\"propertyInfo\"></param>\n        /// <returns></returns>\n        [Obsolete(\"请使用TableNameFunc\")]\n        internal static int GetBit(this PropertyInfo propertyInfo)\n        {\n            if (propertyInfo == null)\n                return -1;\n\n            var bit = ((SubmeterAttribute)propertyInfo.GetCustomAttribute(typeof(SubmeterAttribute)))?.Bit ?? -1;\n            return bit;\n        }\n\n        /// <summary>\n        /// 获取后缀\n        /// </summary>\n        /// <param name=\"val\"></param>\n        /// <param name=\"bit\"></param>\n        /// <returns></returns>\n        [Obsolete(\"请使用TableNameFunc\")]\n        internal static string GetSuffix(string val, int bit = 2)\n        {\n            if (string.IsNullOrEmpty(val))\n                throw new ArgumentNullException($\"分表数据为空\");\n            if (bit <= 0)\n                throw new ArgumentOutOfRangeException(\"length\", \"length必须是大于零的值。\");\n\n            var result = Encoding.Default.GetBytes(val.ToString());    //tbPass为输入密码的文本框\n            var md5Provider = new MD5CryptoServiceProvider();\n            var output = md5Provider.ComputeHash(result);\n            var hash = BitConverter.ToString(output).Replace(\"-\", \"\");  //tbMd5pass为输出加密文本\n\n            var suffix = hash.Substring(0, bit).ToUpper();\n            return suffix;\n        }\n\n        /// <summary>\n        /// 获取分表名 base md5\n        /// </summary>\n        /// <param name=\"propertyInfo\"></param>\n        /// <param name=\"val\"></param>\n        /// <returns></returns>\n        [Obsolete(\"请使用TableNameFunc\")]\n        internal static string GetSuffix(this PropertyInfo propertyInfo, string val)\n        {\n            var bit = propertyInfo.GetBit();\n            return GetSuffix(val.ToString(), bit);\n        }\n\n        /// <summary>\n        /// 获取分表名 base md5\n        /// </summary>\n        /// <typeparam name=\"TEntity\"></typeparam>\n        /// <param name=\"propertyInfo\"></param>\n        /// <param name=\"entity\"></param>\n        /// <returns></returns>\n        [Obsolete(\"请使用TableNameFunc\")]\n        internal static string GetSuffix<TEntity>(this PropertyInfo propertyInfo, TEntity entity) where TEntity : class, new()\n        {\n            var val = propertyInfo.GetValue(entity);\n            var bit = propertyInfo.GetBit();\n            return GetSuffix(val.ToString(), bit);\n        }\n\n        /// <summary>\n        /// 获取分表名 base md5\n        /// </summary>\n        /// <typeparam name=\"TEntity\"></typeparam>\n        /// <param name=\"propertyInfo\"></param>\n        /// <param name=\"expression\">表达式数据</param>\n        /// <returns></returns>\n        [Obsolete(\"请使用TableNameFunc\")]\n        internal static string GetSuffix<TEntity>(this PropertyInfo propertyInfo, Expression<Func<TEntity, bool>> expression) where TEntity : class, new()\n        {\n            var val = propertyInfo.GetValueFromExpression(expression);\n            var bit = propertyInfo.GetBit();\n            return GetSuffix(val.ToString(), bit);\n        }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Extensions/EntityDefinition.Extensions.cs",
    "content": "﻿using System;\nusing System.Collections.Concurrent;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Reflection;\n\nnamespace Overt.Core.Data\n{\n    /// <summary>\n    /// 字段定义说明\n    /// </summary>\n    public static class EntityDefinitionExtensions\n    {\n        private static ConcurrentDictionary<string, List<PropertyInfo>> _cacheSubmeter = new ConcurrentDictionary<string, List<PropertyInfo>>();\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <typeparam name=\"TAttribute\">属性</typeparam>\n        /// <param name=\"entity\"></param>\n        /// <returns></returns>\n        internal static TAttribute GetAttribute<TAttribute>(this Type entity) where TAttribute : Attribute\n        {\n            var attrs = entity.GetCustomAttributes(typeof(TAttribute));\n            if (attrs?.Count() > 0)\n                return (TAttribute)attrs.First();\n            return null;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <typeparam name=\"TAttribute\">属性</typeparam>\n        /// <param name=\"property\"></param>\n        /// <returns></returns>\n        internal static TAttribute GetAttribute<TAttribute>(this PropertyInfo property) where TAttribute : Attribute\n        {\n            var obs = property.GetCustomAttributes(typeof(TAttribute), false);\n            if (obs?.Count() > 0)\n                return (TAttribute)obs.First();\n            return null;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <typeparam name=\"TAttribute\"></typeparam>\n        /// <param name=\"entity\"></param>\n        /// <returns></returns>\n        internal static PropertyInfo GetProperty<TAttribute>(this Type entity) where TAttribute : Attribute\n        {\n            var propertyInfos = _cacheSubmeter.GetOrAdd($\"{entity.Name}_{typeof(TAttribute).Name}\",\n                key => entity.GetPropertyByAttribute<TAttribute>());\n            return propertyInfos.FirstOrDefault();\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <typeparam name=\"TAttribute\"></typeparam>\n        /// <param name=\"entity\"></param>\n        /// <returns></returns>\n        internal static List<PropertyInfo> GetProperties<TAttribute>(this Type entity) where TAttribute : Attribute\n        {\n            var propertyInfos = _cacheSubmeter.GetOrAdd($\"{entity.Name}_{typeof(TAttribute).Name}\",\n                key => entity.GetPropertyByAttribute<TAttribute>());\n            return propertyInfos;\n        }\n\n        /// <summary>\n        /// \n        /// </summary>\n        /// <typeparam name=\"TAttribute\">属性</typeparam>\n        /// <param name=\"entity\"></param>\n        /// <returns></returns>\n        internal static List<PropertyInfo> GetPropertyByAttribute<TAttribute>(this Type entity) where TAttribute : Attribute\n        {\n            var list = new List<PropertyInfo>();\n            var pis = entity.GetProperties();\n            foreach (var item in pis)\n            {\n                var obs = item.GetCustomAttributes(typeof(TAttribute), false);\n                if (obs?.Count() > 0)\n                    list.Add(item);\n            }\n            return list;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Extensions/Expression.Extensions.cs",
    "content": "﻿using System;\nusing System.Linq;\nusing System.Linq.Expressions;\n\nnamespace Overt.Core.Data\n{\n    /// <summary>\n    /// expression 扩展\n    /// </summary>\n    public static class ExpressionExtensions\n    {\n        /// <summary>\n        /// and\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"expr1\"></param>\n        /// <param name=\"expr2\"></param>\n        /// <returns></returns>\n        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,\n        Expression<Func<T, bool>> expr2)\n        {\n            var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());\n            return Expression.Lambda<Func<T, bool>>\n            (Expression.AndAlso(expr1.Body, expr2.Body), expr1.Parameters);\n        }\n\n        /// <summary>\n        /// or\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"expr1\"></param>\n        /// <param name=\"expr2\"></param>\n        /// <returns></returns>\n        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,\n        Expression<Func<T, bool>> expr2)\n        {\n            var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());\n            return Expression.Lambda<Func<T, bool>>\n            (Expression.OrElse(expr1.Body, expr2.Body), expr1.Parameters);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Extensions/SqlAlias.Extensions.cs",
    "content": "﻿using Overt.Core.Data.Expressions;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.Linq;\nusing System.Reflection;\n\nnamespace Overt.Core.Data\n{\n    /// <summary>\n    /// Sql别名\n    /// </summary>\n    public static class SqlAliasExtensions\n    {\n        /// <summary>\n        /// 参数前缀\n        /// </summary>\n        /// <param name=\"dbType\"></param>\n        /// <returns></returns>\n        public static string ParamPrefix(this DatabaseType dbType)\n        {\n            switch (dbType)\n            {\n                case DatabaseType.SqlServer:\n                case DatabaseType.GteSqlServer2012:\n                    return \"@\";\n                case DatabaseType.MySql:\n                    return \"?\";\n                case DatabaseType.SQLite:\n                    return \"@\";\n                case DatabaseType.PostgreSQL:\n                    return \"@\";\n                default:\n                    return string.Empty;\n            }\n        }\n\n        /// <summary>\n        /// 获取添加左右标记 防止有关键字作为字段名/表名\n        /// </summary>\n        /// <param name=\"columnName\"></param>\n        /// <param name=\"sqlGenerate\"></param>\n        /// <returns></returns>\n        public static string ParamSql(this string columnName, SqlGenerate sqlGenerate)\n        {\n            return columnName.ParamSql(sqlGenerate?.DatabaseType);\n        }\n\n        /// <summary>\n        /// 获取添加左右标记 防止有关键字作为字段名/表名\n        /// </summary>\n        /// <param name=\"columnName\"></param>\n        /// <param name=\"dbType\"></param>\n        /// <returns></returns>\n        public static string ParamSql(this string columnName, DatabaseType? dbType)\n        {\n            switch (dbType)\n            {\n                case DatabaseType.SqlServer:\n                case DatabaseType.GteSqlServer2012:\n                    if (columnName.StartsWith(\"[\"))\n                        return columnName;\n                    return $\"[{columnName}]\";\n                case DatabaseType.MySql:\n                    if (columnName.StartsWith(\"`\"))\n                        return columnName;\n                    return $\"`{columnName}`\";\n                case DatabaseType.SQLite:\n                    if (columnName.StartsWith(\"`\"))\n                        return columnName;\n                    return $\"`{columnName}`\";\n                case DatabaseType.PostgreSQL:\n                    if (columnName.StartsWith(\"\\\"\"))\n                        return columnName;\n                    return $\"\\\"{columnName}\\\"\";\n                default:\n                    return columnName;\n            }\n        }\n\n        /// <summary>\n        /// 获取添加字段\n        /// </summary>\n        /// <param name=\"columnName\"></param>\n        /// <param name=\"dbType\"></param>\n        /// <param name=\"customFields\"></param>\n        /// <returns></returns>\n        public static string ParamValue(this string columnName, DatabaseType? dbType, List<PropertyInfo> customFields)\n        {\n            switch (dbType)\n            {\n                case DatabaseType.SqlServer:\n                case DatabaseType.GteSqlServer2012:\n                    return $\"@{columnName}\";\n                case DatabaseType.MySql:\n                    return $\"@{columnName}\";\n                case DatabaseType.SQLite:\n                    return $\"@{columnName}\";\n                case DatabaseType.PostgreSQL:\n                    var customPi = customFields?.FirstOrDefault(p=>p.Name.Equals(columnName));\n                    if (customPi != null)\n                    {\n                        var attribute = customPi.GetAttribute<DataTypeAttribute>();\n                        if (attribute != null && attribute.CustomDataType.ToLower() == DataCustomType.Jsonb.ToString().ToLower())\n                            return $\"CAST(@{columnName} AS json)\";\n                        return $\"@{columnName}\";\n                    }\n                    return $\"@{columnName}\";\n                default:\n                    return $\"@{columnName}\";\n            }\n        }\n\n        /// <summary>\n        /// 获取最后一次Insert\n        /// </summary>\n        /// <param name=\"dbType\"></param>\n        /// <returns></returns>\n        public static string SelectLastIdentity(this DatabaseType dbType)\n        {\n            switch (dbType)\n            {\n                case DatabaseType.SqlServer:\n                case DatabaseType.GteSqlServer2012:\n                    return \" select @@Identity\";\n                case DatabaseType.MySql:\n                    return \" select LAST_INSERT_ID();\";\n                case DatabaseType.SQLite:\n                    return \" select last_insert_rowid();\";\n                case DatabaseType.PostgreSQL:\n                    return \"  select LASTVAL();\";\n                default:\n                    return string.Empty;\n            }\n        }\n\n        /// <summary>\n        /// 是否存在表\n        /// </summary>\n        /// <param name=\"dbType\"></param>\n        /// <param name=\"dbName\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <returns></returns>\n        public static string ExistTableSql(this DatabaseType dbType, string dbName, string tableName)\n        {\n            switch (dbType)\n            {\n                case DatabaseType.SqlServer:\n                case DatabaseType.GteSqlServer2012:\n                    return $\"select count(1) from sys.tables where name='{tableName}' and type = 'u'\";\n                case DatabaseType.MySql:\n                    return $\"select count(1) from information_schema.tables where table_schema = '{dbName}' and table_name = '{tableName}'\";\n                case DatabaseType.SQLite:\n                    return $\"select count(1) from sqlite_master where type = 'table' and name='{tableName}'\";\n                case DatabaseType.PostgreSQL:\n                    return $\"select count(1) from pg_class where relname = '{tableName}';\";\n                default: return string.Empty;\n            }\n        }\n\n        /// <summary>\n        /// 是否存在字段\n        /// </summary>\n        /// <param name=\"dbType\"></param>\n        /// <param name=\"dbName\"></param>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"fieldName\"></param>\n        /// <returns></returns>\n        public static string ExistFieldSql(this DatabaseType dbType, string dbName, string tableName, string fieldName)\n        {\n            switch (dbType)\n            {\n                case DatabaseType.SqlServer:\n                case DatabaseType.GteSqlServer2012:\n                    return $\"select count(1) sys.columns where object_id = object_id('{tableName}') and name='{fieldName}'\";\n                case DatabaseType.MySql:\n                    return $\"select count(1) from information_schema.columns where table_schema = '{dbName}' and table_name  = '{tableName}' and column_name = '{fieldName}'\";\n                case DatabaseType.SQLite:\n                    return $\"select * from sqlite_master where name='{tableName}' and sql like '%{fieldName}%';\";\n                case DatabaseType.PostgreSQL:\n                    return $\"select count(1) from information_schema.columns WHERE table_schema = '{dbName}' and table_name = '{tableName}' and column_name = '{fieldName}'\";\n                default: return string.Empty;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Extensions/Table.Extensions.cs",
    "content": "﻿using Dapper;\nusing System;\nusing System.Collections.Concurrent;\nusing System.Transactions;\n\nnamespace Overt.Core.Data\n{\n    /// <summary>\n    /// 表管理\n    /// </summary>\n    public static class TableExtensions\n    {\n        private static ConcurrentDictionary<string, object> lockObjectMap = new ConcurrentDictionary<string, object>();\n        private static ConcurrentDictionary<string, bool> tableExistMap = new ConcurrentDictionary<string, bool>();\n\n        /// <summary>\n        /// 检查表是否存在\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"repository\"></param>\n        /// <param name=\"isMaster\"></param>\n        /// <returns>false, 直接返回默认数据即可</returns>\n        public static bool CheckTableIfMissingCreate<T>(this IBaseRepository<T> repository, bool isMaster)\n            where T : class, new()\n        {\n            var tableName = repository.TableNameFunc?.Invoke();\n            var createScript = repository.CreateScriptFunc?.Invoke(tableName);\n            if (string.IsNullOrEmpty(createScript))\n                return true;\n            if (string.IsNullOrEmpty(tableName))\n                throw new Exception($\"CheckTableIfMissingCreate: TableNameFunc 必须提供\");\n\n            var tableKey = $\"{repository.DbStoreKey}_{tableName}_{isMaster}\";\n            lock (lockObjectMap.GetOrAdd(tableKey, new object()))\n            {\n                var existTable = tableExistMap.GetOrAdd(tableKey, k => repository.IsExistTable(tableName, isMaster));\n                if (existTable)\n                    return true;\n\n                tableExistMap.TryRemove(tableKey, out existTable);\n                if (!isMaster)\n                    return false;\n\n                try\n                {\n                    using (var scope = new TransactionScope(TransactionScopeOption.Suppress, TransactionScopeAsyncFlowOption.Enabled))\n                    using (var connection = repository.OpenConnection(true))\n                    {\n                        connection.Execute(createScript);\n                    }\n                    return true;\n                }\n                catch (Exception ex)\n                {\n                    throw ex;\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Overt.Core.Data.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFrameworks>net461;netstandard2.0</TargetFrameworks>\n    <PackageId>Overt.Core.Data</PackageId>\n    <Title></Title>\n    <Authors>Yaofeng</Authors>\n    <Description>Overt.Core.Data</Description>\n    <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>\n    <PackageReleaseNotes>lambda表达式解析增加 !Contains 生成 not like</PackageReleaseNotes>\n    <Copyright>Overt</Copyright>\n    <PackageTags></PackageTags>\n    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>\n    <AssemblyVersion>1.0.0.0</AssemblyVersion>\n    <FileVersion>1.0.0.0</FileVersion>\n    <Version>2.3.3</Version>\n    <RepositoryUrl>http://github.com/overtly/core-data</RepositoryUrl>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|AnyCPU'\">\n    <DocumentationFile>Overt.Core.Data.xml</DocumentationFile>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|AnyCPU'\">\n    <DocumentationFile>bin\\Release\\netstandard2.0\\Overt.Core.Data.xml</DocumentationFile>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(Configuration)|$(TargetFramework)|$(Platform)'=='Debug|net461|AnyCPU'\">\n    <DefineConstants>TRACE;DEBUG;NET461</DefineConstants>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\" '$(TargetFramework)' == 'netstandard2.0' \">\n    <Title>ASP.NET Core 2 integration for Overt.Core.Data - .NET Standard 2</Title>\n    <DefineConstants>$(DefineConstants);ASP_NET_CORE;ASP_NET_CORE2</DefineConstants>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Dapper\" Version=\"2.0.35\" />\n    <PackageReference Include=\"MySql.Data\" Version=\"8.0.20\" />\n    <PackageReference Include=\"Npgsql\" Version=\"5.0.7\" />\n    <PackageReference Include=\"System.ComponentModel.Annotations\" Version=\"4.7.0\" />\n    <PackageReference Include=\"System.Data.SqlClient\" Version=\"4.8.5\" />\n  </ItemGroup>\n\n  <ItemGroup Condition=\"'$(TargetFramework)' == 'netstandard2.0'\">\n    <PackageReference Include=\"Microsoft.Extensions.Configuration\" Version=\"2.0.0\" />\n    <PackageReference Include=\"Microsoft.Data.SQLite\" Version=\"3.1.5\" />\n  </ItemGroup>\n\n  <ItemGroup Condition=\"'$(TargetFramework)'=='NET461'\">\n    <Reference Include=\"System.Configuration\" />\n    <PackageReference Include=\"System.Data.SQLite\" Version=\"1.0.113.1\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "src/Overt.Core.Data/Overt.Core.Data.xml",
    "content": "<?xml version=\"1.0\"?>\n<doc>\n    <assembly>\n        <name>Overt.Core.Data</name>\n    </assembly>\n    <members>\n        <member name=\"T:Overt.Core.Data.SubmeterAttribute\">\n            <summary>\n            分表标识\n            </summary>\n        </member>\n        <member name=\"P:Overt.Core.Data.SubmeterAttribute.Bit\">\n            <summary>\n            16进制位数\n            1 16\n            2 256\n            3 4096 \n            ...\n            </summary>\n        </member>\n        <member name=\"F:Overt.Core.Data.Constants.MSSQLVersion.SQLServer2012Bv\">\n            <summary>\n            SQLServer2012版本\n            </summary>\n        </member>\n        <member name=\"T:Overt.Core.Data.IBaseRepository`1\">\n            <summary>\n            接口\n            </summary>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.GetMainTableName\">\n            <summary>\n            获取主表名\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.GetTableName\">\n            <summary>\n            获取表名:内部会调用TableNameFunc 从主库中查询\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.GetTableName(System.String)\">\n            <summary>\n            获取表名：以Submeter分表位数获取表名\n            </summary>\n            <param name=\"key\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.IsExistTable(System.String,System.Boolean)\">\n            <summary>\n            是否存在表\n            </summary>\n            <param name=\"tableName\"></param>\n            <param name=\"isMaster\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.IsExistField(System.String,System.String,System.Boolean)\">\n            <summary>\n            是否存在字段\n            </summary>\n            <param name=\"tableName\"></param>\n            <param name=\"fieldName\"></param>\n            <param name=\"isMaster\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.Add(`0,System.Boolean)\">\n            <summary>\n            添加\n            </summary>\n            <param name=\"entity\">数据实体</param>\n            <param name=\"returnLastIdentity\">是否赋值最后一次的自增ID</param>\n            <returns>添加后的数据实体</returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.Add(`0[])\">\n            <summary>\n            批量添加\n            </summary>\n            <param name=\"entities\">数据实体</param>\n            <returns>bool</returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.Delete(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})\">\n            <summary>\n            删除\n            </summary>\n            <param name=\"expression\">删除条件</param>\n            <returns>是否成功</returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.Set(`0,System.Linq.Expressions.Expression{System.Func{`0,System.Object}})\">\n            <summary>\n            更新\n            </summary>\n            <param name=\"entity\">数据实体</param>\n            <param name=\"fields\">x=> x.SomeProperty1 or x=> new { x.SomeProperty1, x.SomeProperty2 }</param>\n            <returns>是否成功</returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.Set(System.Linq.Expressions.Expression{System.Func{System.Object}},System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})\">\n            <summary>\n            根据字段修改\n            </summary>\n            <param name=\"setExpress\">修改字段表达式 object =>dynamic 是一个匿名类</param>\n            <param name=\"whereExpress\">条件表达式</param>\n            <returns>是否成功</returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.Incr``1(System.String,``0,System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})\">\n            <summary>\n            根据条件 在原字段上增减数据\n            </summary>\n            <param name=\"field\">增减的字段</param>\n            <param name=\"value\">增减的值</param>\n            <param name=\"whereExpress\">条件表达式</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.Get(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}},System.Linq.Expressions.Expression{System.Func{`0,System.Object}},System.Boolean)\">\n            <summary>\n            获取一条数据\n            </summary>\n            <param name=\"expression\">查询条件</param>\n            <param name=\"fieldExpressison\">按字段返回</param>\n            <param name=\"isMaster\">是否主从</param>\n            <returns>实体</returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.GetList(System.Int32,System.Int32,System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}},System.Linq.Expressions.Expression{System.Func{`0,System.Object}},System.Boolean,Overt.Core.Data.OrderByField[])\">\n            <summary>\n            获取列表 \n            </summary>\n            <param name=\"page\"></param>\n            <param name=\"rows\"></param>\n            <param name=\"expression\">条件表达式</param>\n            <param name=\"fieldExpressison\">按字段返回</param>\n            <param name=\"isMaster\">是否主从</param>\n            <param name=\"orderByFields\">排序字段集合</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.GetOffsets(System.Int32,System.Int32,System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}},System.Linq.Expressions.Expression{System.Func{`0,System.Object}},System.Boolean,Overt.Core.Data.OrderByField[])\">\n            <summary>\n            获取列表 Offset\n            </summary>\n            <param name=\"offset\"></param>\n            <param name=\"size\"></param>\n            <param name=\"expression\">条件表达式</param>\n            <param name=\"fieldExpressison\">按字段返回</param>\n            <param name=\"isMaster\">是否主从</param>\n            <param name=\"orderByFields\">排序字段集合</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.Count(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}},System.Boolean)\">\n            <summary>\n            获取数量\n            </summary>\n            <param name=\"expression\">条件表达式</param>\n            <param name=\"isMaster\">是否主从</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.IsExistTableAsync(System.String,System.Boolean)\">\n            <summary>\n            是否存在表\n            </summary>\n            <param name=\"tableName\"></param>\n            <param name=\"isMaster\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.IsExistFieldAsync(System.String,System.String,System.Boolean)\">\n            <summary>\n            是否存在字段\n            </summary>\n            <param name=\"tableName\"></param>\n            <param name=\"fieldName\"></param>\n            <param name=\"isMaster\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.AddAsync(`0,System.Boolean)\">\n            <summary>\n            异步添加\n            </summary>\n            <param name=\"entity\"></param>\n            <param name=\"returnLastIdentity\">是否赋值最后一次的自增ID</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.AddAsync(`0[])\">\n            <summary>\n            异步批量添加\n            </summary>\n            <param name=\"entities\">数据实体</param>\n            <returns>bool</returns>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.DeleteAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})\">\n            <summary>\n            异步删除\n            </summary>\n            <param name=\"expression\">删除条件</param>\n            <returns>是否成功</returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.SetAsync(`0,System.Linq.Expressions.Expression{System.Func{`0,System.Object}})\">\n            <summary>\n            异步更新\n            </summary>\n            <param name=\"entity\">数据实体</param>\n            <param name=\"fields\">x=> x.SomeProperty1 or x=> new { x.SomeProperty1, x.SomeProperty2 }</param>\n            <returns>是否成功</returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.SetAsync(System.Linq.Expressions.Expression{System.Func{System.Object}},System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})\">\n            <summary>\n            异步根据字段修改\n            </summary>\n            <param name=\"setExpress\">修改字段表达式</param>\n            <param name=\"whereExpress\">条件表达式</param>\n            <returns>是否成功</returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.IncrAsync``1(System.String,``0,System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})\">\n            <summary>\n            根据条件 在原字段上增减数据\n            </summary>\n            <param name=\"field\">增减的字段</param>\n            <param name=\"value\">增减的值</param>\n            <param name=\"whereExpress\">条件表达式</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.GetAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}},System.Linq.Expressions.Expression{System.Func{`0,System.Object}},System.Boolean)\">\n            <summary>\n            异步获取一条数据\n            </summary>\n            <param name=\"expression\">查询条件</param>\n            <param name=\"fieldExpressison\">按字段返回</param>\n            <param name=\"isMaster\">是否主从</param>\n            <returns>实体</returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.GetListAsync(System.Int32,System.Int32,System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}},System.Linq.Expressions.Expression{System.Func{`0,System.Object}},System.Boolean,Overt.Core.Data.OrderByField[])\">\n            <summary>\n            异步获取列表\n            </summary>\n            <param name=\"page\"></param>\n            <param name=\"rows\"></param>\n            <param name=\"expression\">条件表达式</param>\n            <param name=\"fieldExpressison\">按字段返回</param>\n            <param name=\"isMaster\">是否主从</param>\n            <param name=\"orderByFields\">排序字段集合</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.GetOffsetsAsync(System.Int32,System.Int32,System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}},System.Linq.Expressions.Expression{System.Func{`0,System.Object}},System.Boolean,Overt.Core.Data.OrderByField[])\">\n            <summary>\n            异步获取列表 Offset\n            </summary>\n            <param name=\"offset\"></param>\n            <param name=\"size\"></param>\n            <param name=\"expression\">条件表达式</param>\n            <param name=\"fieldExpressison\">按字段返回</param>\n            <param name=\"isMaster\">是否主从</param>\n            <param name=\"orderByFields\">排序字段集合</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.IBaseRepository`1.CountAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}},System.Boolean)\">\n            <summary>\n            异步获取数量\n            </summary>\n            <param name=\"expression\">条件表达式</param>\n            <param name=\"isMaster\">是否主从</param>\n            <returns></returns>\n        </member>\n        <member name=\"T:Overt.Core.Data.IPropertyAssist\">\n            <summary>\n            通用的接口\n            </summary>\n        </member>\n        <member name=\"P:Overt.Core.Data.IPropertyAssist.DbStoreKey\">\n            <summary>\n            数据库key\n            </summary>\n        </member>\n        <member name=\"P:Overt.Core.Data.IPropertyAssist.TableNameFunc\">\n            <summary>\n            表名生成方法\n            </summary>\n        </member>\n        <member name=\"P:Overt.Core.Data.IPropertyAssist.CreateScriptFunc\">\n            <summary>\n            创建表的sql语句\n            参数：表名\n            </summary>\n        </member>\n        <member name=\"P:Overt.Core.Data.IPropertyAssist.ConnectionFunc\">\n            <summary>\n            连接方法创建\n            </summary>\n        </member>\n        <member name=\"M:Overt.Core.Data.IPropertyAssist.OpenConnection(System.Boolean)\">\n            <summary>\n            打开连接\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"P:Overt.Core.Data.IPropertyAssist.ExecuteScript\">\n            <summary>\n            执行的sql脚本\n            </summary>\n        </member>\n        <member name=\"T:Overt.Core.Data.DataContext\">\n            <summary>\n            数据库连接工具类\n            </summary>\n        </member>\n        <member name=\"P:Overt.Core.Data.DataContext.DbConnection\">\n            <summary>\n            连接对象\n            </summary>\n        </member>\n        <member name=\"M:Overt.Core.Data.DataContext.#ctor(System.Boolean,System.String,System.Func{System.Boolean,System.Configuration.ConnectionStringSettings})\">\n            <summary>\n            构造函数\n            </summary>\n            <param name=\"isMaster\">是否从库</param>\n            <param name=\"dbStoreKey\">存储字符串标识</param>\n            <param name=\"connectionFunc\">连接字符串Func</param>\n        </member>\n        <member name=\"M:Overt.Core.Data.DataContext.CreateAndOpen\">\n            <summary>\n            打开链接\n            </summary>\n        </member>\n        <member name=\"M:Overt.Core.Data.DataContext.GetFactory(Overt.Core.Data.DatabaseType)\">\n            <summary>\n            获取Factory\n            </summary>\n            <param name=\"dbType\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DataContext.Dispose\">\n            <summary>\n            垃圾回收\n            </summary>\n        </member>\n        <member name=\"T:Overt.Core.Data.DataSettings\">\n            <summary>\n            连接配置信息获取\n            1. master / secondary\n            2. xx.master / xx.secondary\n            </summary>\n        </member>\n        <member name=\"P:Overt.Core.Data.DataSettings.Default\">\n            <summary>\n            单例模式\n            </summary>\n        </member>\n        <member name=\"M:Overt.Core.Data.DataSettings.#ctor\">\n            <summary>\n            构造函数\n            </summary>\n        </member>\n        <member name=\"M:Overt.Core.Data.DataSettings.Get(System.Boolean,System.String,System.Func{System.Boolean,System.Configuration.ConnectionStringSettings})\">\n            <summary>\n            获取连接字符串\n            </summary>\n            <param name=\"isMaster\"></param>\n            <param name=\"dbStoreKey\"></param>\n            <param name=\"connectionFunc\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DataSettings.GetKey(System.Boolean,System.String)\">\n            <summary>\n            获取\n            </summary>\n            <param name=\"isMaster\"></param>\n            <param name=\"dbStoreKey\">不能包含点</param>\n            <returns></returns>\n        </member>\n        <member name=\"T:Overt.Core.Data.DatabaseType\">\n            <summary>\n            数据库类型\n            </summary>\n        </member>\n        <member name=\"F:Overt.Core.Data.DatabaseType.SqlServer\">\n            <summary>\n            SqlServer\n            </summary>\n        </member>\n        <member name=\"F:Overt.Core.Data.DatabaseType.GteSqlServer2012\">\n            <summary>\n            >=SqlServer2012\n            </summary>\n        </member>\n        <member name=\"F:Overt.Core.Data.DatabaseType.MySql\">\n            <summary>\n            Mysql\n            </summary>\n        </member>\n        <member name=\"F:Overt.Core.Data.DatabaseType.SQLite\">\n            <summary>\n            Sqlite\n            </summary>\n        </member>\n        <member name=\"F:Overt.Core.Data.DatabaseType.PostgreSQL\">\n            <summary>\n            PostgreSQL\n            </summary>\n        </member>\n        <member name=\"T:Overt.Core.Data.DataCustomType\">\n            <summary>\n            自定义字段类型\n            </summary>\n        </member>\n        <member name=\"F:Overt.Core.Data.DataCustomType.None\">\n            <summary>\n            未定义\n            </summary>\n        </member>\n        <member name=\"F:Overt.Core.Data.DataCustomType.Jsonb\">\n            <summary>\n            jsonb类型\n            </summary>\n        </member>\n        <member name=\"T:Overt.Core.Data.FieldSortType\">\n            <summary>\n            字段排序类型\n            </summary>\n        </member>\n        <member name=\"F:Overt.Core.Data.FieldSortType.Asc\">\n            <summary>\n            顺序\n            </summary>\n        </member>\n        <member name=\"F:Overt.Core.Data.FieldSortType.Desc\">\n            <summary>\n            倒序\n            </summary>\n        </member>\n        <member name=\"T:Overt.Core.Data.Expressions.ExpressionHelper\">\n            <summary>\n            解析为 Dictionary 获取表达式中的key - value\n            只需要有等于号的\n            </summary>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.ExpressionHelper.Resolve(System.Linq.Expressions.Expression,System.Collections.Generic.Dictionary{System.Object,System.Object}@)\">\n            <summary>\n            获取参数\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"dictionary\"></param>\n        </member>\n        <member name=\"T:Overt.Core.Data.Expressions.ExpressionExtensions\">\n            <summary>\n            表达式扩展\n            </summary>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.ExpressionExtensions.IsNullableType(System.Type)\">\n            <summary>\n            是否为空类型\n            </summary>\n            <param name=\"type\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.ExpressionExtensions.IsOrHasGenericInterfaceTypeOf(System.Type,System.Type)\">\n            <summary>\n            是否是\n            </summary>\n            <param name=\"type\"></param>\n            <param name=\"genericTypeDefinition\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.ExpressionExtensions.GetTypeWithGenericTypeDefinitionOf(System.Type,System.Type)\">\n            <summary>\n            是否是泛型\n            </summary>\n            <param name=\"type\"></param>\n            <param name=\"genericTypeDefinition\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.ExpressionExtensions.FirstGenericType(System.Type)\">\n            <summary>\n            \n            </summary>\n            <param name=\"type\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.ExpressionExtensions.GetMemberExpression(System.Linq.Expressions.MemberExpression)\">\n            <summary>\n            \n            </summary>\n            <param name=\"m\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.ExpressionExtensions.IsParameterAccess(System.Linq.Expressions.Expression)\">\n            <summary>\n            Determines whether the expression is the parameter.\n            </summary>\n            <returns>Returns true if the specified expression is parameter;\n            otherwise, false.</returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.ExpressionExtensions.IsParameterOrConvertAccess(System.Linq.Expressions.Expression)\">\n            <summary>\n            \n            </summary>\n            <param name=\"e\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.ExpressionExtensions.CheckExpressionForTypes(System.Linq.Expressions.Expression,System.Linq.Expressions.ExpressionType[])\">\n            <summary>\n            检查类型\n            </summary>\n            <param name=\"e\"></param>\n            <param name=\"types\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.ExpressionExtensions.IsBooleanComparison(System.Linq.Expressions.Expression)\">\n            <summary>\n            是否是Boolean\n            </summary>\n            <param name=\"e\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.ExpressionExtensions.GetValue(System.Linq.Expressions.MemberBinding)\">\n            <summary>\n            获取Value\n            </summary>\n            <param name=\"binding\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.ExpressionExtensions.GetFieldNames``1(System.Linq.Expressions.Expression{System.Func{``0,System.Object}})\">\n            <summary>\n            获取Fields\n            </summary>\n            <typeparam name=\"T\"></typeparam>\n            <param name=\"expr\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.ExpressionExtensions.Flatten(System.Collections.IEnumerable)\">\n            <summary>\n            \n            </summary>\n            <param name=\"list\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:Overt.Core.Data.Expressions.BaseSqlExpression`1\">\n            <summary>\n            BaseSqlExpression\n            </summary>\n            <typeparam name=\"T\"></typeparam>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.BaseSqlExpression`1.Update(`0,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            Update\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.BaseSqlExpression`1.Select(`0,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            Select\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.BaseSqlExpression`1.Where(`0,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            Where\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.BaseSqlExpression`1.In(`0,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            In\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.BaseSqlExpression`1.OrderBy(`0,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            OrderBy\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.BaseSqlExpression`1.Max(`0,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            Max\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.BaseSqlExpression`1.Min(`0,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            Min\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.BaseSqlExpression`1.Avg(`0,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            Avg\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.BaseSqlExpression`1.Count(`0,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            Count\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.BaseSqlExpression`1.Sum(`0,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            Sum\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.BaseSqlExpression`1.Update(System.Linq.Expressions.Expression,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            Update\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.BaseSqlExpression`1.Select(System.Linq.Expressions.Expression,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            Select\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.BaseSqlExpression`1.Where(System.Linq.Expressions.Expression,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            Where\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.BaseSqlExpression`1.In(System.Linq.Expressions.Expression,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            In\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.BaseSqlExpression`1.OrderBy(System.Linq.Expressions.Expression,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            OrderBy\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.BaseSqlExpression`1.Max(System.Linq.Expressions.Expression,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            Max\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.BaseSqlExpression`1.Min(System.Linq.Expressions.Expression,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            Min\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.BaseSqlExpression`1.Avg(System.Linq.Expressions.Expression,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            Avg\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.BaseSqlExpression`1.Count(System.Linq.Expressions.Expression,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            Count\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.BaseSqlExpression`1.Sum(System.Linq.Expressions.Expression,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            Sum\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.BaseSqlExpression`1.IsStaticArrayMethod(System.Linq.Expressions.MethodCallExpression)\">\n            <summary>\n            是否是静态集合方法\n            </summary>\n            <param name=\"m\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.BaseSqlExpression`1.IsEnumerableMethod(System.Linq.Expressions.MethodCallExpression)\">\n            <summary>\n            是否是集合方法\n            </summary>\n            <param name=\"m\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:Overt.Core.Data.Expressions.ISqlExpression\">\n            <summary>\n            interface\n            </summary>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.ISqlExpression.Update(System.Linq.Expressions.Expression,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            Update\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.ISqlExpression.Select(System.Linq.Expressions.Expression,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            Select\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.ISqlExpression.Where(System.Linq.Expressions.Expression,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            Where\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.ISqlExpression.In(System.Linq.Expressions.Expression,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            In\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.ISqlExpression.OrderBy(System.Linq.Expressions.Expression,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            OrderBy\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.ISqlExpression.Max(System.Linq.Expressions.Expression,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            Max\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.ISqlExpression.Min(System.Linq.Expressions.Expression,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            Min\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.ISqlExpression.Avg(System.Linq.Expressions.Expression,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            Avg\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.ISqlExpression.Count(System.Linq.Expressions.Expression,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            Count\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.ISqlExpression.Sum(System.Linq.Expressions.Expression,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            Sum\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.MemberSqlExpression.IsEnumerable(System.Linq.Expressions.MemberExpression)\">\n            <summary>\n            是否是集合方法\n            </summary>\n            <param name=\"m\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:Overt.Core.Data.Expressions.SqlExpression\">\n            <summary>\n            Expression => Sql \n            </summary>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpression.Insert``1(Overt.Core.Data.DatabaseType,System.String,System.Boolean)\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"T\"></typeparam>\n            <param name=\"dbType\"></param>\n            <param name=\"tableName\"></param>\n            <param name=\"returnLastIdentity\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpression.Delete``1(Overt.Core.Data.DatabaseType,System.String)\">\n            <summary>\n            删除\n            </summary>\n            <typeparam name=\"T\"></typeparam>\n            <param name=\"dbType\">数据库类型</param>\n            <param name=\"tableName\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpression.Update``1(Overt.Core.Data.DatabaseType,System.Linq.Expressions.Expression{System.Func{System.Object}},System.String)\">\n            <summary>\n            修改\n            </summary>\n            <typeparam name=\"T\"></typeparam>\n            <param name=\"dbType\">数据库类型</param>\n            <param name=\"expression\"></param>\n            <param name=\"tableName\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpression.Update``1(Overt.Core.Data.DatabaseType,System.Collections.Generic.IEnumerable{System.String},System.String)\">\n            <summary>\n            修改\n            </summary>\n            <typeparam name=\"T\"></typeparam>\n            <param name=\"dbType\">数据库类型</param>\n            <param name=\"fields\"></param>\n            <param name=\"tableName\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpression.Select``1(Overt.Core.Data.DatabaseType,System.Linq.Expressions.Expression{System.Func{``0,System.Object}},System.String)\">\n            <summary>\n            查询\n            </summary>\n            <typeparam name=\"T\"></typeparam>\n            <param name=\"dbType\">数据库类型</param>\n            <param name=\"expression\"></param>\n            <param name=\"tableName\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpression.Count``1(Overt.Core.Data.DatabaseType,System.Linq.Expressions.Expression{System.Func{``0,System.Object}},System.String)\">\n            <summary>\n            数量\n            </summary>\n            <typeparam name=\"T\"></typeparam>\n            <param name=\"dbType\">数据库类型</param>\n            <param name=\"expression\"></param>\n            <param name=\"tableName\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpression.Max``1(Overt.Core.Data.DatabaseType,System.Linq.Expressions.Expression{System.Func{``0,System.Object}},System.String)\">\n            <summary>\n            最大\n            </summary>\n            <typeparam name=\"T\"></typeparam>\n            <param name=\"dbType\">数据库类型</param>\n            <param name=\"expression\"></param>\n            <param name=\"tableName\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpression.Min``1(Overt.Core.Data.DatabaseType,System.Linq.Expressions.Expression{System.Func{``0,System.Object}},System.String)\">\n            <summary>\n            最小\n            </summary>\n            <typeparam name=\"T\"></typeparam>\n            <param name=\"dbType\">数据库类型</param>\n            <param name=\"expression\"></param>\n            <param name=\"tableName\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpression.Avg``1(Overt.Core.Data.DatabaseType,System.Linq.Expressions.Expression{System.Func{``0,System.Object}},System.String)\">\n            <summary>\n            平均值\n            </summary>\n            <typeparam name=\"T\"></typeparam>\n            <param name=\"dbType\">数据库类型</param>\n            <param name=\"expression\"></param>\n            <param name=\"tableName\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpression.Sum``1(Overt.Core.Data.DatabaseType,System.Linq.Expressions.Expression{System.Func{``0,System.Object}},System.String)\">\n            <summary>\n            求和\n            </summary>\n            <typeparam name=\"T\"></typeparam>\n            <param name=\"dbType\">数据库类型</param>\n            <param name=\"expression\"></param>\n            <param name=\"tableName\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:Overt.Core.Data.Expressions.SqlExpressionCompiler\">\n            <summary>\n            参数编译器 \n            base ServiceStack\n            </summary>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpressionCompiler.Compile``2(System.Linq.Expressions.Expression{System.Func{``0,``1}})\">\n            <summary>\n            编译\n            </summary>\n            <typeparam name=\"TModel\"></typeparam>\n            <typeparam name=\"TValue\"></typeparam>\n            <param name=\"lambdaExpression\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpressionCompiler.Evaluate(System.Linq.Expressions.Expression)\">\n            <summary>\n            编译\n            </summary>\n            <param name=\"arg\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:Overt.Core.Data.Expressions.SqlExpressionCore`1\">\n            <summary>\n            Expression核心\n            </summary>\n            <typeparam name=\"T\"></typeparam>\n        </member>\n        <member name=\"P:Overt.Core.Data.Expressions.SqlExpressionCore`1.Script\">\n            <summary>\n            脚本\n            </summary>\n        </member>\n        <member name=\"P:Overt.Core.Data.Expressions.SqlExpressionCore`1.DbParams\">\n            <summary>\n            参数\n            </summary>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpressionCore`1.#ctor(Overt.Core.Data.DatabaseType,System.String)\">\n            <summary>\n            构造函数\n            </summary>\n            <param name=\"dbType\"></param>\n            <param name=\"tableName\"></param>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpressionCore`1.Clear\">\n            <summary>\n            清除\n            </summary>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpressionCore`1.Insert(System.Boolean)\">\n            <summary>\n            新增\n            </summary>\n            <param name=\"returnLastIdentity\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpressionCore`1.Select(System.Linq.Expressions.Expression{System.Func{`0,System.Object}},System.String)\">\n            <summary>\n            查询\n            </summary>\n            <param name=\"expression\"></param>\n            <param name=\"orderBy\">排序字段</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpressionCore`1.Where(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})\">\n            <summary>\n            Where条件\n            </summary>\n            <param name=\"expression\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpressionCore`1.OrderBy(System.String)\">\n            <summary>\n            OrderBy\n            </summary>\n            <param name=\"orderBy\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpressionCore`1.TopOne\">\n            <summary>\n            Top1\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpressionCore`1.Limit(System.Int32,System.Int32)\">\n            <summary>\n            Limit\n            </summary>\n            <param name=\"page\"></param>\n            <param name=\"rows\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpressionCore`1.Offset(System.Int32,System.Int32)\">\n            <summary>\n            Offset\n            </summary>\n            <param name=\"offset\"></param>\n            <param name=\"size\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpressionCore`1.Max(System.Linq.Expressions.Expression{System.Func{`0,System.Object}})\">\n            <summary>\n            最大\n            </summary>\n            <param name=\"expression\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpressionCore`1.Min(System.Linq.Expressions.Expression{System.Func{`0,System.Object}})\">\n            <summary>\n            最小值\n            </summary>\n            <param name=\"expression\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpressionCore`1.Avg(System.Linq.Expressions.Expression{System.Func{`0,System.Object}})\">\n            <summary>\n            平均值\n            </summary>\n            <param name=\"expression\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpressionCore`1.Count(System.Linq.Expressions.Expression{System.Func{`0,System.Object}})\">\n            <summary>\n            行数\n            </summary>\n            <param name=\"expression\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpressionCore`1.Sum(System.Linq.Expressions.Expression{System.Func{`0,System.Object}})\">\n            <summary>\n            总计\n            </summary>\n            <param name=\"expression\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpressionCore`1.Delete\">\n            <summary>\n            删除\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpressionCore`1.Update(System.Linq.Expressions.Expression{System.Func{System.Object}})\">\n            <summary>\n            修改\n            </summary>\n            <param name=\"expression\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlExpressionCore`1.Update(System.Collections.Generic.IEnumerable{System.String})\">\n            <summary>\n            修改\n            </summary>\n            <param name=\"fields\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:Overt.Core.Data.Expressions.SqlExpressionFingerprint\">\n            <summary>\n            base ServiceStack\n            </summary>\n        </member>\n        <member name=\"T:Overt.Core.Data.Expressions.SqlGenerate\">\n            <summary>\n            SqlGenrate\n            </summary>\n        </member>\n        <member name=\"P:Overt.Core.Data.Expressions.SqlGenerate.SelectFields\">\n            <summary>\n            字段\n            </summary>\n        </member>\n        <member name=\"P:Overt.Core.Data.Expressions.SqlGenerate.TableName\">\n            <summary>\n            表名\n            </summary>\n        </member>\n        <member name=\"P:Overt.Core.Data.Expressions.SqlGenerate.SelectFieldsStr\">\n            <summary>\n            字段字符串\n            </summary>\n        </member>\n        <member name=\"P:Overt.Core.Data.Expressions.SqlGenerate.Length\">\n            <summary>\n            sql长度\n            </summary>\n        </member>\n        <member name=\"P:Overt.Core.Data.Expressions.SqlGenerate.Sql\">\n            <summary>\n            脚本\n            </summary>\n        </member>\n        <member name=\"P:Overt.Core.Data.Expressions.SqlGenerate.DatabaseType\">\n            <summary>\n            数据库类型\n            </summary>\n        </member>\n        <member name=\"P:Overt.Core.Data.Expressions.SqlGenerate.DbParams\">\n            <summary>\n            数据库参数\n            </summary>\n        </member>\n        <member name=\"P:Overt.Core.Data.Expressions.SqlGenerate.Item(System.Int32)\">\n            <summary>\n            索引数据\n            </summary>\n            <param name=\"index\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlGenerate.#ctor\">\n            <summary>\n            构造函数\n            </summary>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlGenerate.op_Addition(Overt.Core.Data.Expressions.SqlGenerate,System.String)\">\n            <summary>\n            \n            </summary>\n            <param name=\"sqlGenerate\"></param>\n            <param name=\"sql\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlGenerate.Clear\">\n            <summary>\n            清除\n            </summary>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlGenerate.RelaceLast(System.String,System.String)\">\n            <summary>\n            替换最后一次出现字符\n            </summary>\n            <param name=\"oldStr\"></param>\n            <param name=\"newStr\"></param>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlGenerate.AddDbParameter(System.Object)\">\n            <summary>\n            添加参数\n            </summary>\n            <param name=\"parameterValue\"></param>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlGenerate.CombineInParameters(System.Collections.Generic.List{System.Object})\">\n            <summary>\n            拼接in参数\n            </summary>\n            <param name=\"parameterValues\"></param>\n        </member>\n        <member name=\"M:Overt.Core.Data.Expressions.SqlGenerate.ToString\">\n            <summary>\n            ToString\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"T:Overt.Core.Data.DapperExtensions\">\n            <summary>\n            Dapper扩展\n            </summary>\n            <summary>\n            Dapper扩展\n            </summary>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.IsExistTableAsync(System.Data.IDbConnection,System.String,System.Action{System.String})\">\n            <summary>\n            是否存在表\n            </summary>\n            <param name=\"connection\"></param>\n            <param name=\"tableName\"></param>\n            <param name=\"outSqlAction\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.IsExistFieldAsync(System.Data.IDbConnection,System.String,System.String,System.Action{System.String})\">\n            <summary>\n            是否存在字段\n            </summary>\n            <param name=\"connection\"></param>\n            <param name=\"tableName\"></param>\n            <param name=\"fieldName\"></param>\n            <param name=\"outSqlAction\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.InsertAsync``1(System.Data.IDbConnection,System.String,``0,System.Boolean,System.Action{System.String})\">\n            <summary>\n            插入数据\n            </summary>\n            <typeparam name=\"TEntity\"></typeparam>\n            <param name=\"connection\"></param>\n            <param name=\"tableName\"></param>\n            <param name=\"entity\"></param>\n            <param name=\"returnLastIdentity\">是否返回自增的数据</param>\n            <param name=\"outSqlAction\">返回sql语句</param>\n            <returns>-1 参数为空</returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.InsertAsync``1(System.Data.IDbConnection,System.String,System.Collections.Generic.IEnumerable{``0},System.Action{System.String})\">\n            <summary>\n            批量插入数据\n            </summary>\n            <typeparam name=\"TEntity\"></typeparam>\n            <param name=\"connection\"></param>\n            <param name=\"tableName\"></param>\n            <param name=\"entities\"></param>\n            <param name=\"outSqlAction\">返回sql语句</param>\n            <returns>-1 参数为空</returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.DeleteAsync``1(System.Data.IDbConnection,System.String,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Action{System.String})\">\n            <summary>\n            删除数据\n            </summary>\n            <typeparam name=\"TEntity\"></typeparam>\n            <param name=\"connection\"></param>\n            <param name=\"tableName\"></param>\n            <param name=\"whereExpress\"></param>\n            <param name=\"outSqlAction\">返回sql语句</param>\n            <returns>-1 参数为空</returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.SetAsync``1(System.Data.IDbConnection,System.String,``0,System.Collections.Generic.IEnumerable{System.String},System.Action{System.String})\">\n            <summary>\n            对象修改\n            </summary>\n            <typeparam name=\"TEntity\"></typeparam>\n            <param name=\"connection\"></param>\n            <param name=\"tableName\"></param>\n            <param name=\"entity\"></param>\n            <param name=\"fields\">选择字段</param>\n            <param name=\"outSqlAction\">返回sql语句</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.SetAsync``1(System.Data.IDbConnection,System.String,System.Linq.Expressions.Expression{System.Func{System.Object}},System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Action{System.String})\">\n            <summary>\n            条件修改\n            </summary>\n            <typeparam name=\"TEntity\"></typeparam>\n            <param name=\"connection\">连接</param>\n            <param name=\"tableName\">表名</param>\n            <param name=\"setExpress\">修改内容表达式</param>\n            <param name=\"whereExpress\">条件表达式</param>\n            <param name=\"outSqlAction\">返回sql语句</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.IncrAsync``2(System.Data.IDbConnection,System.String,System.String,``1,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Action{System.String})\">\n            <summary>\n            条件修改 在字段上增减\n            </summary>\n            <typeparam name=\"TEntity\"></typeparam>\n            <typeparam name=\"TValue\"></typeparam>\n            <param name=\"connection\">连接</param>\n            <param name=\"tableName\">表名</param>\n            <param name=\"field\">增减的字段</param>\n            <param name=\"value\">增减的值</param>\n            <param name=\"whereExpress\">条件表达式</param>\n            <param name=\"outSqlAction\">返回sql语句</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.GetAsync``1(System.Data.IDbConnection,System.String,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Linq.Expressions.Expression{System.Func{``0,System.Object}},System.Action{System.String})\">\n            <summary>\n            获取单条数据\n            </summary>\n            <typeparam name=\"TEntity\"></typeparam>\n            <param name=\"connection\"></param>\n            <param name=\"tableName\">表名</param>\n            <param name=\"whereExpress\">条件表达式</param>\n            <param name=\"fieldExpress\">选择字段，默认为*</param>\n            <param name=\"outSqlAction\">返回sql语句</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.GetListAsync``1(System.Data.IDbConnection,System.String,System.Int32,System.Int32,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Linq.Expressions.Expression{System.Func{``0,System.Object}},System.Collections.Generic.List{Overt.Core.Data.OrderByField},System.Action{System.String})\">\n            <summary>\n            获取分页数据\n            </summary>\n            <typeparam name=\"TEntity\"></typeparam>\n            <param name=\"connection\"></param>\n            <param name=\"tableName\"></param>\n            <param name=\"page\"></param>\n            <param name=\"rows\"></param>\n            <param name=\"whereExpress\">条件表达式</param>\n            <param name=\"fieldExpress\">选择字段，默认为*</param>\n            <param name=\"orderByFields\">排序字段集合</param>\n            <param name=\"outSqlAction\">返回sql语句</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.GetOffsetsAsync``1(System.Data.IDbConnection,System.String,System.Int32,System.Int32,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Linq.Expressions.Expression{System.Func{``0,System.Object}},System.Collections.Generic.List{Overt.Core.Data.OrderByField},System.Action{System.String})\">\n            <summary>\n            获取分页数据 Offset\n            </summary>\n            <typeparam name=\"TEntity\"></typeparam>\n            <param name=\"connection\"></param>\n            <param name=\"tableName\"></param>\n            <param name=\"offset\"></param>\n            <param name=\"size\"></param>\n            <param name=\"whereExpress\">条件表达式</param>\n            <param name=\"fieldExpress\">选择字段，默认为*</param>\n            <param name=\"orderByFields\">排序字段集合</param>\n            <param name=\"outSqlAction\">返回sql语句</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.CountAsync``1(System.Data.IDbConnection,System.String,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Action{System.String})\">\n            <summary>\n            获取数量\n            </summary>\n            <typeparam name=\"TEntity\"></typeparam>\n            <param name=\"connection\"></param>\n            <param name=\"tableName\"></param>\n            <param name=\"whereExpress\">条件表达式</param>\n            <param name=\"outSqlAction\">返回sql语句</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.GetMainTableName(System.Type)\">\n            <summary>\n            获取主表名称\n            </summary>\n            <param name=\"entity\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.GetTableName``1(System.String,System.Func{System.String})\">\n            <summary>\n            获取表名\n            </summary>\n            <param name=\"val\"></param>\n            <param name=\"tableNameFunc\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.GetTableName``1(``0,System.Func{System.String})\">\n            <summary>\n            获取表名\n            </summary>\n            <param name=\"entity\">实体实例</param>\n            <param name=\"tableNameFunc\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.GetTableName``1(System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Func{System.String})\">\n            <summary>\n            获取表名\n            </summary>\n            <param name=\"expression\">表达式数据</param>\n            <param name=\"tableNameFunc\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.GetIdentityField(System.Type)\">\n            <summary>\n            获取自增字段\n            </summary>\n            <param name=\"type\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.GetCustomFields(System.Type)\">\n            <summary>\n            获取自定义类型的字段列表\n            </summary>\n            <param name=\"type\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.IsExistTable(System.Data.IDbConnection,System.String,System.Action{System.String})\">\n            <summary>\n            是否存在表\n            </summary>\n            <param name=\"connection\"></param>\n            <param name=\"tableName\"></param>\n            <param name=\"outSqlAction\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.IsExistField(System.Data.IDbConnection,System.String,System.String,System.Action{System.String})\">\n            <summary>\n            是否存在字段\n            </summary>\n            <param name=\"connection\"></param>\n            <param name=\"tableName\"></param>\n            <param name=\"fieldName\"></param>\n            <param name=\"outSqlAction\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.Insert``1(System.Data.IDbConnection,System.String,``0,System.Boolean,System.Action{System.String})\">\n            <summary>\n            插入数据\n            </summary>\n            <typeparam name=\"TEntity\"></typeparam>\n            <param name=\"connection\"></param>\n            <param name=\"tableName\"></param>\n            <param name=\"entity\"></param>\n            <param name=\"returnLastIdentity\">是否返回自增的数据</param>\n            <param name=\"outSqlAction\">返回sql语句</param>\n            <returns>-1 参数为空</returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.Insert``1(System.Data.IDbConnection,System.String,System.Collections.Generic.IEnumerable{``0},System.Action{System.String})\">\n            <summary>\n            批量插入数据\n            </summary>\n            <typeparam name=\"TEntity\"></typeparam>\n            <param name=\"connection\"></param>\n            <param name=\"tableName\"></param>\n            <param name=\"entities\"></param>\n            <param name=\"outSqlAction\">返回sql语句</param>\n            <returns>执行条数</returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.Delete``1(System.Data.IDbConnection,System.String,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Action{System.String})\">\n            <summary>\n            删除数据\n            </summary>\n            <typeparam name=\"TEntity\"></typeparam>\n            <param name=\"connection\"></param>\n            <param name=\"tableName\"></param>\n            <param name=\"whereExpress\"></param>\n            <param name=\"outSqlAction\">返回sql语句</param>\n            <returns>-1 参数为空</returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.Set``1(System.Data.IDbConnection,System.String,``0,System.Collections.Generic.IEnumerable{System.String},System.Action{System.String})\">\n            <summary>\n            对象修改\n            </summary>\n            <typeparam name=\"TEntity\"></typeparam>\n            <param name=\"connection\"></param>\n            <param name=\"tableName\"></param>\n            <param name=\"entity\"></param>\n            <param name=\"fields\">选择字段</param>\n            <param name=\"outSqlAction\">返回sql语句</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.Set``1(System.Data.IDbConnection,System.String,System.Linq.Expressions.Expression{System.Func{System.Object}},System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Action{System.String})\">\n            <summary>\n            条件修改\n            </summary>\n            <typeparam name=\"TEntity\"></typeparam>\n            <param name=\"connection\">连接</param>\n            <param name=\"tableName\">表名</param>\n            <param name=\"setExpress\">修改内容表达式</param>\n            <param name=\"whereExpress\">条件表达式</param>\n            <param name=\"outSqlAction\">返回sql语句</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.Incr``2(System.Data.IDbConnection,System.String,System.String,``1,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Action{System.String})\">\n            <summary>\n            条件修改 在字段上增减\n            </summary>\n            <typeparam name=\"TEntity\"></typeparam>\n            <typeparam name=\"TValue\"></typeparam>\n            <param name=\"connection\">连接</param>\n            <param name=\"tableName\">表名</param>\n            <param name=\"field\">增减的字段</param>\n            <param name=\"value\">增减的值</param>\n            <param name=\"whereExpress\">条件表达式</param>\n            <param name=\"outSqlAction\">返回sql语句</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.Get``1(System.Data.IDbConnection,System.String,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Linq.Expressions.Expression{System.Func{``0,System.Object}},System.Action{System.String})\">\n            <summary>\n            获取单条数据\n            </summary>\n            <typeparam name=\"TEntity\"></typeparam>\n            <param name=\"connection\"></param>\n            <param name=\"tableName\">表名</param>\n            <param name=\"whereExpress\">条件表达式</param>\n            <param name=\"fieldExpress\">选择字段，默认为*</param>\n            <param name=\"outSqlAction\">返回sql语句</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.GetList``1(System.Data.IDbConnection,System.String,System.Int32,System.Int32,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Linq.Expressions.Expression{System.Func{``0,System.Object}},System.Collections.Generic.List{Overt.Core.Data.OrderByField},System.Action{System.String})\">\n            <summary>\n            获取分页数据\n            </summary>\n            <typeparam name=\"TEntity\"></typeparam>\n            <param name=\"connection\"></param>\n            <param name=\"tableName\"></param>\n            <param name=\"page\"></param>\n            <param name=\"rows\"></param>\n            <param name=\"whereExpress\">条件表达式</param>\n            <param name=\"fieldExpress\">选择字段，默认为*</param>\n            <param name=\"orderByFields\">排序字段集合</param>\n            <param name=\"outSqlAction\">返回sql语句</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.GetOffsets``1(System.Data.IDbConnection,System.String,System.Int32,System.Int32,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Linq.Expressions.Expression{System.Func{``0,System.Object}},System.Collections.Generic.List{Overt.Core.Data.OrderByField},System.Action{System.String})\">\n            <summary>\n            获取分页数据 Offset\n            </summary>\n            <typeparam name=\"TEntity\"></typeparam>\n            <param name=\"connection\"></param>\n            <param name=\"tableName\"></param>\n            <param name=\"offset\"></param>\n            <param name=\"size\"></param>\n            <param name=\"whereExpress\">条件表达式</param>\n            <param name=\"fieldExpress\">选择字段，默认为*</param>\n            <param name=\"orderByFields\">排序字段集合</param>\n            <param name=\"outSqlAction\">返回sql语句</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.Count``1(System.Data.IDbConnection,System.String,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Action{System.String})\">\n            <summary>\n            获取数量\n            </summary>\n            <typeparam name=\"TEntity\"></typeparam>\n            <param name=\"connection\"></param>\n            <param name=\"tableName\"></param>\n            <param name=\"whereExpress\">条件表达式</param>\n            <param name=\"outSqlAction\">返回sql语句</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.GetDbType(System.Data.IDbConnection)\">\n            <summary>\n            获取db类型\n            </summary>\n            <param name=\"connection\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.GetValueFromExpression``1(System.Reflection.PropertyInfo,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}})\">\n            <summary>\n            获取值\n            </summary>\n            <typeparam name=\"TEntity\"></typeparam>\n            <param name=\"propertyInfo\"></param>\n            <param name=\"expression\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.GetBit(System.Reflection.PropertyInfo)\">\n            <summary>\n            获取位数\n            </summary>\n            <param name=\"propertyInfo\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.GetSuffix(System.String,System.Int32)\">\n            <summary>\n            获取后缀\n            </summary>\n            <param name=\"val\"></param>\n            <param name=\"bit\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.GetSuffix(System.Reflection.PropertyInfo,System.String)\">\n            <summary>\n            获取分表名 base md5\n            </summary>\n            <param name=\"propertyInfo\"></param>\n            <param name=\"val\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.GetSuffix``1(System.Reflection.PropertyInfo,``0)\">\n            <summary>\n            获取分表名 base md5\n            </summary>\n            <typeparam name=\"TEntity\"></typeparam>\n            <param name=\"propertyInfo\"></param>\n            <param name=\"entity\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.DapperExtensions.GetSuffix``1(System.Reflection.PropertyInfo,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}})\">\n            <summary>\n            获取分表名 base md5\n            </summary>\n            <typeparam name=\"TEntity\"></typeparam>\n            <param name=\"propertyInfo\"></param>\n            <param name=\"expression\">表达式数据</param>\n            <returns></returns>\n        </member>\n        <member name=\"T:Overt.Core.Data.EntityDefinitionExtensions\">\n            <summary>\n            字段定义说明\n            </summary>\n        </member>\n        <member name=\"M:Overt.Core.Data.EntityDefinitionExtensions.GetAttribute``1(System.Type)\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"TAttribute\">属性</typeparam>\n            <param name=\"entity\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.EntityDefinitionExtensions.GetAttribute``1(System.Reflection.PropertyInfo)\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"TAttribute\">属性</typeparam>\n            <param name=\"property\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.EntityDefinitionExtensions.GetProperty``1(System.Type)\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"TAttribute\"></typeparam>\n            <param name=\"entity\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.EntityDefinitionExtensions.GetProperties``1(System.Type)\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"TAttribute\"></typeparam>\n            <param name=\"entity\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.EntityDefinitionExtensions.GetPropertyByAttribute``1(System.Type)\">\n            <summary>\n            \n            </summary>\n            <typeparam name=\"TAttribute\">属性</typeparam>\n            <param name=\"entity\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:Overt.Core.Data.ExpressionExtensions\">\n            <summary>\n            expression 扩展\n            </summary>\n        </member>\n        <member name=\"M:Overt.Core.Data.ExpressionExtensions.And``1(System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}})\">\n            <summary>\n            and\n            </summary>\n            <typeparam name=\"T\"></typeparam>\n            <param name=\"expr1\"></param>\n            <param name=\"expr2\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.ExpressionExtensions.Or``1(System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}})\">\n            <summary>\n            or\n            </summary>\n            <typeparam name=\"T\"></typeparam>\n            <param name=\"expr1\"></param>\n            <param name=\"expr2\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:Overt.Core.Data.SqlAliasExtensions\">\n            <summary>\n            Sql别名\n            </summary>\n        </member>\n        <member name=\"M:Overt.Core.Data.SqlAliasExtensions.ParamPrefix(Overt.Core.Data.DatabaseType)\">\n            <summary>\n            参数前缀\n            </summary>\n            <param name=\"dbType\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.SqlAliasExtensions.ParamSql(System.String,Overt.Core.Data.Expressions.SqlGenerate)\">\n            <summary>\n            获取添加左右标记 防止有关键字作为字段名/表名\n            </summary>\n            <param name=\"columnName\"></param>\n            <param name=\"sqlGenerate\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.SqlAliasExtensions.ParamSql(System.String,System.Nullable{Overt.Core.Data.DatabaseType})\">\n            <summary>\n            获取添加左右标记 防止有关键字作为字段名/表名\n            </summary>\n            <param name=\"columnName\"></param>\n            <param name=\"dbType\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.SqlAliasExtensions.ParamValue(System.String,System.Nullable{Overt.Core.Data.DatabaseType},System.Collections.Generic.List{System.Reflection.PropertyInfo})\">\n            <summary>\n            获取添加字段\n            </summary>\n            <param name=\"columnName\"></param>\n            <param name=\"dbType\"></param>\n            <param name=\"customFields\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.SqlAliasExtensions.SelectLastIdentity(Overt.Core.Data.DatabaseType)\">\n            <summary>\n            获取最后一次Insert\n            </summary>\n            <param name=\"dbType\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.SqlAliasExtensions.ExistTableSql(Overt.Core.Data.DatabaseType,System.String,System.String)\">\n            <summary>\n            是否存在表\n            </summary>\n            <param name=\"dbType\"></param>\n            <param name=\"dbName\"></param>\n            <param name=\"tableName\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.SqlAliasExtensions.ExistFieldSql(Overt.Core.Data.DatabaseType,System.String,System.String,System.String)\">\n            <summary>\n            是否存在字段\n            </summary>\n            <param name=\"dbType\"></param>\n            <param name=\"dbName\"></param>\n            <param name=\"tableName\"></param>\n            <param name=\"fieldName\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:Overt.Core.Data.TableExtensions\">\n            <summary>\n            表管理\n            </summary>\n        </member>\n        <member name=\"M:Overt.Core.Data.TableExtensions.CheckTableIfMissingCreate``1(Overt.Core.Data.IBaseRepository{``0},System.Boolean)\">\n            <summary>\n            检查表是否存在\n            </summary>\n            <typeparam name=\"T\"></typeparam>\n            <param name=\"repository\"></param>\n            <param name=\"isMaster\"></param>\n            <returns>false, 直接返回默认数据即可</returns>\n        </member>\n        <member name=\"T:Overt.Core.Data.OrderByField\">\n            <summary>\n            排序字段对象\n            </summary>\n        </member>\n        <member name=\"P:Overt.Core.Data.OrderByField.Field\">\n            <summary>\n            字段 使用nameof(Class.Property)\n            </summary>\n        </member>\n        <member name=\"P:Overt.Core.Data.OrderByField.OrderBy\">\n            <summary>\n            排序类型\n            </summary>\n        </member>\n        <member name=\"M:Overt.Core.Data.OrderByField.#ctor(System.String,Overt.Core.Data.FieldSortType)\">\n            <summary>\n            构造函数\n            </summary>\n            <param name=\"field\"></param>\n            <param name=\"orderBy\"></param>\n        </member>\n        <member name=\"M:Overt.Core.Data.OrderByField.Create(System.String,Overt.Core.Data.FieldSortType)\">\n            <summary>\n            静态构造对象\n            </summary>\n            <param name=\"field\"></param>\n            <param name=\"orderBy\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:Overt.Core.Data.OrderByFieldExtension\">\n            <summary>\n            扩展类\n            </summary>\n        </member>\n        <member name=\"M:Overt.Core.Data.OrderByFieldExtension.OrderBy(System.String)\">\n            <summary>\n            顺序构造对象扩展方法\n            </summary>\n            <param name=\"field\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.OrderByFieldExtension.OrderByDesc(System.String)\">\n            <summary>\n            倒序构造对象扩展方法\n            </summary>\n            <param name=\"field\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"T:Overt.Core.Data.BaseRepository`1\">\n            <summary>\n            实现IBaseRepository\n            </summary>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.#ctor(System.String)\">\n            <summary>\n            构造函数 \n            </summary>\n            <param name=\"dbStoreKey\">数据库前缀</param>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.GetMainTableName\">\n            <summary>\n            获取主表名\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.GetTableName\">\n            <summary>\n            获取表名，调用TableNameFunc则是调用主库查询\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.GetTableName(System.String)\">\n            <summary>\n            获取表名，以Submeter分表标识值取模\n            </summary>\n            <param name=\"key\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.IsExistTable(System.String,System.Boolean)\">\n            <summary>\n            是否存在表\n            </summary>\n            <param name=\"tableName\"></param>\n            <param name=\"isMaster\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.IsExistField(System.String,System.String,System.Boolean)\">\n            <summary>\n            是否存在字段\n            </summary>\n            <param name=\"tableName\"></param>\n            <param name=\"fieldName\"></param>\n            <param name=\"isMaster\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.Add(`0,System.Boolean)\">\n            <summary>\n            添加\n            </summary>\n            <param name=\"entity\">数据实体</param>\n            <param name=\"returnLastIdentity\">是否赋值最后一次的自增ID</param>\n            <returns>添加后的数据实体</returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.Add(`0[])\">\n            <summary>\n            添加\n            </summary>\n            <param name=\"entities\">数据实体</param>\n            <returns>添加后的数据实体</returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.Delete(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})\">\n            <summary>\n            删除\n            </summary>\n            <param name=\"expression\">删除条件</param>\n            <returns>是否成功</returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.Set(`0,System.Linq.Expressions.Expression{System.Func{`0,System.Object}})\">\n            <summary>\n            更新\n            </summary>\n            <param name=\"entity\">数据实体</param>\n            <param name=\"fields\">x=> x.SomeProperty1 or x=> new { x.SomeProperty1, x.SomeProperty2 }</param>\n            <returns>是否成功</returns>\n        </member>\n        <!-- 对于成员“M:Overt.Core.Data.BaseRepository`1.Set(System.Linq.Expressions.Expression{System.Func{System.Object}},System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})”忽略有格式错误的 XML 注释 -->\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.Incr``1(System.String,``0,System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})\">\n            <summary>\n            根据条件 在原字段上增减数据\n            </summary>\n            <typeparam name=\"TValue\"></typeparam>\n            <param name=\"field\">增减的字段</param>\n            <param name=\"value\">增减的值</param>\n            <param name=\"whereExpress\">条件表达式</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.Get(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}},System.Linq.Expressions.Expression{System.Func{`0,System.Object}},System.Boolean)\">\n            <summary>\n            查找数据\n            </summary>\n            <param name=\"expression\">查询条件</param>\n            <param name=\"fieldExpressison\">按字段返回</param>\n            <param name=\"isMaster\">是否主从</param>\n            <returns>实体</returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.GetList(System.Int32,System.Int32,System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}},System.Linq.Expressions.Expression{System.Func{`0,System.Object}},System.Boolean,Overt.Core.Data.OrderByField[])\">\n            <summary>\n            获取列表\n            </summary>\n            <param name=\"page\"></param>\n            <param name=\"rows\"></param>\n            <param name=\"expression\">条件表达式</param>\n            <param name=\"fieldExpressison\">按字段返回</param>\n            <param name=\"isMaster\">是否主从</param>\n            <param name=\"orderByFields\">排序字段集合</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.GetOffsets(System.Int32,System.Int32,System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}},System.Linq.Expressions.Expression{System.Func{`0,System.Object}},System.Boolean,Overt.Core.Data.OrderByField[])\">\n            <summary>\n            获取列表 Offset\n            </summary>\n            <param name=\"offset\"></param>\n            <param name=\"size\"></param>\n            <param name=\"expression\">条件表达式</param>\n            <param name=\"fieldExpressison\">按字段返回</param>\n            <param name=\"isMaster\">是否主从</param>\n            <param name=\"orderByFields\">排序字段集合</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.Count(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}},System.Boolean)\">\n            <summary>\n            获取数量\n            </summary>\n            <param name=\"expression\">条件表达式</param>\n            <param name=\"isMaster\">是否主从</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.IsExistTableAsync(System.String,System.Boolean)\">\n            <summary>\n            是否存在表\n            </summary>\n            <param name=\"tableName\"></param>\n            <param name=\"isMaster\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.IsExistFieldAsync(System.String,System.String,System.Boolean)\">\n            <summary>\n            是否存在字段\n            </summary>\n            <param name=\"tableName\"></param>\n            <param name=\"fieldName\"></param>\n            <param name=\"isMaster\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.AddAsync(`0,System.Boolean)\">\n            <summary>\n            异步添加\n            </summary>\n            <param name=\"entity\"></param>\n            <param name=\"returnLastIdentity\">是否赋值最后一次的自增ID</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.AddAsync(`0[])\">\n            <summary>\n            异步批量添加\n            </summary>\n            <param name=\"entities\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.DeleteAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})\">\n            <summary>\n            异步删除\n            </summary>\n            <param name=\"expression\">删除条件</param>\n            <returns>是否成功</returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.SetAsync(`0,System.Linq.Expressions.Expression{System.Func{`0,System.Object}})\">\n            <summary>\n            异步更新\n            </summary>\n            <param name=\"entity\">数据实体</param>\n            <param name=\"fields\">x=> x.SomeProperty1 or x=> new { x.SomeProperty1, x.SomeProperty2 }</param>\n            <returns>是否成功</returns>\n        </member>\n        <!-- 对于成员“M:Overt.Core.Data.BaseRepository`1.SetAsync(System.Linq.Expressions.Expression{System.Func{System.Object}},System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})”忽略有格式错误的 XML 注释 -->\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.IncrAsync``1(System.String,``0,System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})\">\n            <summary>\n            根据条件 在原字段上增减数据\n            </summary>\n            <param name=\"field\">增减的字段，底层未验证改字段是否存在，由数据库异常抛出</param>\n            <param name=\"value\">增减的值</param>\n            <param name=\"whereExpress\">条件表达式</param>\n            <returns>是否成功</returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.GetAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}},System.Linq.Expressions.Expression{System.Func{`0,System.Object}},System.Boolean)\">\n            <summary>\n            异步获取一条数据\n            </summary>\n            <param name=\"expression\">查询条件</param>\n            <param name=\"fieldExpressison\">按字段返回</param>\n            <param name=\"isMaster\">是否主从</param>\n            <returns>实体</returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.GetListAsync(System.Int32,System.Int32,System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}},System.Linq.Expressions.Expression{System.Func{`0,System.Object}},System.Boolean,Overt.Core.Data.OrderByField[])\">\n            <summary>\n            异步获取列表\n            </summary>\n            <param name=\"page\"></param>\n            <param name=\"rows\"></param>\n            <param name=\"expression\">条件表达式</param>\n            <param name=\"fieldExpressison\">按字段返回</param>\n            <param name=\"isMaster\">是否主从</param>\n            <param name=\"orderByFields\">排序字段集合</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.GetOffsetsAsync(System.Int32,System.Int32,System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}},System.Linq.Expressions.Expression{System.Func{`0,System.Object}},System.Boolean,Overt.Core.Data.OrderByField[])\">\n            <summary>\n            异步获取列表 Offset\n            </summary>\n            <param name=\"offset\"></param>\n            <param name=\"size\"></param>\n            <param name=\"expression\">条件表达式</param>\n            <param name=\"fieldExpressison\">按字段返回</param>\n            <param name=\"isMaster\">是否主从</param>\n            <param name=\"orderByFields\">排序字段集合</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.CountAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}},System.Boolean)\">\n            <summary>\n            异步获取数量\n            </summary>\n            <param name=\"expression\">条件表达式</param>\n            <param name=\"isMaster\">是否主从</param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.Execute``1(System.Func{System.Data.IDbConnection,``0},System.Boolean)\">\n            <summary>\n            包含connection的方法执行\n            </summary>\n            <typeparam name=\"T\"></typeparam>\n            <param name=\"func\"></param>\n            <param name=\"isMaster\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.Execute``1(System.Func{System.Data.IDbConnection,System.Threading.Tasks.Task{``0}},System.Boolean)\">\n            <summary>\n            包含connection的方法执行\n            </summary>\n            <typeparam name=\"T\"></typeparam>\n            <param name=\"func\"></param>\n            <param name=\"isMaster\"></param>\n            <returns></returns>\n        </member>\n        <member name=\"M:Overt.Core.Data.BaseRepository`1.OutSqlAction(System.String)\">\n            <summary>\n            填充ExecuteScript\n            </summary>\n            <param name=\"sql\"></param>\n        </member>\n        <member name=\"T:Overt.Core.Data.PropertyAssist\">\n            <summary>\n            DbRespository 抽象类\n            </summary>\n        </member>\n        <member name=\"M:Overt.Core.Data.PropertyAssist.#ctor(System.String)\">\n            <summary>\n            实例化\n            </summary>\n            <param name=\"dbStoreKey\">数据库前缀</param>\n        </member>\n        <member name=\"P:Overt.Core.Data.PropertyAssist.DbStoreKey\">\n            <summary>\n            数据库名key\n            </summary>\n        </member>\n        <member name=\"M:Overt.Core.Data.PropertyAssist.OpenConnection(System.Boolean)\">\n            <summary>\n            打开连接 已赋值 connection 属性\n            </summary>\n            <returns></returns>\n        </member>\n        <member name=\"P:Overt.Core.Data.PropertyAssist.ConnectionFunc\">\n            <summary>\n            数据库连接方法\n            </summary>\n        </member>\n        <member name=\"P:Overt.Core.Data.PropertyAssist.TableNameFunc\">\n            <summary>\n            表名方法\n            </summary>\n        </member>\n        <member name=\"P:Overt.Core.Data.PropertyAssist.CreateScriptFunc\">\n            <summary>\n            创建表的脚本\n            </summary>\n        </member>\n        <member name=\"P:Overt.Core.Data.PropertyAssist.ExecuteScript\">\n            <summary>\n            执行的sql脚本\n            </summary>\n        </member>\n    </members>\n</doc>\n"
  },
  {
    "path": "src/Overt.Core.Data/Params/OrderByField.cs",
    "content": "﻿namespace Overt.Core.Data\n{\n    /// <summary>\n    /// 排序字段对象\n    /// </summary>\n    public class OrderByField\n    {\n        /// <summary>\n        /// 字段 使用nameof(Class.Property)\n        /// </summary>\n        public string Field { get; set; }\n        /// <summary>\n        /// 排序类型\n        /// </summary>\n        public FieldSortType OrderBy { get; set; }\n        /// <summary>\n        /// 构造函数\n        /// </summary>\n        /// <param name=\"field\"></param>\n        /// <param name=\"orderBy\"></param>\n        public OrderByField(string field, FieldSortType orderBy = FieldSortType.Asc)\n        {\n            Field = field;\n            OrderBy = orderBy;\n        }\n\n        /// <summary>\n        /// 静态构造对象\n        /// </summary>\n        /// <param name=\"field\"></param>\n        /// <param name=\"orderBy\"></param>\n        /// <returns></returns>\n        public static OrderByField Create(string field, FieldSortType orderBy = FieldSortType.Asc)\n        {\n            return new OrderByField(field, orderBy);\n        }\n    }\n\n    /// <summary>\n    /// 扩展类\n    /// </summary>\n    public static class OrderByFieldExtension\n    {\n        /// <summary>\n        /// 顺序构造对象扩展方法\n        /// </summary>\n        /// <param name=\"field\"></param>\n        /// <returns></returns>\n        public static OrderByField OrderBy(this string field)\n        {\n            return new OrderByField(field, FieldSortType.Asc);\n        }\n\n        /// <summary>\n        /// 倒序构造对象扩展方法\n        /// </summary>\n        /// <param name=\"field\"></param>\n        /// <returns></returns>\n        public static OrderByField OrderByDesc(this string field)\n        {\n            return new OrderByField(field, FieldSortType.Desc);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Repository/BaseRepository.cs",
    "content": "﻿#if ASP_NET_CORE\nusing Microsoft.Extensions.Configuration;\n#endif\nusing Overt.Core.Data.Expressions;\nusing System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.Linq;\nusing System.Linq.Expressions;\nusing System.Threading.Tasks;\n\nnamespace Overt.Core.Data\n{\n    /// <summary>\n    /// 实现IBaseRepository\n    /// </summary>\n    public abstract class BaseRepository<TEntity> : PropertyAssist, IBaseRepository<TEntity> where TEntity : class, new()\n    {\n        #region Constructor \n#if ASP_NET_CORE\n        /// <summary>\n        /// 构造函数 \n        /// </summary>\n        /// <param name=\"configuration\">配置注入</param>\n        /// <param name=\"dbStoreKey\">数据库前缀</param>\n        public BaseRepository(IConfiguration configuration, string dbStoreKey = \"\")\n            : base(configuration, dbStoreKey)\n        {\n        }\n#else\n        /// <summary>\n        /// 构造函数 \n        /// </summary>\n        /// <param name=\"dbStoreKey\">数据库前缀</param>\n        public BaseRepository(string dbStoreKey = \"\")\n            : base(dbStoreKey)\n        {\n        }\n#endif\n        #endregion\n\n        #region Sync Method\n        /// <summary>\n        /// 获取主表名\n        /// </summary>\n        /// <returns></returns>\n        public string GetMainTableName()\n        {\n            return typeof(TEntity).GetMainTableName();\n        }\n\n        /// <summary>\n        /// 获取表名，调用TableNameFunc则是调用主库查询\n        /// </summary>\n        /// <returns></returns>\n        public string GetTableName()\n        {\n            var tableName = TableNameFunc?.Invoke() ?? typeof(TEntity).GetMainTableName();\n            return tableName;\n        }\n\n        /// <summary>\n        /// 获取表名，以Submeter分表标识值取模\n        /// </summary>\n        /// <param name=\"key\"></param>\n        /// <returns></returns>\n        [Obsolete(\"请使用GetTableName()\")]\n        public string GetTableName(string key)\n        {\n            var tableName = key.GetTableName<TEntity>(TableNameFunc);\n            return tableName;\n        }\n\n        /// <summary>\n        /// 是否存在表\n        /// </summary>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"isMaster\"></param>\n        /// <returns></returns>\n        public bool IsExistTable(string tableName, bool isMaster = true)\n        {\n            if (string.IsNullOrEmpty(tableName))\n                return false;\n\n            using (var connection = OpenConnection(isMaster))\n            {\n                return connection.IsExistTable(tableName, OutSqlAction);\n            }\n        }\n\n        /// <summary>\n        /// 是否存在字段\n        /// </summary>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"isMaster\"></param>\n        /// <returns></returns>\n        public bool IsExistField(string tableName, string fieldName, bool isMaster = true)\n        {\n            if (string.IsNullOrEmpty(tableName) || string.IsNullOrEmpty(fieldName))\n                return false;\n\n            using (var conneciton = OpenConnection(isMaster))\n            {\n                return conneciton.IsExistField(tableName, fieldName, OutSqlAction);\n            }\n        }\n\n        /// <summary>\n        /// 添加\n        /// </summary>\n        /// <param name=\"entity\">数据实体</param>\n        /// <param name=\"returnLastIdentity\">是否赋值最后一次的自增ID</param>\n        /// <returns>添加后的数据实体</returns>\n        public bool Add(TEntity entity, bool returnLastIdentity = false)\n        {\n            if (entity == null)\n                return false;\n\n            return Execute((connection) =>\n            {\n                var tableName = entity.GetTableName(TableNameFunc);\n                var result = connection.Insert(tableName, entity, returnLastIdentity, OutSqlAction);\n                return result;\n            }, true);\n        }\n\n        /// <summary>\n        /// 添加\n        /// </summary>\n        /// <param name=\"entities\">数据实体</param>\n        /// <returns>添加后的数据实体</returns>\n        public bool Add(params TEntity[] entities) \n        {\n            if ((entities?.Count() ?? 0) <= 0)\n                return false;\n\n            return Execute((connection) =>\n            {\n                var tableName = entities.First().GetTableName(TableNameFunc);\n                var result = connection.Insert(tableName, entities, OutSqlAction);\n                return result > 0;\n            }, true);\n        }\n\n        /// <summary>\n        /// 删除\n        /// </summary>\n        /// <param name=\"expression\">删除条件</param>\n        /// <returns>是否成功</returns>\n        public bool Delete(Expression<Func<TEntity, bool>> expression)\n        {\n            return Execute((connection) =>\n            {\n                var tableName = expression.GetTableName(TableNameFunc);\n                var task = connection.Delete(tableName, expression, OutSqlAction);\n                return task > 0;\n            }, true);\n        }\n\n        /// <summary>\n        /// 更新\n        /// </summary>\n        /// <param name=\"entity\">数据实体</param>\n        /// <param name=\"fields\">x=> x.SomeProperty1 or x=> new { x.SomeProperty1, x.SomeProperty2 }</param>\n        /// <returns>是否成功</returns>\n        public bool Set(TEntity entity, Expression<Func<TEntity, object>> fields = null)\n        {\n            if (entity == null)\n                return false;\n\n            return Execute((connection) =>\n            {\n                var tableName = entity.GetTableName(TableNameFunc);\n                var fieldNames = fields.GetFieldNames()?.ToList();\n                var task = connection.Set(tableName, entity, fieldNames, OutSqlAction);\n                return task;\n            }, true);\n        }\n\n        /// <summary>\n        /// 根据字段修改\n        /// </summary>\n        /// <param name=\"setExpress\">修改字段表达式：() => new { SomeProperty1 = \"\", SomeProperty2 = \"\" } or Dictionary<string, object></string></param>\n        /// <param name=\"whereExpress\">条件表达式</param>\n        /// <returns>是否成功</returns>\n        public bool Set(Expression<Func<object>> setExpress, Expression<Func<TEntity, bool>> whereExpress)\n        {\n            if (setExpress == null || whereExpress == null)\n                return false;\n\n            return Execute((connection) =>\n            {\n                var tableName = whereExpress.GetTableName(TableNameFunc);\n                var task = connection.Set(tableName, setExpress, whereExpress, OutSqlAction);\n                return task;\n            }, true);\n        }\n\n        /// <summary>\n        /// 根据条件 在原字段上增减数据\n        /// </summary>\n        /// <typeparam name=\"TValue\"></typeparam>\n        /// <param name=\"field\">增减的字段</param>\n        /// <param name=\"value\">增减的值</param>\n        /// <param name=\"whereExpress\">条件表达式</param>\n        /// <returns></returns>\n        public bool Incr<TValue>(string field, TValue value, Expression<Func<TEntity, bool>> whereExpress) where TValue : struct\n        {\n            if (string.IsNullOrWhiteSpace(field))\n                throw new ArgumentNullException(nameof(field), \"字段值必须提供\");\n\n            return Execute((connection) =>\n            {\n                var tableName = whereExpress.GetTableName(TableNameFunc);\n                var task = connection.Incr(tableName, field, value, whereExpress, OutSqlAction);\n                return task;\n            }, true);\n        }\n\n        /// <summary>\n        /// 查找数据\n        /// </summary>\n        /// <param name=\"expression\">查询条件</param>\n        /// <param name=\"fieldExpressison\">按字段返回</param>\n        /// <param name=\"isMaster\">是否主从</param>\n        /// <returns>实体</returns>\n        public TEntity Get(Expression<Func<TEntity, bool>> expression, Expression<Func<TEntity, object>> fieldExpressison = null, bool isMaster = false)\n        {\n            if (expression == null)\n                return default(TEntity);\n\n            return Execute((connection) =>\n            {\n                var tableName = expression.GetTableName(TableNameFunc);\n                var task = connection.Get(tableName, expression, fieldExpressison, OutSqlAction);\n                return task;\n            }, isMaster);\n        }\n\n        /// <summary>\n        /// 获取列表\n        /// </summary>\n        /// <param name=\"page\"></param>\n        /// <param name=\"rows\"></param>\n        /// <param name=\"expression\">条件表达式</param>\n        /// <param name=\"fieldExpressison\">按字段返回</param>\n        /// <param name=\"isMaster\">是否主从</param>\n        /// <param name=\"orderByFields\">排序字段集合</param>\n        /// <returns></returns>\n        public IEnumerable<TEntity> GetList(\n            int page,\n            int rows,\n            Expression<Func<TEntity, bool>> expression = null,\n            Expression<Func<TEntity, object>> fieldExpressison = null,\n            bool isMaster = false,\n            params OrderByField[] orderByFields)\n        {\n            if (page <= 0 || rows <= 0)\n                return default(IEnumerable<TEntity>);\n\n            return Execute((connection) =>\n            {\n                var tableName = expression.GetTableName(TableNameFunc);\n                var task = connection.GetList(tableName, page, rows, expression, fieldExpressison, orderByFields?.ToList(), OutSqlAction);\n                return task;\n            }, isMaster);\n        }\n\n        /// <summary>\n        /// 获取列表 Offset\n        /// </summary>\n        /// <param name=\"offset\"></param>\n        /// <param name=\"size\"></param>\n        /// <param name=\"expression\">条件表达式</param>\n        /// <param name=\"fieldExpressison\">按字段返回</param>\n        /// <param name=\"isMaster\">是否主从</param>\n        /// <param name=\"orderByFields\">排序字段集合</param>\n        /// <returns></returns>\n        public IEnumerable<TEntity> GetOffsets(\n            int offset,\n            int size,\n            Expression<Func<TEntity, bool>> expression = null,\n            Expression<Func<TEntity, object>> fieldExpressison = null,\n            bool isMaster = false,\n            params OrderByField[] orderByFields)\n        {\n            if (offset < 0 || size <= 0)\n                return default(IEnumerable<TEntity>);\n\n            return Execute((connection) =>\n            {\n                var tableName = expression.GetTableName(TableNameFunc);\n                var task = connection.GetOffsets(tableName, offset, size, expression, fieldExpressison, orderByFields?.ToList(), OutSqlAction);\n                return task;\n            }, isMaster);\n        }\n\n        /// <summary>\n        /// 获取数量\n        /// </summary>\n        /// <param name=\"expression\">条件表达式</param>\n        /// <param name=\"isMaster\">是否主从</param>\n        /// <returns></returns>\n        public int Count(Expression<Func<TEntity, bool>> expression = null, bool isMaster = false)\n        {\n            return Execute((connection) =>\n            {\n                var tableName = expression.GetTableName(TableNameFunc);\n                var task = connection.Count(tableName, expression, OutSqlAction);\n                return task;\n            }, isMaster);\n        }\n        #endregion\n\n        #region Async Method\n        /// <summary>\n        /// 是否存在表\n        /// </summary>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"isMaster\"></param>\n        /// <returns></returns>\n        public async Task<bool> IsExistTableAsync(string tableName, bool isMaster = true)\n        {\n            if (string.IsNullOrEmpty(tableName))\n                return false;\n\n            using (var connection = OpenConnection(isMaster))\n            {\n                return await connection.IsExistTableAsync(tableName, OutSqlAction);\n            }\n        }\n\n        /// <summary>\n        /// 是否存在字段\n        /// </summary>\n        /// <param name=\"tableName\"></param>\n        /// <param name=\"fieldName\"></param>\n        /// <param name=\"isMaster\"></param>\n        /// <returns></returns>\n        public async Task<bool> IsExistFieldAsync(string tableName, string fieldName, bool isMaster = true)\n        {\n            if (string.IsNullOrEmpty(tableName) || string.IsNullOrEmpty(fieldName))\n                return false;\n\n            using (var conneciton = OpenConnection(isMaster))\n            {\n                return await conneciton.IsExistFieldAsync(tableName, fieldName, OutSqlAction);\n            }\n        }\n\n        /// <summary>\n        /// 异步添加\n        /// </summary>\n        /// <param name=\"entity\"></param>\n        /// <param name=\"returnLastIdentity\">是否赋值最后一次的自增ID</param>\n        /// <returns></returns>\n        public async Task<bool> AddAsync(TEntity entity, bool returnLastIdentity = false)\n        {\n            if (entity == null)\n                return false;\n\n            return await Execute(async (connection) =>\n            {\n                var tableName = entity.GetTableName(TableNameFunc);\n                var result = await connection.InsertAsync(tableName, entity, returnLastIdentity, OutSqlAction);\n                return result;\n            }, true);\n        }\n\n        /// <summary>\n        /// 异步批量添加\n        /// </summary>\n        /// <param name=\"entities\"></param>\n        /// <returns></returns>\n        public async Task<bool> AddAsync(params TEntity[] entities)\n        {\n            if ((entities?.Count() ?? 0) <= 0)\n                return false;\n\n            return await Execute(async (connection) =>\n            {\n                var tableName = entities.First().GetTableName(TableNameFunc);\n                var result = await connection.InsertAsync(tableName, entities, OutSqlAction);\n                return result > 0;\n            }, true);\n        }\n\n        /// <summary>\n        /// 异步删除\n        /// </summary>\n        /// <param name=\"expression\">删除条件</param>\n        /// <returns>是否成功</returns>\n        public async Task<bool> DeleteAsync(Expression<Func<TEntity, bool>> expression)\n        {\n            return await Execute(async (connection) =>\n            {\n                var tableName = expression.GetTableName(TableNameFunc);\n                var task = await connection.DeleteAsync(tableName, expression, OutSqlAction);\n                return task > 0;\n            }, true);\n        }\n\n        /// <summary>\n        /// 异步更新\n        /// </summary>\n        /// <param name=\"entity\">数据实体</param>\n        /// <param name=\"fields\">x=> x.SomeProperty1 or x=> new { x.SomeProperty1, x.SomeProperty2 }</param>\n        /// <returns>是否成功</returns>\n        public async Task<bool> SetAsync(TEntity entity, Expression<Func<TEntity, object>> fields = null)\n        {\n            if (entity == null)\n                return false;\n\n            var fieldNames = fields.GetFieldNames()?.ToList();\n            return await Execute(async (connection) =>\n            {\n                var tableName = entity.GetTableName(TableNameFunc);\n                var task = await connection.SetAsync(tableName, entity, fieldNames, OutSqlAction);\n                return task;\n            }, true);\n        }\n\n        /// <summary>\n        /// 异步根据字段修改\n        /// </summary>\n        /// <param name=\"setExpress\">修改字段表达式：() => new { SomeProperty1 = \"\", SomeProperty2 = \"\" } or Dictionary<string, object></string></param>\n        /// <param name=\"whereExpress\">条件表达式</param>\n        /// <returns>是否成功</returns>\n        public async Task<bool> SetAsync(Expression<Func<object>> setExpress, Expression<Func<TEntity, bool>> whereExpress)\n        {\n            if (setExpress == null || whereExpress == null)\n                return false;\n\n            return await Execute(async (connection) =>\n            {\n                var tableName = whereExpress.GetTableName(TableNameFunc);\n                var task = await connection.SetAsync(tableName, setExpress, whereExpress, OutSqlAction);\n                return task;\n            }, true);\n        }\n\n        /// <summary>\n        /// 根据条件 在原字段上增减数据\n        /// </summary>\n        /// <param name=\"field\">增减的字段，底层未验证改字段是否存在，由数据库异常抛出</param>\n        /// <param name=\"value\">增减的值</param>\n        /// <param name=\"whereExpress\">条件表达式</param>\n        /// <returns>是否成功</returns>\n        public async Task<bool> IncrAsync<TValue>(string field, TValue value, Expression<Func<TEntity, bool>> whereExpress) where TValue : struct\n        {\n            if (string.IsNullOrWhiteSpace(field))\n                throw new ArgumentNullException(nameof(field), \"字段值必须提供\");\n\n            return await Execute(async (connection) =>\n            {\n                var tableName = whereExpress.GetTableName(TableNameFunc);\n                var task = await connection.IncrAsync(tableName, field, value, whereExpress, OutSqlAction);\n                return task;\n            }, true);\n        }\n\n        /// <summary>\n        /// 异步获取一条数据\n        /// </summary>\n        /// <param name=\"expression\">查询条件</param>\n        /// <param name=\"fieldExpressison\">按字段返回</param>\n        /// <param name=\"isMaster\">是否主从</param>\n        /// <returns>实体</returns>\n        public async Task<TEntity> GetAsync(Expression<Func<TEntity, bool>> expression, Expression<Func<TEntity, object>> fieldExpressison = null, bool isMaster = false)\n        {\n            if (expression == null)\n                return default(TEntity);\n\n            return await Execute(async (connection) =>\n            {\n                var tableName = expression.GetTableName(TableNameFunc);\n                var task = await connection.GetAsync(tableName, expression, fieldExpressison, OutSqlAction);\n                return task;\n            }, isMaster);\n        }\n\n        /// <summary>\n        /// 异步获取列表\n        /// </summary>\n        /// <param name=\"page\"></param>\n        /// <param name=\"rows\"></param>\n        /// <param name=\"expression\">条件表达式</param>\n        /// <param name=\"fieldExpressison\">按字段返回</param>\n        /// <param name=\"isMaster\">是否主从</param>\n        /// <param name=\"orderByFields\">排序字段集合</param>\n        /// <returns></returns>\n        public async Task<IEnumerable<TEntity>> GetListAsync(\n            int page,\n            int rows,\n            Expression<Func<TEntity, bool>> expression = null,\n            Expression<Func<TEntity, object>> fieldExpressison = null,\n            bool isMaster = false,\n            params OrderByField[] orderByFields)\n        {\n            if (page <= 0 || rows <= 0)\n                return default(IEnumerable<TEntity>);\n\n            return await Execute(async (connection) =>\n            {\n                var tableName = expression.GetTableName(TableNameFunc);\n                var task = await connection.GetListAsync(tableName, page, rows, expression, fieldExpressison, orderByFields?.ToList(), OutSqlAction);\n                return task;\n            }, isMaster);\n        }\n\n        /// <summary>\n        /// 异步获取列表 Offset\n        /// </summary>\n        /// <param name=\"offset\"></param>\n        /// <param name=\"size\"></param>\n        /// <param name=\"expression\">条件表达式</param>\n        /// <param name=\"fieldExpressison\">按字段返回</param>\n        /// <param name=\"isMaster\">是否主从</param>\n        /// <param name=\"orderByFields\">排序字段集合</param>\n        /// <returns></returns>\n        public async Task<IEnumerable<TEntity>> GetOffsetsAsync(\n            int offset,\n            int size,\n            Expression<Func<TEntity, bool>> expression = null,\n            Expression<Func<TEntity, object>> fieldExpressison = null,\n            bool isMaster = false,\n            params OrderByField[] orderByFields)\n        {\n            if (offset < 0 || size <= 0)\n                return default(IEnumerable<TEntity>);\n\n            return await Execute(async (connection) =>\n            {\n                var tableName = expression.GetTableName(TableNameFunc);\n                var task = await connection.GetOffsetsAsync(tableName, offset, size, expression, fieldExpressison, orderByFields?.ToList(), OutSqlAction);\n                return task;\n            }, isMaster);\n        }\n\n        /// <summary>\n        /// 异步获取数量\n        /// </summary>\n        /// <param name=\"expression\">条件表达式</param>\n        /// <param name=\"isMaster\">是否主从</param>\n        /// <returns></returns>\n        public async Task<int> CountAsync(Expression<Func<TEntity, bool>> expression = null, bool isMaster = false)\n        {\n            return await Execute(async (connection) =>\n            {\n                var tableName = expression.GetTableName(TableNameFunc);\n                var task = await connection.CountAsync(tableName, expression, OutSqlAction);\n                return task;\n            }, isMaster);\n        }\n        #endregion\n\n        #region Protected\n        /// <summary>\n        /// 包含connection的方法执行\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"func\"></param>\n        /// <param name=\"isMaster\"></param>\n        /// <returns></returns>\n        protected virtual T Execute<T>(Func<IDbConnection, T> func, bool isMaster = true)\n        {\n            if (!this.CheckTableIfMissingCreate(isMaster))\n                return default(T);\n\n            using (var connection = OpenConnection(isMaster))\n            {\n                return func(connection);\n            }\n        }\n\n        /// <summary>\n        /// 包含connection的方法执行\n        /// </summary>\n        /// <typeparam name=\"T\"></typeparam>\n        /// <param name=\"func\"></param>\n        /// <param name=\"isMaster\"></param>\n        /// <returns></returns>\n        protected virtual async Task<T> Execute<T>(Func<IDbConnection, Task<T>> func, bool isMaster = true)\n        {\n            if (!this.CheckTableIfMissingCreate(isMaster))\n                return default(T);\n\n            using (var connection = OpenConnection(isMaster))\n            {\n                return await func(connection);\n            }\n        }\n        #endregion\n\n        #region Private Method\n        /// <summary>\n        /// 填充ExecuteScript\n        /// </summary>\n        /// <param name=\"sql\"></param>\n        private void OutSqlAction(string sql)\n        {\n            ExecuteScript = sql;\n        }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/Overt.Core.Data/Repository/PropertyAssist.cs",
    "content": "﻿using System;\nusing System.Data;\n#if ASP_NET_CORE\nusing Microsoft.Extensions.Configuration;\n#else\nusing System.Configuration;\n#endif\n\nnamespace Overt.Core.Data\n{\n    /// <summary>\n    /// DbRespository 抽象类\n    /// </summary>\n    public abstract class PropertyAssist : IPropertyAssist\n    {\n        #region Private Property\n#if ASP_NET_CORE\n        private readonly IConfiguration _configuration;\n#endif\n        #endregion\n\n        #region Constructor\n#if ASP_NET_CORE\n        /// <summary>\n        /// 实例化\n        /// </summary>\n        /// <param name=\"configuration\">配置注入</param>\n        /// <param name=\"dbStoreKey\">数据库前缀</param>\n        public PropertyAssist(IConfiguration configuration, string dbStoreKey = \"\")\n        {\n            _configuration = configuration;\n            DbStoreKey = dbStoreKey;\n        }\n#else\n        /// <summary>\n        /// 实例化\n        /// </summary>\n        /// <param name=\"dbStoreKey\">数据库前缀</param>\n        public PropertyAssist(string dbStoreKey = \"\")\n        {\n            DbStoreKey = dbStoreKey;\n        }\n#endif\n        #endregion\n\n        #region Public Method\n        /// <summary>\n        /// 数据库名key\n        /// </summary>\n        public string DbStoreKey { get; set; }\n\n        /// <summary>\n        /// 打开连接 已赋值 connection 属性\n        /// </summary>\n        /// <returns></returns>\n        public virtual IDbConnection OpenConnection(bool isMaster = false)\n        {\n            IDbConnection connection;\n\n#if ASP_NET_CORE\n            connection = new DataContext(_configuration, isMaster, DbStoreKey, ConnectionFunc).DbConnection;\n#else\n            connection = new DataContext(isMaster, DbStoreKey, ConnectionFunc).DbConnection;\n#endif\n\n            if (connection == null)\n                throw new Exception(\"数据库连接创建失败，请检查连接字符串是否正确...\");\n\n            if (connection.State != ConnectionState.Open)\n                connection.Open();\n\n            return connection;\n        }\n\n        /// <summary>\n        /// 数据库连接方法\n        /// </summary>\n#if ASP_NET_CORE\n        public virtual Func<bool, string> ConnectionFunc { get; set; }\n#else\n        public virtual Func<bool, ConnectionStringSettings> ConnectionFunc { get; set; }\n#endif\n\n        /// <summary>\n        /// 表名方法\n        /// </summary>\n        public virtual Func<string> TableNameFunc { get; set; }\n\n        /// <summary>\n        /// 创建表的脚本\n        /// </summary>\n        public virtual Func<string, string> CreateScriptFunc { get; set; }\n\n        /// <summary>\n        /// 执行的sql脚本\n        /// </summary>\n        public virtual string ExecuteScript { get; set; }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.Core.DataConsole/Overt.Core.DataConsole.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>netcoreapp2.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Extensions.Configuration\" Version=\"2.0.1\" />\n    <PackageReference Include=\"Microsoft.Extensions.Configuration.Json\" Version=\"2.0.1\" />\n    <PackageReference Include=\"Microsoft.Extensions.DependencyInjection\" Version=\"2.0.0\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Overt.User.Application\\Overt.User.Application.csproj\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Reference Include=\"Microsoft.Extensions.DependencyInjection\">\n      <HintPath>C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder\\microsoft.extensions.dependencyinjection\\2.0.0\\lib\\netstandard2.0\\Microsoft.Extensions.DependencyInjection.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Update=\"appsettings.txt\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n    <None Update=\"appsettings.json\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n  </ItemGroup>\n\n  <ProjectExtensions><VisualStudio><UserProperties appsettings_1json__JSONSchema=\"https://json.schemastore.org/bitrise\" /></VisualStudio></ProjectExtensions>\n\n</Project>\n"
  },
  {
    "path": "src/core/Overt.Core.DataConsole/Program.cs",
    "content": "﻿using Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.DependencyInjection;\nusing System;\nusing Overt.User.Application;\nusing Overt.User.Application.Constracts;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nnamespace Overt.Core.DataConsole\n{\n    class Program\n    {\n        static IServiceProvider provider;\n        static Program()\n        {\n            var builder = new ConfigurationBuilder()\n                   .SetBasePath(AppContext.BaseDirectory)\n                   .AddJsonFile(\"appsettings.json\", true);\n\n            var configuration = builder.Build();\n\n            var services = new ServiceCollection();\n            services.AddSingleton<IConfiguration>(configuration);\n            services.AddApplicationDI();\n\n            provider = services.BuildServiceProvider();\n\n        }\n        static void Main(string[] args)\n        {\n            ExecuteMethod();\n\n            ExecuteMethodAsync().GetAwaiter().GetResult();\n\n            ExecuteMethodLongId();\n\n            ExecuteMethodLongIdAsync().GetAwaiter().GetResult();\n        }\n\n        #region Static Method\n        private static void ExecuteMethodLongId()\n        {\n            var _userService = provider.GetService<IUserLongIdService>();\n\n            // 新增\n            var userId = _userService.Add(new User.Application.Models.UserPostModel()\n            {\n                UserName = \"TEST1\",\n                RealName = \"TEST1\",\n                Password = \"123456\",\n                IsSex = false,\n                JsonValue = \"{}\"\n            });\n\n            // 批量新增\n            var batchAddResult = _userService.Add(new User.Application.Models.UserPostModel()\n            {\n                UserName = \"TEST1\" + DateTime.Now.ToString(\"fffff\"),\n                RealName = \"TEST1\" + DateTime.Now.ToString(\"fffff\"),\n                Password = \"123456\",\n                IsSex = false,\n                JsonValue = \"{}\"\n            }, new User.Application.Models.UserPostModel()\n            {\n                UserName = \"TEST2\" + DateTime.Now.ToString(\"fffff\"),\n                RealName = \"TEST2\" + DateTime.Now.ToString(\"fffff\"),\n                Password = \"123456\",\n                IsSex = false,\n                JsonValue = \"{}\"\n            });\n        }\n\n        private static async Task ExecuteMethodLongIdAsync()\n        {\n            var _userService = provider.GetService<IUserLongIdService>();\n\n            // 新增\n            var userId = await _userService.AddAsync(new User.Application.Models.UserPostModel()\n            {\n                UserName = \"TEST1\",\n                RealName = \"TEST1\",\n                Password = \"123456\",\n                IsSex = false,\n                JsonValue = \"{}\"\n            });\n\n            // 批量新增\n            var batchAddResult = await _userService.AddAsync(new User.Application.Models.UserPostModel()\n            {\n                UserName = \"TEST1\" + DateTime.Now.ToString(\"fffff\"),\n                RealName = \"TEST1\" + DateTime.Now.ToString(\"fffff\"),\n                Password = \"123456\",\n                IsSex = false,\n                JsonValue = \"{}\"\n            }, new User.Application.Models.UserPostModel()\n            {\n                UserName = \"TEST2\" + DateTime.Now.ToString(\"fffff\"),\n                RealName = \"TEST2\" + DateTime.Now.ToString(\"fffff\"),\n                Password = \"123456\",\n                IsSex = false,\n                JsonValue = \"{}\"\n            });\n        }\n\n        private static async Task ExecuteMethodAsync()\n        {\n            var _userService = provider.GetService<IUserService>();\n\n            #region 单表\n            // 新增\n            var userId = await _userService.AddAsync(new User.Application.Models.UserPostModel()\n            {\n                UserName = \"TEST1\",\n                RealName = \"TEST1\",\n                Password = \"123456\",\n                IsSex = false,\n                JsonValue = \"{}\"\n            });\n\n            // 批量新增\n            var batchAddResult = await _userService.AddAsync(new User.Application.Models.UserPostModel()\n            {\n                UserName = \"TEST1\" + DateTime.Now.ToString(\"fffff\"),\n                RealName = \"TEST1\" + DateTime.Now.ToString(\"fffff\"),\n                Password = \"123456\",\n                IsSex = false,\n                JsonValue = \"{}\"\n            }, new User.Application.Models.UserPostModel()\n            {\n                UserName = \"TEST2\" + DateTime.Now.ToString(\"fffff\"),\n                RealName = \"TEST2\" + DateTime.Now.ToString(\"fffff\"),\n                Password = \"123456\",\n                IsSex = false,\n                JsonValue = \"{}\"\n            });\n\n            // 修改\n            var setResult = await _userService.UpdateAsync(userId, true);\n\n            // 单条查询\n            var getResult = await _userService.GetAsync(userId, true);\n\n            // 多条查询\n            var listResult = await _userService.GetListAsync(new List<int>() { userId }, true);\n\n            // 分页查询\n            var pageResult = await _userService.GetPageAsync(new User.Application.Models.UserSearchModel()\n            {\n                Page = 1,\n                Size = 10,\n                UserIds = new List<int> { userId },\n                IsMaster = true\n            });\n\n            // 自定义SQL\n            var otherResult = await _userService.OtherSqlAsync();\n\n            // 删除\n            var delResult = await _userService.DeleteAsync(userId);\n\n            // ... 其他更多用法详见Readme，可有很多组合方式，并不局限于目前案例所示\n            #endregion\n\n            #region 分表\n            var _subUserService = provider.GetService<ISubUserService>();\n\n            // 添加\n            var addResult1 = await _subUserService.AddAsync(new User.Application.Models.UserPostModel()\n            {\n                UserName = \"TEST_Sub\",\n                RealName = \"TEST_Sub\",\n                Password = \"123456\",\n                IsSex = false,\n                JsonValue = \"{}\"\n            });\n\n            // 获取\n            var getResult1 = await _subUserService.GetAsync(addResult1);\n            #endregion\n\n            #region 分库\n            var _subDbUserService = provider.GetService<ISubDbUserService>();\n\n            // 添加\n            var addResult2 = await _subDbUserService.AddAsync(new User.Application.Models.UserPostModel()\n            {\n                UserName = \"TEST_SubDb\",\n                RealName = \"TEST_SubDb\",\n                Password = \"123456\",\n                IsSex = false,\n                JsonValue = \"{}\"\n            });\n\n            // 获取\n            var getResult2 = await _subDbUserService.GetAsync(addResult2);\n            #endregion\n\n            #region 分库2\n            var _subDbUser2Service = provider.GetService<ISubDbUser2Service>();\n\n            // 添加\n            var addResult3 = await _subDbUser2Service.AddAsync(new User.Application.Models.UserPostModel()\n            {\n                UserName = \"TEST_SubDb2\",\n                RealName = \"TEST_SubDb2\",\n                Password = \"123456\",\n                IsSex = false,\n                JsonValue = \"{}\"\n            });\n\n            // 获取\n            var getResult3 = await _subDbUser2Service.GetAsync(addResult3);\n            #endregion\n\n            #region 事务\n            var transResult = await _userService.ExecuteInTransactionAsync();\n            #endregion\n        }\n\n        /// <summary>\n        /// 同步方法\n        /// </summary>\n        private static void ExecuteMethod()\n        {\n            var _userService = provider.GetService<IUserService>();\n\n            #region 单表\n            // 新增\n            var userId = _userService.Add(new User.Application.Models.UserPostModel()\n            {\n                UserName = \"TEST1\",\n                RealName = \"TEST1\",\n                Password = \"123456\",\n                IsSex = false,\n                JsonValue = \"{}\"\n            });\n\n            // 批量新增\n            var batchAddResult = _userService.Add(new User.Application.Models.UserPostModel()\n            {\n                UserName = \"TEST1\" + DateTime.Now.ToString(\"fffff\"),\n                RealName = \"TEST1\" + DateTime.Now.ToString(\"fffff\"),\n                Password = \"123456\",\n                IsSex = false,\n                JsonValue = \"{}\"\n            }, new User.Application.Models.UserPostModel()\n            {\n                UserName = \"TEST2\" + DateTime.Now.ToString(\"fffff\"),\n                RealName = \"TEST2\" + DateTime.Now.ToString(\"fffff\"),\n                Password = \"123456\",\n                IsSex = false,\n                JsonValue = \"{}\"\n            });\n\n            // 修改\n            var setResult = _userService.Update(userId, true);\n\n            // 单条查询\n            var getResult = _userService.Get(userId, true);\n\n            // 多条查询\n            var listResult = _userService.GetList(new List<int>() { userId }, true);\n\n            // 分页查询\n            var pageResult = _userService.GetPage(new User.Application.Models.UserSearchModel()\n            {\n                Page = 1,\n                Size = 10,\n                UserIds = new List<int> { userId },\n                IsMaster = true\n            });\n\n            // 自定义SQL\n            var otherResult = _userService.OtherSql();\n\n            // 删除\n            var delResult = _userService.Delete(userId);\n\n            // ... 其他更多用法详见Readme，可有很多组合方式，并不局限于目前案例所示\n            #endregion\n\n            #region 分表\n            var _subUserService = provider.GetService<ISubUserService>();\n\n            // 添加\n            var addResult1 = _subUserService.Add(new User.Application.Models.UserPostModel()\n            {\n                UserName = \"TEST_Sub\",\n                RealName = \"TEST_Sub\",\n                Password = \"123456\",\n                IsSex = false,\n                JsonValue = \"{}\"\n            });\n\n            // 获取\n            var getResult1 = _subUserService.Get(addResult1);\n            #endregion\n\n            #region 分库\n            var _subDbUserService = provider.GetService<ISubDbUserService>();\n\n            // 添加\n            var addResult2 = _subDbUserService.Add(new User.Application.Models.UserPostModel()\n            {\n                UserName = \"TEST_SubDb\",\n                RealName = \"TEST_SubDb\",\n                Password = \"123456\",\n                IsSex = false,\n                JsonValue = \"{}\"\n            });\n\n            // 获取\n            var getResult2 = _subDbUserService.Get(addResult2);\n            #endregion\n\n            #region 分库2\n            var _subDbUser2Service = provider.GetService<ISubDbUser2Service>();\n\n            // 添加\n            var addResult3 = _subDbUser2Service.Add(new User.Application.Models.UserPostModel()\n            {\n                UserName = \"TEST_SubDb2\",\n                RealName = \"TEST_SubDb2\",\n                Password = \"123456\",\n                IsSex = false,\n                JsonValue = \"{}\"\n            });\n\n            // 获取\n            var getResult3 = _subDbUser2Service.Get(addResult3);\n            #endregion\n\n            #region 事务\n            var transResult = _userService.ExecuteInTransaction();\n            #endregion\n        }\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.Core.DataConsole/appsettings.json",
    "content": "{\n  \"ConnectionStrings\": {\n    \"master\": \"Data Source=127.0.0.1;Initial Catalog=TestDb;Persist Security Info=True;User ID=sa;Password=123465;DbType=SqlServer\",\n    \"secondary\": \"Data Source=127.0.0.1;Initial Catalog=TestDb;Persist Security Info=True;User ID=sa;Password=123465;DbType=SqlServer\",\n    \"subdb.master\": \"Data Source=127.0.0.1;Initial Catalog=TestDb;Persist Security Info=True;User ID=sa;Password=123465;DbType=SqlServer\",\n    \"subdb.secondary\": \"Data Source=127.0.0.1;Initial Catalog=TestDb;Persist Security Info=True;User ID=sa;Password=123465;DbType=SqlServer\",\n\n    // д\n    \"mysql.master\": \"Server=127.0.0.1;Database=TestDb;uid=root;password=123456;DbType=MySql\",\n    \"sqlite.master\": \"Data Source=E:\\\\SQLiteDb\\\\testdb.db;DbType=SQLite;\",\n    \"ss.master\": \"Data Source=127.0.0.1;Initial Catalog=TestDb;Persist Security Info=True;User ID=sa;Password=123456;DbType=SqlServer\",\n    \"pg.master\": \"Host=127.0.0.1;Port=5432;Database=test;Username=sa;Password=123456;Persist Security Info=True;DbType=PostgreSQL\"\n  }\n}\n"
  },
  {
    "path": "src/core/Overt.Core.Test/ApplicationTest.cs",
    "content": "using Microsoft.VisualStudio.TestTools.UnitTesting;\nusing Overt.User.Application.Constracts;\nusing Microsoft.Extensions.DependencyInjection;\nusing System.Threading.Tasks;\nusing System.Collections.Generic;\n\nnamespace Overt.Core.Test\n{\n    [TestClass]\n    public class ApplicationTest : BaseTest\n    {\n        public ApplicationTest() : base()\n        {\n        }\n\n        [TestMethod]\n        public void DoSomethingTest()\n        {\n            var _userService = provider.GetService<IUserService>();\n            //_userService.DoSomethingWithTrans();\n\n            _userService.GetList();\n\n            //Parallel.For(0, 100, (i) =>\n            //{\n            //    if (i % 2 == 0)\n            //    {\n            //        System.Diagnostics.Debug.WriteLine(\"Add: \" + i);\n            //        var _userService = provider.GetService<IUserService>();\n            //        _userService.Add();\n            //    }\n            //    else\n            //    {\n            //        System.Diagnostics.Debug.WriteLine(\"GetList: \" + i);\n            //        var _userService = provider.GetService<IUserService>();\n            //        _userService.GetList();\n            //    }\n            //});\n\n            //var tasks = new List<Task>();\n            //for (int i = 0; i < 2; i++)\n            //{\n            //    var task = Task.Run(() =>\n            //    {\n            //        var _userService = provider.GetService<IUserService>();\n            //        _userService.DoSomethingWithTrans();\n            //    });\n            //    tasks.Add(task);\n            //}\n            //Task.WaitAll(tasks.ToArray());\n        }\n\n        [TestMethod]\n        public void DoSomeTest()\n        {\n            var _userService = provider.GetService<IUserService>();\n            _userService.DoSomethingWithTrans();\n        }\n\n\n\n        [TestMethod]\n        public void GetByIdsTest()\n        {\n            var _userService = provider.GetService<IUserService>();\n            _userService.GetByIds();\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.Core.Test/BaseTest.cs",
    "content": "﻿using Microsoft.Extensions.Configuration;\nusing Microsoft.Extensions.DependencyInjection;\nusing Overt.User.Application;\nusing System;\n\nnamespace Overt.Core.Test\n{\n    public class BaseTest\n    {\n        public IServiceProvider provider;\n        public BaseTest()\n        {\n            var builder = new ConfigurationBuilder()\n                .SetBasePath(AppContext.BaseDirectory)\n                .AddJsonFile(\"appsettings.json\", true);\n                \n            var configuration = builder.Build();\n\n            var services = new ServiceCollection();\n            services.AddSingleton<IConfiguration>(configuration);\n            services.AddApplicationDI();\n\n            provider = services.BuildServiceProvider();\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.Core.Test/Overt.Core.Test.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp2.0</TargetFramework>\n\n    <IsPackable>false</IsPackable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Extensions.Configuration.Json\" Version=\"2.0.0\" />\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"15.3.0-preview-20170628-02\" />\n    <PackageReference Include=\"MSTest.TestAdapter\" Version=\"1.1.18\" />\n    <PackageReference Include=\"MSTest.TestFramework\" Version=\"1.1.18\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Overt.User.Application\\Overt.User.Application.csproj\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Reference Include=\"Microsoft.Extensions.DependencyInjection\">\n      <HintPath>C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder\\microsoft.extensions.dependencyinjection\\2.0.0\\lib\\netstandard2.0\\Microsoft.Extensions.DependencyInjection.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.Extensions.DependencyInjection.Abstractions\">\n      <HintPath>C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder\\microsoft.extensions.dependencyinjection.abstractions\\2.0.0\\lib\\netstandard2.0\\Microsoft.Extensions.DependencyInjection.Abstractions.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Update=\"appsettings.json\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/core/Overt.Core.Test/appsettings.json",
    "content": "{\n  \"ConnectionStrings\": {\n    \"ss.master\": \"Data Source=127.0.0.1;Initial Catalog=TestDb;Persist Security Info=True;User ID=sa;Password=123456;DbType=SqlServer\"\n  }\n}\n"
  },
  {
    "path": "src/core/Overt.User.Application/AutoMapperProfiles.cs",
    "content": "﻿using AutoMapper;\nusing Overt.User.Application.Models;\nusing Overt.User.Domain.Entities;\n\nnamespace Overt.User.Application\n{\n    public class AutoMapperProfiles : Profile\n    {\n        public AutoMapperProfiles()\n        {\n            #region Input\n            CreateMap<UserPostModel, UserEntity>();\n            CreateMap<UserPostModel, SubUserEntity>();\n            CreateMap<UserPostModel, SubDbUserEntity>();\n            CreateMap<UserPostModel, SubDbUser2Entity>();\n            CreateMap<UserPostModel, UserLongIdEntity>();\n            #endregion\n\n            #region Output\n            CreateMap<UserEntity,UserModel>();\n            CreateMap<SubUserEntity, UserModel>();\n            CreateMap<SubDbUserEntity, UserModel>();\n            CreateMap<SubDbUser2Entity, UserModel>();\n            CreateMap<UserLongIdEntity, UserModel>();\n            #endregion\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.User.Application/Constracts/ISubDbUser2Service.cs",
    "content": "﻿using Overt.User.Application.Models;\nusing System.Threading.Tasks;\n\nnamespace Overt.User.Application.Constracts\n{\n    public interface ISubDbUser2Service\n    {\n        int Add(UserPostModel model);\n        UserModel Get(int userId, bool isMaster = false);\n\n        Task<int> AddAsync(UserPostModel model);\n\n        Task<UserModel> GetAsync(int userId, bool isMaster = false);\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.User.Application/Constracts/ISubDbUserService.cs",
    "content": "﻿using Overt.User.Application.Models;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Overt.User.Application.Constracts\n{\n    public interface ISubDbUserService\n    {\n\n        int Add(UserPostModel model);\n\n        UserModel Get(int userId, bool isMaster = false);\n\n        Task<int> AddAsync(UserPostModel model);\n\n        Task<UserModel> GetAsync(int userId, bool isMaster = false);\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.User.Application/Constracts/ISubUserService.cs",
    "content": "﻿using Overt.User.Application.Models;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Overt.User.Application.Constracts\n{\n    public interface ISubUserService\n    {\n        int Add(UserPostModel model);\n\n        UserModel Get(int userId, bool isMaster = false);\n\n        Task<int> AddAsync(UserPostModel model);\n\n        Task<UserModel> GetAsync(int userId, bool isMaster = false);\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.User.Application/Constracts/IUserLongIdService.cs",
    "content": "﻿using Overt.User.Application.Models;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Overt.User.Application.Constracts\n{\n    public interface IUserLongIdService\n    {\n        #region SyncMethod\n        UserModel Get(long userId, bool isMaster = false);\n\n        List<UserModel> GetList(List<long> userIds, bool isMaster = false);\n\n        long Add(UserPostModel model);\n\n        bool Add(params UserPostModel[] models);\n        #endregion\n\n        #region AsyncMethod\n        Task<UserModel> GetAsync(long userId, bool isMaster = false);\n\n        Task<List<UserModel>> GetListAsync(List<long> userIds, bool isMaster = false);\n\n        Task<long> AddAsync(UserPostModel model);\n\n        Task<bool> AddAsync(params UserPostModel[] models);\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.User.Application/Constracts/IUserService.cs",
    "content": "﻿using Overt.User.Application.Models;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Overt.User.Application.Constracts\n{\n    public interface IUserService\n    {\n        #region SyncMethod\n        UserModel Get(int userId, bool isMaster = false);\n\n        List<UserModel> GetList(List<int> userIds, bool isMaster = false);\n\n        (int, List<UserModel>) GetPage(UserSearchModel model);\n\n        int Add(UserPostModel model);\n\n        bool Add(params UserPostModel[] models);\n\n        bool Update(int userId, bool isSex);\n\n        bool Delete(int userId);\n\n        List<string> OtherSql();\n\n        /// <summary>\n        /// 在事务中执行\n        /// </summary>\n        /// <returns></returns>\n        bool ExecuteInTransaction();\n        #endregion\n\n        #region AsyncMethod\n        Task<UserModel> GetAsync(int userId, bool isMaster = false);\n\n        Task<List<UserModel>> GetListAsync(List<int> userIds, bool isMaster = false);\n\n        Task<(int, List<UserModel>)> GetPageAsync(UserSearchModel model);\n\n        Task<int> AddAsync(UserPostModel model);\n\n        Task<bool> AddAsync(params UserPostModel[] models);\n\n        Task<bool> UpdateAsync(int userId, bool isSex);\n\n        Task<bool> DeleteAsync(int userId);\n\n        Task<List<string>> OtherSqlAsync();\n\n        /// <summary>\n        /// 在事务中执行\n        /// </summary>\n        /// <returns></returns>\n        Task<bool> ExecuteInTransactionAsync();\n        #endregion\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.User.Application/Extensions/ModelValidationExtensions.cs",
    "content": "﻿using System;\nusing System.ComponentModel.DataAnnotations;\nusing System.Linq;\n\nnamespace Overt.User.Application\n{\n    public static class ModelValidationExtensions\n    {\n        public static bool IsValid(this object obj,out Exception exception)\n        {\n            exception = null;\n\n            if(obj == null)\n            {\n                exception = new ArgumentNullException();\n                return false;\n            }\n\n            var context = new ValidationContext(obj);\n            var result = Validate(context);\n            if (result == null)\n                return true;\n\n            exception = new Exception(result.ErrorMessage);\n            return false;\n        }\n\n        private static ValidationResult Validate(ValidationContext context)\n        {\n            var properties = context.ObjectType.GetProperties();\n\n            if (context.ObjectInstance is IValidatableObject)\n            {\n                IValidatableObject valid = (IValidatableObject)context.ObjectInstance;\n                var validationResults = valid.Validate(context);\n                if (validationResults != null && validationResults.Count() > 0)\n                {\n                    return valid.Validate(context).FirstOrDefault();\n                }\n            }\n\n            foreach (var property in properties)\n            {\n                var validationAttributes = property.GetCustomAttributes(false).OfType<ValidationAttribute>();\n                foreach (var attribute in validationAttributes)\n                {\n                    bool isValid = attribute.IsValid(property.GetValue(context.ObjectInstance));\n                    if (!isValid)\n                    {\n                        return new ValidationResult(attribute.ErrorMessage, new[] { property.Name });\n                    }\n                }\n            }\n\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.User.Application/Models/UserModel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\nusing System.Text;\n\nnamespace Overt.User.Application.Models\n{\n    public class UserModel\n    {\n        public int UserId { get; set; }\n        public string UserName { get; set; }\n        public string RealName { get; set; }\n        public string Password { get; set; }\n        public DateTime AddTime { get; set; }\n        public bool IsSex { get; set; }\n        /// <summary>\n        /// Json类型\n        /// </summary>\n        public string JsonValue { get; set; }\n    }\n\n}\n"
  },
  {
    "path": "src/core/Overt.User.Application/Models/UserPostModel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Overt.User.Application.Models\n{\n    public class UserPostModel : IValidatableObject\n    {\n        public string UserName { get; set; }\n        public string RealName { get; set; }\n        public string Password { get; set; }\n        public DateTime AddTime { get; set; }\n        public bool IsSex { get; set; }\n        /// <summary>\n        /// Json类型\n        /// </summary>\n        public string JsonValue { get; set; }\n\n\n        /// <summary>\n        /// 验证方法\n        /// </summary>\n        /// <param name=\"validationContext\"></param>\n        /// <returns></returns>\n        public virtual IEnumerable<ValidationResult> Validate(ValidationContext validationContext)\n        {\n            if (string.IsNullOrWhiteSpace(UserName))\n                yield return new ValidationResult(\"用户名必须提供\", new[] { nameof(UserName) });\n\n            if (string.IsNullOrWhiteSpace(Password))\n                yield return new ValidationResult(\"密码必须提供\", new[] { nameof(Password) });\n        }\n    }\n\n}\n"
  },
  {
    "path": "src/core/Overt.User.Application/Models/UserSearchModel.cs",
    "content": "﻿using Overt.Core.Data;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Linq.Expressions;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Overt.User.Application.Models\n{\n    public class UserSearchModel\n    {\n        public int Page { get; set; }\n\n        public int Size { get; set; }\n\n        public bool IsMaster { get; set; }\n\n        public List<int> UserIds { get; set; }\n\n        public string SearchKey { get; set; }\n\n        public Expression<Func<UserEntity, bool>> GetExpression()\n        {\n            Expression<Func<UserEntity, bool>> expression = oo => oo.UserId > 0;\n            if (UserIds?.Count > 0)\n                expression = expression.And(oo => UserIds.Contains(oo.UserId));\n\n            if (!string.IsNullOrEmpty(SearchKey))\n                expression = expression.And(oo => oo.UserName.Contains(SearchKey));\n\n            return expression;\n        }\n\n        public OrderByField[] GetOrder()\n        {\n            var list = new List<OrderByField>()\n           {\n               OrderByField.Create(nameof(UserEntity.AddTime), FieldSortType.Asc)\n           };\n            return list.ToArray();\n        }\n\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.User.Application/Overt.User.Application.csproj",
    "content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp2.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"AutoMapper.Extensions.Microsoft.DependencyInjection\" Version=\"6.0.0\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Overt.User.Domain\\Overt.User.Domain.csproj\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Reference Include=\"Microsoft.Extensions.DependencyInjection.Abstractions\">\n      <HintPath>C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder\\microsoft.extensions.dependencyinjection.abstractions\\2.0.0\\lib\\netstandard2.0\\Microsoft.Extensions.DependencyInjection.Abstractions.dll</HintPath>\n    </Reference>\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/core/Overt.User.Application/ServiceCollectionExtensions.cs",
    "content": "﻿using AutoMapper;\nusing Microsoft.Extensions.DependencyInjection;\nusing Overt.User.Application.Constracts;\nusing Overt.User.Application.Services;\nusing Overt.User.Domain;\n\nnamespace Overt.User.Application\n{\n    public static class ServiceCollectionExtensions\n    {\n        public static void AddApplicationDI(this IServiceCollection services)\n        {\n            services.AddTransient<IUserService, UserService>();\n            services.AddTransient<ISubUserService, SubUserService>();\n            services.AddTransient<ISubDbUserService, SubDbUserService>();\n            services.AddTransient<ISubDbUser2Service, SubDbUser2Service>();\n            services.AddTransient<IUserLongIdService, UserLongIdService>();\n\n            services.AddDomainDI();\n            services.AddAutoMapper();\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.User.Application/Services/SubDbUser2Service.cs",
    "content": "﻿using AutoMapper;\nusing Overt.User.Application.Constracts;\nusing Overt.User.Application.Models;\nusing Overt.User.Domain.Contracts;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Threading.Tasks;\n\nnamespace Overt.User.Application.Services\n{\n    public class SubDbUser2Service : ISubDbUser2Service\n    {\n        IMapper _mapper;\n        ISubDbUser2Repository _repository;\n        public SubDbUser2Service(\n            IMapper mapper,\n            ISubDbUser2Repository repository)\n        {\n            _mapper = mapper;\n            _repository = repository;\n        }\n\n        public int Add(UserPostModel model)\n        {\n            if (!model.IsValid(out Exception ex))\n                throw ex;\n\n            _repository.SubDbAddTime = DateTime.Now;\n            var entity = _mapper.Map<SubDbUser2Entity>(model);\n            entity.AddTime = DateTime.Now;\n            var result = _repository.Add(entity, true);\n            if (!result)\n                throw new Exception($\"新增失败\");\n            return entity.UserId;\n        }\n\n        public UserModel Get(int userId, bool isMaster = false)\n        {\n            if (userId <= 0)\n                throw new Exception($\"UserId必须大于0\");\n\n            _repository.SubDbAddTime = DateTime.Now;\n            var entity = _repository.Get(oo => oo.UserId == userId, isMaster: isMaster);\n            return _mapper.Map<UserModel>(entity);\n        }\n\n        public async Task<int> AddAsync(UserPostModel model)\n        {\n            if (!model.IsValid(out Exception ex))\n                throw ex;\n\n            _repository.SubDbAddTime = DateTime.Now;\n            var entity = _mapper.Map<SubDbUser2Entity>(model);\n            entity.AddTime = DateTime.Now;\n            var result = await _repository.AddAsync(entity, true);\n            if (!result)\n                throw new Exception($\"新增失败\");\n            return entity.UserId;\n        }\n\n        public async Task<UserModel> GetAsync(int userId, bool isMaster = false)\n        {\n            if (userId <= 0)\n                throw new Exception($\"UserId必须大于0\");\n\n            _repository.SubDbAddTime = DateTime.Now;\n            var entity = await _repository.GetAsync(oo => oo.UserId == userId, isMaster: isMaster);\n            return _mapper.Map<UserModel>(entity);\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.User.Application/Services/SubDbUserService.cs",
    "content": "﻿using AutoMapper;\nusing Overt.User.Application.Constracts;\nusing Overt.User.Application.Models;\nusing Overt.User.Domain.Contracts;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Threading.Tasks;\n\nnamespace Overt.User.Application.Services\n{\n    public class SubDbUserService : ISubDbUserService\n    {\n        IMapper _mapper;\n        ISubDbUserRepository _repository;\n        public SubDbUserService(\n            IMapper mapper,\n            ISubDbUserRepository repository)\n        {\n            _mapper = mapper;\n            _repository = repository;\n        }\n\n        public int Add(UserPostModel model)\n        {\n            if (!model.IsValid(out Exception ex))\n                throw ex;\n\n            var entity = _mapper.Map<SubDbUserEntity>(model);\n            entity.AddTime = DateTime.Now;\n            var result = _repository.Add(entity, true);\n            if (!result)\n                throw new Exception($\"新增失败\");\n            return entity.UserId;\n        }\n\n        public UserModel Get(int userId, bool isMaster = false)\n        {\n            if (userId <= 0)\n                throw new Exception($\"UserId必须大于0\");\n\n            var entity = _repository.Get(oo => oo.UserId == userId, isMaster: isMaster);\n            return _mapper.Map<UserModel>(entity);\n        }\n\n        public async Task<int> AddAsync(UserPostModel model)\n        {\n            if (!model.IsValid(out Exception ex))\n                throw ex;\n\n            var entity = _mapper.Map<SubDbUserEntity>(model);\n            entity.AddTime = DateTime.Now;\n            var result = await _repository.AddAsync(entity, true);\n            if (!result)\n                throw new Exception($\"新增失败\");\n            return entity.UserId;\n        }\n\n        public async Task<UserModel> GetAsync(int userId, bool isMaster = false)\n        {\n            if (userId <= 0)\n                throw new Exception($\"UserId必须大于0\");\n\n            var entity = await _repository.GetAsync(oo => oo.UserId == userId, isMaster: isMaster);\n            return _mapper.Map<UserModel>(entity);\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.User.Application/Services/SubUserService.cs",
    "content": "﻿using AutoMapper;\nusing Overt.User.Application.Constracts;\nusing Overt.User.Application.Models;\nusing Overt.User.Domain.Contracts;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Transactions;\n\nnamespace Overt.User.Application.Services\n{\n    public class SubUserService : ISubUserService\n    {\n        IMapper _mapper;\n        ISubUserRepository _repository;\n        public SubUserService(\n            IMapper mapper,\n            ISubUserRepository repository)\n        {\n            _mapper = mapper;\n            _repository = repository;\n        }\n        public int Add(UserPostModel model)\n        {\n            if (!model.IsValid(out Exception ex))\n                throw ex;\n\n            // 分表标识赋值\n            _repository.AddTime = DateTime.Now;\n\n            var entity = _mapper.Map<SubUserEntity>(model);\n            entity.AddTime = DateTime.Now;\n            var result = _repository.Add(entity, true);\n            if (!result)\n                throw new Exception($\"新增失败\");\n            return entity.UserId;\n        }\n\n        public UserModel Get(int userId, bool isMaster = false)\n        {\n            if (userId <= 0)\n                throw new Exception($\"UserId必须大于0\");\n\n            // 分表标识赋值\n            _repository.AddTime = DateTime.Now;\n            var entity = _repository.Get(oo => oo.UserId == userId, isMaster: isMaster);\n            return _mapper.Map<UserModel>(entity);\n        }\n\n        public async Task<int> AddAsync(UserPostModel model)\n        {\n            if (!model.IsValid(out Exception ex))\n                throw ex;\n\n            // 分表标识赋值\n            _repository.AddTime = DateTime.Now;\n\n            var entity = _mapper.Map<SubUserEntity>(model);\n            entity.AddTime = DateTime.Now;\n            var result = await _repository.AddAsync(entity, true);\n            if (!result)\n                throw new Exception($\"新增失败\");\n            return entity.UserId;\n        }\n\n        public async Task<UserModel> GetAsync(int userId, bool isMaster = false)\n        {\n            if (userId <= 0)\n                throw new Exception($\"UserId必须大于0\");\n\n            // 分表标识赋值\n            _repository.AddTime = DateTime.Now;\n            var entity = await _repository.GetAsync(oo => oo.UserId == userId, isMaster: isMaster);\n            return _mapper.Map<UserModel>(entity);\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.User.Application/Services/UserLongIdService.cs",
    "content": "﻿using AutoMapper;\nusing Overt.User.Application.Constracts;\nusing Overt.User.Application.Models;\nusing Overt.User.Domain.Contracts;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace Overt.User.Application.Services\n{\n    public class UserLongIdService : IUserLongIdService\n    {\n        IMapper _mapper;\n        IUserLongIdRepository _userRepository;\n        public UserLongIdService(\n            IMapper mapper,\n            IUserLongIdRepository userRepository)\n        {\n            _mapper = mapper;\n            _userRepository = userRepository;\n        }\n\n        #region SyncMethod\n        public long Add(UserPostModel model)\n        {\n            if (!model.IsValid(out Exception ex))\n                throw ex;\n\n            var entity = _mapper.Map<UserLongIdEntity>(model);\n            entity.AddTime = DateTime.Now;\n            var result = _userRepository.Add(entity, true);\n            if (!result)\n                throw new Exception($\"新增失败\");\n\n            var entity2 = _mapper.Map<UserLongIdEntity>(model);\n            entity2.AddTime = DateTime.Now;\n            var result2 = _userRepository.Add(entity2);\n            if (!result2)\n                throw new Exception($\"新增失败\");\n\n            return entity.UserId;\n        }\n\n        public bool Add(params UserPostModel[] models)\n        {\n            if ((models?.Count() ?? 0) <= 0)\n                throw new Exception(\"必须提供\");\n\n            var entities = _mapper.Map<List<UserLongIdEntity>>(models);\n            entities.ForEach(oo =>\n            {\n                oo.AddTime = DateTime.Now;\n            });\n            var result = _userRepository.Add(entities.ToArray());\n            if (!result)\n                throw new Exception($\"新增失败\");\n            return result;\n        }\n\n        public bool Delete(long userId)\n        {\n            if (userId <= 0)\n                throw new Exception($\"UserId必须大于0\");\n\n            return _userRepository.Delete(oo => oo.UserId == userId);\n        }\n\n        public UserModel Get(long userId, bool isMaster = false)\n        {\n            if (userId <= 0)\n                throw new Exception($\"UserId必须大于0\");\n\n            var entity = _userRepository.Get(oo => oo.UserId == userId, isMaster: isMaster);\n            return _mapper.Map<UserModel>(entity);\n        }\n\n        public List<UserModel> GetList(List<long> userIds, bool isMaster = false)\n        {\n            if ((userIds?.Count ?? 0) <= 0)\n                throw new Exception($\"UserIds至少提供一个\");\n\n            var entities = _userRepository.GetList(1, userIds.Count, oo => userIds.Contains(oo.UserId), isMaster: isMaster);\n            return _mapper.Map<List<UserModel>>(entities);\n        }\n        #endregion\n\n        #region AsyncMethod\n        public async Task<long> AddAsync(UserPostModel model)\n        {\n            if (!model.IsValid(out Exception ex))\n                throw ex;\n\n            var entity = _mapper.Map<UserLongIdEntity>(model);\n            entity.AddTime = DateTime.Now;\n            var result = await _userRepository.AddAsync(entity, true);\n            if (!result)\n                throw new Exception($\"新增失败\");\n            return entity.UserId;\n        }\n\n        public async Task<bool> AddAsync(params UserPostModel[] models)\n        {\n            if ((models?.Count() ?? 0) <= 0)\n                throw new Exception(\"必须提供\");\n\n            var entities = _mapper.Map<List<UserLongIdEntity>>(models);\n            entities.ForEach(oo =>\n            {\n                oo.AddTime = DateTime.Now;\n            });\n            var result = await _userRepository.AddAsync(entities.ToArray());\n            if (!result)\n                throw new Exception($\"新增失败\");\n            return result;\n        }\n\n        public async Task<bool> DeleteAsync(long userId)\n        {\n            if (userId <= 0)\n                throw new Exception($\"UserId必须大于0\");\n\n            return await _userRepository.DeleteAsync(oo => oo.UserId == userId);\n        }\n\n        public async Task<UserModel> GetAsync(long userId, bool isMaster = false)\n        {\n            if (userId <= 0)\n                throw new Exception($\"UserId必须大于0\");\n\n            var entity = await _userRepository.GetAsync(oo => oo.UserId == userId, isMaster: isMaster);\n            return _mapper.Map<UserModel>(entity);\n        }\n\n        public async Task<List<UserModel>> GetListAsync(List<long> userIds, bool isMaster = false)\n        {\n            if ((userIds?.Count ?? 0) <= 0)\n                throw new Exception($\"UserIds至少提供一个\");\n\n            var entities = await _userRepository.GetListAsync(1, userIds.Count, oo => userIds.Contains(oo.UserId), isMaster: isMaster);\n            return _mapper.Map<List<UserModel>>(entities);\n        }\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.User.Application/Services/UserService.cs",
    "content": "﻿using AutoMapper;\nusing Overt.User.Application.Constracts;\nusing Overt.User.Application.Models;\nusing Overt.User.Domain.Contracts;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Transactions;\n\nnamespace Overt.User.Application.Services\n{\n    public class UserService : IUserService\n    {\n        IMapper _mapper;\n        IUserRepository _userRepository;\n        ISubUserRepository _subUserRepository;\n        public UserService(\n            IMapper mapper,\n            IUserRepository userRepository,\n            ISubUserRepository subUserRepository)\n        {\n            _mapper = mapper;\n            _userRepository = userRepository;\n            _subUserRepository = subUserRepository;\n        }\n\n        #region SyncMethod\n        public int Add(UserPostModel model)\n        {\n            if (!model.IsValid(out Exception ex))\n                throw ex;\n\n            var entity = _mapper.Map<UserEntity>(model);\n            entity.AddTime = DateTime.Now;\n            var result = _userRepository.Add(entity, true);\n            if (!result)\n                throw new Exception($\"新增失败\");\n            return entity.UserId;\n        }\n\n        public bool Add(params UserPostModel[] models)\n        {\n            if ((models?.Count() ?? 0) <= 0)\n                throw new Exception(\"必须提供\");\n\n            var entities = _mapper.Map<List<UserEntity>>(models);\n            entities.ForEach(oo =>\n            {\n                oo.AddTime = DateTime.Now;\n            });\n            var result = _userRepository.Add(entities.ToArray());\n            if (!result)\n                throw new Exception($\"新增失败\");\n            return result;\n        }\n\n        public bool Delete(int userId)\n        {\n            if (userId <= 0)\n                throw new Exception($\"UserId必须大于0\");\n\n            return _userRepository.Delete(oo => oo.UserId == userId);\n        }\n\n        public UserModel Get(int userId, bool isMaster = false)\n        {\n            if (userId <= 0)\n                throw new Exception($\"UserId必须大于0\");\n\n            var entity = _userRepository.Get(oo => oo.UserId == userId, isMaster: isMaster);\n            return _mapper.Map<UserModel>(entity);\n        }\n\n        public List<UserModel> GetList(List<int> userIds, bool isMaster = false)\n        {\n            if ((userIds?.Count ?? 0) <= 0)\n                throw new Exception($\"UserIds至少提供一个\");\n\n            var entities = _userRepository.GetList(1, userIds.Count, oo => userIds.Contains(oo.UserId), isMaster: isMaster);\n            return _mapper.Map<List<UserModel>>(entities);\n        }\n\n        public (int, List<UserModel>) GetPage(UserSearchModel model)\n        {\n            var expression = model.GetExpression();\n            var orders = model.GetOrder();\n            var count = _userRepository.Count(expression, model.IsMaster);\n            var entities = _userRepository.GetList(model.Page, model.Size, expression, isMaster: model.IsMaster, orderByFields: orders);\n            var models = _mapper.Map<List<UserModel>>(entities);\n            return (count, models);\n        }\n\n        public List<string> OtherSql()\n        {\n            var result = _userRepository.OtherSql();\n            return result;\n        }\n\n        public bool Update(int userId, bool isSex)\n        {\n            if (userId <= 0)\n                throw new Exception($\"UserId必须大于0\");\n\n            // 第一种\n            var dic = new Dictionary<string, object>()\n            {\n                { nameof(UserEntity.IsSex), isSex }\n            };\n            var updateResult1 = _userRepository.Set(() => dic, oo => oo.UserId == userId);\n\n            // 第二种\n            var updateResult2 = _userRepository.Set(() => new { IsSex = isSex }, oo => oo.UserId == userId);\n\n            // 第三种\n            var entity = _userRepository.Get(oo => oo.UserId == userId, isMaster: true);\n            if (entity?.UserId != userId)\n                throw new Exception($\"无可更新数据\");\n            entity.IsSex = isSex;\n            var updateResult3 = _userRepository.Set(entity);\n\n            // 第三种\n            var updateResult4 = _userRepository.Incr(nameof(UserEntity.Age), 10, oo => oo.UserId == userId);\n\n            return updateResult3;\n        }\n\n        public bool ExecuteInTransaction()\n        {\n            using (var scope = new TransactionScope())\n            {\n                var result = _userRepository.Add(new UserEntity()\n                {\n                    UserName = \"11111111111\",\n                    RealName = \"11111111111\",\n                    Password = \"123456\",\n                    IsSex = false,\n                    JsonValue = \"{}\",\n                    AddTime = DateTime.Now\n                });\n                result &= _subUserRepository.Add(new SubUserEntity()\n                {\n                    UserName = \"222222222\",\n                    RealName = \"22222222\",\n                    Password = \"123456\",\n                    IsSex = false,\n                    JsonValue = \"{}\",\n                    AddTime = DateTime.Now\n                });\n\n                scope.Complete();\n            }\n            //_userRepository.BeginTransaction( transaction =>\n            //{\n            //    // 传递事务\n            //    _subUserRepository.Transaction = transaction;\n\n            //    var result = _userRepository.Add(new UserEntity());\n            //    result &= _subUserRepository.Add(new SubUserEntity());\n\n            //    transaction.Commit();\n            //    return result;\n            //});\n            return true;\n        }\n        #endregion\n\n        #region AsyncMethod\n        public async Task<int> AddAsync(UserPostModel model)\n        {\n            if (!model.IsValid(out Exception ex))\n                throw ex;\n\n            var entity = _mapper.Map<UserEntity>(model);\n            entity.AddTime = DateTime.Now;\n            var result = await _userRepository.AddAsync(entity, true);\n            if (!result)\n                throw new Exception($\"新增失败\");\n            return entity.UserId;\n        }\n\n        public async Task<bool> AddAsync(params UserPostModel[] models)\n        {\n            if ((models?.Count() ?? 0) <= 0)\n                throw new Exception(\"必须提供\");\n\n            var entities = _mapper.Map<List<UserEntity>>(models);\n            entities.ForEach(oo =>\n            {\n                oo.AddTime = DateTime.Now;\n            });\n            var result = await _userRepository.AddAsync(entities.ToArray());\n            if (!result)\n                throw new Exception($\"新增失败\");\n            return result;\n        }\n\n        public async Task<bool> DeleteAsync(int userId)\n        {\n            if (userId <= 0)\n                throw new Exception($\"UserId必须大于0\");\n\n            return await _userRepository.DeleteAsync(oo => oo.UserId == userId);\n        }\n\n        public async Task<UserModel> GetAsync(int userId, bool isMaster = false)\n        {\n            if (userId <= 0)\n                throw new Exception($\"UserId必须大于0\");\n\n            var entity = await _userRepository.GetAsync(oo => oo.UserId == userId, isMaster: isMaster);\n            return _mapper.Map<UserModel>(entity);\n        }\n\n        public async Task<List<UserModel>> GetListAsync(List<int> userIds, bool isMaster = false)\n        {\n            if ((userIds?.Count ?? 0) <= 0)\n                throw new Exception($\"UserIds至少提供一个\");\n\n            var entities = await _userRepository.GetListAsync(1, userIds.Count, oo => userIds.Contains(oo.UserId), isMaster: isMaster);\n            return _mapper.Map<List<UserModel>>(entities);\n        }\n\n        public async Task<(int, List<UserModel>)> GetPageAsync(UserSearchModel model)\n        {\n            var expression = model.GetExpression();\n            var orders = model.GetOrder();\n            var count = await _userRepository.CountAsync(expression, model.IsMaster);\n            var entities = await _userRepository.GetListAsync(model.Page, model.Size, expression, isMaster: model.IsMaster, orderByFields: orders);\n            var models = _mapper.Map<List<UserModel>>(entities);\n            return (count, models);\n        }\n\n        public async Task<List<string>> OtherSqlAsync()\n        {\n            var result = await _userRepository.OtherSqlAsync();\n            return result;\n        }\n\n        public async Task<bool> UpdateAsync(int userId, bool isSex)\n        {\n            if (userId <= 0)\n                throw new Exception($\"UserId必须大于0\");\n\n            // 第一种\n            var dic = new Dictionary<string, object>()\n            {\n                { nameof(UserEntity.IsSex), isSex }\n            };\n            var updateResult1 = await _userRepository.SetAsync(() => dic, oo => oo.UserId == userId);\n\n            // 第二种\n            var updateResult2 = await _userRepository.SetAsync(() => new { IsSex = isSex }, oo => oo.UserId == userId);\n\n            // 第三种\n            var entity = await _userRepository.GetAsync(oo => oo.UserId == userId, isMaster: true);\n            if (entity?.UserId != userId)\n                throw new Exception($\"无可更新数据\");\n            entity.IsSex = !isSex;\n            entity.AddTime = new DateTime(2021, 1, 1);\n            entity.UserName = \"我是谁\";\n            var updateResult3 = await _userRepository.SetAsync(entity);\n\n            // 第三种\n            var updateResult4 = await _userRepository.IncrAsync(nameof(UserEntity.Age), 10, oo => oo.UserId == userId);\n\n            return updateResult3;\n        }\n\n        public async Task<bool> ExecuteInTransactionAsync()\n        {\n            using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))\n            {\n                var result = await _userRepository.AddAsync(new UserEntity()\n                {\n                    UserName = \"11111111111\",\n                    RealName = \"11111111111\",\n                    Password = \"123456\",\n                    IsSex = false,\n                    JsonValue = \"{}\",\n                    AddTime = DateTime.Now\n                });\n                result &= await _subUserRepository.AddAsync(new SubUserEntity()\n                {\n                    UserName = \"222222222\",\n                    RealName = \"22222222\",\n                    Password = \"123456\",\n                    IsSex = false,\n                    JsonValue = \"{}\",\n                    AddTime = DateTime.Now\n                });\n\n                scope.Complete();\n            }\n            //await _userRepository.BeginTransactionAsync(async transaction =>\n            //{\n            //    // 传递事务\n            //    _subUserRepository.Transaction = transaction;\n\n            //    var result = await _userRepository.AddAsync(new UserEntity());\n            //    result &= await _subUserRepository.AddAsync(new SubUserEntity());\n\n            //    transaction.Commit();\n            //    return result;\n            //});\n            return true;\n        }\n        #endregion\n\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.User.Domain/Contracts/ISubDbUser2Repository.cs",
    "content": "﻿using Overt.Core.Data;\nusing Overt.User.Domain.Entities;\nusing System;\n\nnamespace Overt.User.Domain.Contracts\n{\n    public interface ISubDbUser2Repository : IBaseRepository<SubDbUser2Entity>\n    {\n        /// <summary>\n        /// 分库标识\n        /// </summary>\n        DateTime SubDbAddTime { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.User.Domain/Contracts/ISubDbUserRepository.cs",
    "content": "﻿using Overt.Core.Data;\nusing Overt.User.Domain.Entities;\n\nnamespace Overt.User.Domain.Contracts\n{\n    public interface ISubDbUserRepository : IBaseRepository<SubDbUserEntity>\n    {\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.User.Domain/Contracts/ISubUserRepository.cs",
    "content": "﻿using Overt.Core.Data;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Overt.User.Domain.Contracts\n{\n    public interface ISubUserRepository : IBaseRepository<SubUserEntity>\n    {\n        /// <summary>\n        /// 分表标识 第二种\n        /// 第一种为HASH模式，实体标记Submeter\n        /// </summary>\n        DateTime AddTime { get; set; }\n             \n    }\n}\n"
  },
  {
    "path": "src/core/Overt.User.Domain/Contracts/IUserLongIdRepository.cs",
    "content": "﻿using Overt.Core.Data;\nusing Overt.User.Domain.Entities;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nnamespace Overt.User.Domain.Contracts\n{\n    public interface IUserLongIdRepository : IBaseRepository<UserLongIdEntity>\n    {\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.User.Domain/Contracts/IUserRepository.cs",
    "content": "﻿using Overt.Core.Data;\nusing Overt.User.Domain.Entities;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\n\nnamespace Overt.User.Domain.Contracts\n{\n    public interface IUserRepository : IBaseRepository<UserEntity>\n    {\n        /// <summary>\n        /// 其他sql 本案例中 统计UserName去重个数\n        /// </summary>\n        /// <returns></returns>\n        List<string> OtherSql();\n\n        /// <summary>\n        /// 其他sql 本案例中 统计UserName去重个数\n        /// </summary>\n        /// <returns></returns>\n        Task<List<string>> OtherSqlAsync();\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.User.Domain/Entities/SubDbUser2Entity.cs",
    "content": "﻿using Overt.Core.Data;\nusing System;\nusing System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\n\nnamespace Overt.User.Domain.Entities\n{\n    [Table(\"User\")]\n    public class SubDbUser2Entity\n    {\n        // 第一种分表标识，Md5(UserId)取{Bit}位 尽量不用，使用自定义模式\n        //[Submeter(Bit = 2)]\n        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]\n        public int UserId { get; set; }\n        public string UserName { get; set; }\n        public string RealName { get; set; }\n        public string Password { get; set; }\n        public DateTime AddTime { get; set; }\n        public bool IsSex { get; set; }\n        /// <summary>\n        /// \n        /// </summary>\n        public int Age { get; set; }\n        /// <summary>\n        /// Json类型\n        /// </summary>\n        public string JsonValue { get; set; }\n    }\n\n}\n"
  },
  {
    "path": "src/core/Overt.User.Domain/Entities/SubDbUserEntity.cs",
    "content": "﻿using Overt.Core.Data;\nusing System;\nusing System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\n\nnamespace Overt.User.Domain.Entities\n{\n    [Table(\"User\")]\n    public class SubDbUserEntity\n    {\n        // 第一种分表标识，Md5(UserId)取{Bit}位 尽量不用，使用自定义模式\n        //[Submeter(Bit = 2)]\n        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]\n        public int UserId { get; set; }\n        public string UserName { get; set; }\n        public string RealName { get; set; }\n        public string Password { get; set; }\n        public DateTime AddTime { get; set; }\n        public bool IsSex { get; set; }\n        /// <summary>\n        /// \n        /// </summary>\n        public int Age { get; set; }\n        /// <summary>\n        /// Json类型\n        /// </summary>\n        public string JsonValue { get; set; }\n    }\n\n}\n"
  },
  {
    "path": "src/core/Overt.User.Domain/Entities/SubUserEntity.cs",
    "content": "﻿using Overt.Core.Data;\nusing System;\nusing System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\n\nnamespace Overt.User.Domain.Entities\n{\n    [Table(\"User\")]\n    public class SubUserEntity\n    {\n        // 第一种分表标识，Md5(UserId)取{Bit}位 尽量不用，使用自定义模式\n        //[Submeter(Bit = 2)]\n        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]\n        public int UserId { get; set; }\n        public string UserName { get; set; }\n        public string RealName { get; set; }\n        public string Password { get; set; }\n        public DateTime AddTime { get; set; }\n        public bool IsSex { get; set; }\n        /// <summary>\n        /// \n        /// </summary>\n        public int Age { get; set; }\n        /// <summary>\n        /// Json类型\n        /// </summary>\n        public string JsonValue { get; set; }\n    }\n\n}\n"
  },
  {
    "path": "src/core/Overt.User.Domain/Entities/UserEntity.cs",
    "content": "﻿using Overt.Core.Data;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\nusing System.Text;\n\nnamespace Overt.User.Domain.Entities\n{\n    [Table(\"User\")]\n    public class UserEntity\n    {\n        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]\n        public int UserId { get; set; }\n\n        public string UserName { get; set; }\n        public string RealName { get; set; }\n        public string Password { get; set; }\n        public DateTime AddTime { get; set; }\n        public bool IsSex { get; set; }\n        /// <summary>\n        /// \n        /// </summary>\n        public int Age { get; set; }\n        /// <summary>\n        /// Json类型\n        /// </summary>\n        public string JsonValue { get; set; }\n    }\n\n}\n"
  },
  {
    "path": "src/core/Overt.User.Domain/Entities/UserLongIdEntity.cs",
    "content": "﻿using Overt.Core.Data;\nusing System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\nusing System.Text;\n\nnamespace Overt.User.Domain.Entities\n{\n    [Table(\"UserLongId\")]\n    public class UserLongIdEntity\n    {\n        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]\n        public long UserId { get; set; }\n\n        public string UserName { get; set; }\n        public string RealName { get; set; }\n        public string Password { get; set; }\n        public DateTime AddTime { get; set; }\n        public bool IsSex { get; set; }\n        /// <summary>\n        /// \n        /// </summary>\n        public int Age { get; set; }\n        /// <summary>\n        /// Json类型\n        /// </summary>\n        public string JsonValue { get; set; }\n    }\n\n}\n"
  },
  {
    "path": "src/core/Overt.User.Domain/Overt.User.Domain.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>netcoreapp2.0</TargetFramework>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Extensions.DependencyInjection\" Version=\"2.0.0\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\Overt.Core.Data\\Overt.Core.Data.csproj\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/core/Overt.User.Domain/Repositories/SubDbUser2Repository.cs",
    "content": "﻿using Overt.Core.Data;\nusing Overt.User.Domain.Contracts;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing Dapper;\nusing System.Linq;\nusing Microsoft.Extensions.Configuration;\n\nnamespace Overt.User.Domain.Repositories\n{\n    public class SubDbUser2Repository : BaseRepository<SubDbUser2Entity>, ISubDbUser2Repository\n    {\n        public SubDbUser2Repository(IConfiguration configuration)\n            : base(configuration)\n        {\n        }\n\n\n        // Service层进行赋值即可\n        public DateTime SubDbAddTime { get; set; }\n\n        public override Func<bool, string> ConnectionFunc => (isMaster) =>\n        {\n            var connectionString = string.Empty;\n\n            var dbName = $\"TestDb_{SubDbAddTime.ToString(\"yyyy\")}\";\n            if (isMaster)\n                connectionString = $\"Data Source=127.0.0.1;Initial Catalog={dbName};Persist Security Info=True;User ID=sa;Password=123465;DbType=SqlServer\";\n            else\n                connectionString = $\"Data Source=127.0.0.1;Initial Catalog={dbName};Persist Security Info=True;User ID=sa;Password=123465;DbType=SqlServer\";\n            return connectionString;\n        };\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.User.Domain/Repositories/SubDbUserRepository.cs",
    "content": "﻿using Overt.Core.Data;\nusing Overt.User.Domain.Contracts;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing Dapper;\nusing System.Linq;\nusing Microsoft.Extensions.Configuration;\n\nnamespace Overt.User.Domain.Repositories\n{\n    public class SubDbUserRepository : BaseRepository<SubDbUserEntity>, ISubDbUserRepository\n    {\n        public SubDbUserRepository(IConfiguration configuration)\n            : base(configuration, \"subdb\")\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.User.Domain/Repositories/SubUserRepository.cs",
    "content": "﻿using Overt.Core.Data;\nusing Overt.User.Domain.Contracts;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing Dapper;\nusing System.Linq;\nusing Microsoft.Extensions.Configuration;\n\nnamespace Overt.User.Domain.Repositories\n{\n    public class SubUserRepository : BaseRepository<SubUserEntity>, ISubUserRepository\n    {\n        public SubUserRepository(IConfiguration configuration) : base(configuration)\n        {\n        }\n\n        // Service层进行赋值即可\n        public DateTime AddTime { get; set; }\n\n        public override Func<string> TableNameFunc => () =>\n        {\n            var tableName = $\"{GetMainTableName()}_{AddTime.ToString(\"yyyyMMdd\")}\";\n            return tableName;\n        };\n\n        public override Func<string, string> CreateScriptFunc => (tableName) =>\n        {\n            return $\"CREATE TABLE [{tableName}] (\" +\n                    \"  [UserId] int  IDENTITY(1,1) NOT NULL,\" +\n                    \"  [UserName] varchar(200) COLLATE Chinese_PRC_CI_AS DEFAULT NULL NULL,\" +\n                    \"  [Password] varchar(200) COLLATE Chinese_PRC_CI_AS DEFAULT NULL NULL,\" +\n                    \"  [RealName] varchar(200) COLLATE Chinese_PRC_CI_AS DEFAULT NULL NULL,\" +\n                    \"  [AddTime] datetime DEFAULT NULL NULL,\" +\n                    \"  [IsSex] bit DEFAULT NULL NULL,\" +\n                    \"  [Age] int DEFAULT 0 NOT NULL,\" +\n                    \"  [JsonValue] varchar(1000) COLLATE Chinese_PRC_CI_AS DEFAULT NULL NULL\" +\n                    \") \";\n        };\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.User.Domain/Repositories/UserLongIdRepository.cs",
    "content": "﻿using Overt.Core.Data;\nusing Overt.User.Domain.Contracts;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing Dapper;\nusing System.Linq;\nusing Microsoft.Extensions.Configuration;\n\nnamespace Overt.User.Domain.Repositories\n{\n    public class UserLongIdRepository : BaseRepository<UserLongIdEntity>, IUserLongIdRepository\n    {\n        public UserLongIdRepository(IConfiguration configuration)\n            : base(configuration) // dbStoreKey 可用于不同数据库切换，连接字符串key前缀：xxx.master xxx.secondary\n        {\n        }\n\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.User.Domain/Repositories/UserRepository.cs",
    "content": "﻿using Overt.Core.Data;\nusing Overt.User.Domain.Contracts;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing Dapper;\nusing System.Linq;\nusing Microsoft.Extensions.Configuration;\n\nnamespace Overt.User.Domain.Repositories\n{\n    public class UserRepository : BaseRepository<UserEntity>, IUserRepository\n    {\n        public UserRepository(IConfiguration configuration)\n            : base(configuration) // dbStoreKey 可用于不同数据库切换，连接字符串key前缀：xxx.master xxx.secondary\n        {\n        }\n\n        public List<string> OtherSql()\n        {\n            // 表名最好使用这个方法获取，支持分表，分表案例详见其他案例\n            var tableName = GetTableName();\n            var sql = $\"select distinct([UserName]) from [{tableName}]\";\n            return Execute(connecdtion =>\n          {\n              var task = connecdtion.Query<string>(sql);\n              return task.ToList();\n          });\n        }\n\n        public async Task<List<string>> OtherSqlAsync()\n        {\n            // 表名最好使用这个方法获取，支持分表，分表案例详见其他案例\n            var tableName = GetTableName();\n            var sql = $\"select distinct([UserName]) from [{tableName}]\";\n            return await Execute(async connecdtion =>\n            {\n                var task = await connecdtion.QueryAsync<string>(sql);\n                return task.ToList();\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "src/core/Overt.User.Domain/ServiceCollectionExtensions.cs",
    "content": "﻿using Microsoft.Extensions.DependencyInjection;\nusing Overt.User.Domain.Contracts;\nusing Overt.User.Domain.Repositories;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace Overt.User.Domain\n{\n    public static class ServiceCollectionExtensions\n    {\n        public static void AddDomainDI(this IServiceCollection services)\n        {\n            services.AddTransient<IUserRepository, UserRepository>();\n            services.AddTransient<ISubUserRepository, SubUserRepository>();\n            services.AddTransient<ISubDbUserRepository, SubDbUserRepository>();\n            services.AddTransient<ISubDbUser2Repository, SubDbUser2Repository>();\n            services.AddTransient<IUserLongIdRepository, UserLongIdRepository>();\n        }\n    }\n}\n"
  },
  {
    "path": "src/net46/Overt.Core.DataConsole/App.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <configSections>\n    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->\n    <section name=\"entityFramework\" type=\"System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" requirePermission=\"false\"/>\n  </configSections>\n  <startup>\n    <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.6.2\"/>\n  </startup>\n  <connectionStrings>\n    <add name=\"master\" connectionString=\"Server=127.0.0.1;Database=TestDb;uid=sa;password=123456;\" providerName=\"System.Data.SqlClient\"/>\n    <add name=\"secondary\" connectionString=\"Server=127.0.0.1;Database=TestDb;uid=sa;password=123456;\" providerName=\"System.Data.SqlClient\"/>\n    <add name=\"subdb.master\" connectionString=\"Server=127.0.0.1;Database=TestDb;uid=sa;password=123456;\" providerName=\"System.Data.SqlClient\"/>\n    <add name=\"subdb.secondary\" connectionString=\"Server=127.0.0.1;Database=TestDb;uid=sa;password=123456;\" providerName=\"System.Data.SqlClient\"/>\n    \n    <add name=\"mysql.master\" connectionString=\"Server=127.0.0.1;Database=TestDb;uid=sa;password=123456;\" providerName=\"MySql.Data.MySqlClient\"/>\n    <add name=\"sqlite.master\" connectionString=\"Data Source=E:\\\\SQLiteDb\\\\chat.db;\" providerName=\"System.Data.SQLite\" />\n    <add name=\"ss.master\" connectionString=\"Server=127.0.0.1;Database=TestDb;uid=sa;password=123456;\" providerName=\"System.Data.SqlClient\"/>\n  </connectionStrings>\n  <entityFramework>\n    <defaultConnectionFactory type=\"System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework\"/>\n    <providers>\n      <provider invariantName=\"System.Data.SqlClient\" type=\"System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer\"/>\n      <provider invariantName=\"System.Data.SQLite.EF6\" type=\"System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6\"/>\n    </providers>\n  </entityFramework>\n  <system.data>\n    <DbProviderFactories>\n      <remove invariant=\"System.Data.SQLite.EF6\"/>\n      <add name=\"SQLite Data Provider (Entity Framework 6)\" invariant=\"System.Data.SQLite.EF6\" description=\".NET Framework Data Provider for SQLite (Entity Framework 6)\" type=\"System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6\"/>\n      <remove invariant=\"System.Data.SQLite\"/>\n      <add name=\"SQLite Data Provider\" invariant=\"System.Data.SQLite\" description=\".NET Framework Data Provider for SQLite\" type=\"System.Data.SQLite.SQLiteFactory, System.Data.SQLite\"/>\n    </DbProviderFactories>\n  </system.data>\n</configuration>\n"
  },
  {
    "path": "src/net46/Overt.Core.DataConsole/AutofacContainer.cs",
    "content": "﻿using Autofac;\nusing AutoMapper;\nusing Overt.User.Application;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Overt.Core.DataConsole\n{\n    public class AutofacContainer\n    {\n        public static IContainer Container { get; private set; }\n\n        public static IContainer Register()\n        {\n            var builder = new ContainerBuilder();\n            builder.AddApplicationDI();\n\n\n            builder.RegisterType<AutoMapperProfiles>().As<Profile>();\n            builder.Register(c => new MapperConfiguration(cfg =>\n            {\n                foreach (var profile in c.Resolve<IEnumerable<Profile>>())\n                {\n                    cfg.AddProfile(profile);\n                }\n            })).AsSelf().SingleInstance();\n            builder.Register(c => c.Resolve<MapperConfiguration>().CreateMapper(c.Resolve)).As<IMapper>().InstancePerLifetimeScope();\n\n            Container = builder.Build(Autofac.Builder.ContainerBuildOptions.None);\n            return Container;\n        }\n    }\n}\n"
  },
  {
    "path": "src/net46/Overt.Core.DataConsole/Overt.Core.DataConsole.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"..\\..\\..\\packages\\EntityFramework.6.3.0\\build\\EntityFramework.props\" Condition=\"Exists('..\\..\\..\\packages\\EntityFramework.6.3.0\\build\\EntityFramework.props')\" />\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{F92F116B-A438-447B-9475-4D62AF197742}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <RootNamespace>Overt.Core.DataConsole</RootNamespace>\n    <AssemblyName>Overt.Core.DataConsole</AssemblyName>\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n    <Deterministic>true</Deterministic>\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Autofac, Version=4.8.1.0, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\..\\packages\\Autofac.4.8.1\\lib\\net45\\Autofac.dll</HintPath>\n    </Reference>\n    <Reference Include=\"AutoMapper, Version=9.0.0.0, Culture=neutral, PublicKeyToken=be96cd2c38ef1005, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\..\\packages\\AutoMapper.9.0.0\\lib\\net461\\AutoMapper.dll</HintPath>\n    </Reference>\n    <Reference Include=\"EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\..\\packages\\EntityFramework.6.3.0\\lib\\net45\\EntityFramework.dll</HintPath>\n    </Reference>\n    <Reference Include=\"EntityFramework.SqlServer, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\..\\packages\\EntityFramework.6.3.0\\lib\\net45\\EntityFramework.SqlServer.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Data.SQLite, Version=1.0.113.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\..\\packages\\Stub.System.Data.SQLite.Core.NetFramework.1.0.113.3\\lib\\net46\\System.Data.SQLite.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Data.SQLite.EF6, Version=1.0.113.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\..\\packages\\System.Data.SQLite.EF6.1.0.113.0\\lib\\net46\\System.Data.SQLite.EF6.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.Data.SQLite.Linq, Version=1.0.113.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\..\\packages\\System.Data.SQLite.Linq.1.0.113.0\\lib\\net46\\System.Data.SQLite.Linq.dll</HintPath>\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\..\\packages\\System.ValueTuple.4.5.0\\lib\\net461\\System.ValueTuple.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"AutofacContainer.cs\" />\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"App.txt\" />\n    <None Include=\"App.config\" />\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\Overt.Core.Data\\Overt.Core.Data.csproj\">\n      <Project>{8b1b556f-1d2c-49d2-8cb9-f9d2c7080786}</Project>\n      <Name>Overt.Core.Data</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\Overt.User.Application\\Overt.User.Application.csproj\">\n      <Project>{5adb2a33-42e4-484b-997e-3f8b942539e4}</Project>\n      <Name>Overt.User.Application</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\Overt.User.Domain\\Overt.User.Domain.csproj\">\n      <Project>{F34F6B13-B939-47A3-827E-E7015FD1B434}</Project>\n      <Name>Overt.User.Domain</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <Target Name=\"EnsureNuGetPackageBuildImports\" BeforeTargets=\"PrepareForBuild\">\n    <PropertyGroup>\n      <ErrorText>这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息，请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。</ErrorText>\n    </PropertyGroup>\n    <Error Condition=\"!Exists('..\\..\\..\\packages\\EntityFramework.6.3.0\\build\\EntityFramework.props')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\..\\..\\packages\\EntityFramework.6.3.0\\build\\EntityFramework.props'))\" />\n    <Error Condition=\"!Exists('..\\..\\..\\packages\\EntityFramework.6.3.0\\build\\EntityFramework.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\..\\..\\packages\\EntityFramework.6.3.0\\build\\EntityFramework.targets'))\" />\n    <Error Condition=\"!Exists('..\\..\\..\\packages\\Stub.System.Data.SQLite.Core.NetFramework.1.0.113.3\\build\\net46\\Stub.System.Data.SQLite.Core.NetFramework.targets')\" Text=\"$([System.String]::Format('$(ErrorText)', '..\\..\\..\\packages\\Stub.System.Data.SQLite.Core.NetFramework.1.0.113.3\\build\\net46\\Stub.System.Data.SQLite.Core.NetFramework.targets'))\" />\n  </Target>\n  <Import Project=\"..\\..\\..\\packages\\EntityFramework.6.3.0\\build\\EntityFramework.targets\" Condition=\"Exists('..\\..\\..\\packages\\EntityFramework.6.3.0\\build\\EntityFramework.targets')\" />\n  <Import Project=\"..\\..\\..\\packages\\Stub.System.Data.SQLite.Core.NetFramework.1.0.113.3\\build\\net46\\Stub.System.Data.SQLite.Core.NetFramework.targets\" Condition=\"Exists('..\\..\\..\\packages\\Stub.System.Data.SQLite.Core.NetFramework.1.0.113.3\\build\\net46\\Stub.System.Data.SQLite.Core.NetFramework.targets')\" />\n</Project>"
  },
  {
    "path": "src/net46/Overt.Core.DataConsole/Program.cs",
    "content": "﻿using Overt.User.Application.Constracts;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing Autofac;\n\nnamespace Overt.Core.DataConsole\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            // autofac\n            AutofacContainer.Register();\n            \n            #region 单表\n            var _userService = AutofacContainer.Container.Resolve<IUserService>();\n\n            // 新增\n            var userId = _userService.AddAsync(new User.Application.Models.UserPostModel()\n            {\n                UserName = \"TEST1\",\n                RealName = \"TEST1\",\n                Password = \"123456\",\n                IsSex = false,\n                JsonValue = \"{}\"\n            }).Result;\n\n            // 修改\n            var setResult = _userService.UpdateAsync(userId, true).Result;\n\n            // 单条查询\n            var getResult = _userService.GetAsync(userId).Result;\n\n            // 多条查询\n            var listResult = _userService.GetListAsync(new List<int>() { userId }).Result;\n\n            // 分页查询\n            var pageResult = _userService.GetPageAsync(new User.Application.Models.UserSearchModel()\n            {\n                Page = 1,\n                Size = 10,\n                UserIds = new List<int> { userId }\n            }).Result;\n\n            // 自定义SQL\n            var otherResult = _userService.OtherSqlAsync().Result;\n\n            // 删除\n            var delResult = _userService.DeleteAsync(userId).Result;\n\n            // ... 其他更多用法详见Readme，可有很多组合方式，并不局限于目前案例所示\n            #endregion\n\n            #region 分表\n            var _subUserService = AutofacContainer.Container.Resolve<ISubUserService>();\n\n            // 添加\n            var addResult1 = _subUserService.AddAsync(new User.Application.Models.UserPostModel()\n            {\n                UserName = \"TEST_Sub\",\n                RealName = \"TEST_Sub\",\n                Password = \"123456\",\n                IsSex = false,\n                JsonValue = \"{}\"\n            }).Result;\n\n            // 获取\n            var getResult1 = _subUserService.GetAsync(addResult1).Result;\n            #endregion\n\n            #region 分库\n            var _subDbUserService = AutofacContainer.Container.Resolve<ISubDbUserService>();\n\n            // 添加\n            var addResult2 = _subDbUserService.AddAsync(new User.Application.Models.UserPostModel()\n            {\n                UserName = \"TEST_SubDb\",\n                RealName = \"TEST_SubDb\",\n                Password = \"123456\",\n                IsSex = false,\n                JsonValue = \"{}\"\n            }).Result;\n\n            // 获取\n            var getResult2 = _subDbUserService.GetAsync(addResult2).Result;\n            #endregion\n\n            #region 分库2\n            var _subDbUser2Service = AutofacContainer.Container.Resolve<ISubDbUser2Service>();\n\n            // 添加\n            var addResult3 = _subDbUser2Service.AddAsync(new User.Application.Models.UserPostModel()\n            {\n                UserName = \"TEST_SubDb\",\n                RealName = \"TEST_SubDb\",\n                Password = \"123456\",\n                IsSex = false,\n                JsonValue = \"{}\"\n            }).Result;\n\n            // 获取\n            var getResult3 = _subDbUser2Service.GetAsync(addResult3).Result;\n            #endregion\n\n            #region 事务\n            var transResult = _userService.ExecuteInTransactionAsync().Result;\n            #endregion\n        }\n    }\n}\n"
  },
  {
    "path": "src/net46/Overt.Core.DataConsole/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// 有关程序集的一般信息由以下\n// 控制。更改这些特性值可修改\n// 与程序集关联的信息。\n[assembly: AssemblyTitle(\"Overt.Core.DataConsole\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"Microsoft\")]\n[assembly: AssemblyProduct(\"Overt.Core.DataConsole\")]\n[assembly: AssemblyCopyright(\"Copyright © Microsoft 2018\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// 将 ComVisible 设置为 false 会使此程序集中的类型\n//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型\n//请将此类型的 ComVisible 特性设置为 true。\n[assembly: ComVisible(false)]\n\n// 如果此项目向 COM 公开，则下列 GUID 用于类型库的 ID\n[assembly: Guid(\"f92f116b-a438-447b-9475-4d62af197742\")]\n\n// 程序集的版本信息由下列四个值组成: \n//\n//      主版本\n//      次版本\n//      生成号\n//      修订号\n//\n// 可以指定所有值，也可以使用以下所示的 \"*\" 预置版本号和修订号\n// 方法是按如下所示使用“*”: :\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "src/net46/Overt.Core.DataConsole/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Autofac\" version=\"4.8.1\" targetFramework=\"net46\" />\n  <package id=\"AutoMapper\" version=\"9.0.0\" targetFramework=\"net462\" />\n  <package id=\"EntityFramework\" version=\"6.3.0\" targetFramework=\"net462\" />\n  <package id=\"Stub.System.Data.SQLite.Core.NetFramework\" version=\"1.0.113.3\" targetFramework=\"net462\" />\n  <package id=\"System.Data.SQLite\" version=\"1.0.113.7\" targetFramework=\"net462\" />\n  <package id=\"System.Data.SQLite.Core\" version=\"1.0.113.7\" targetFramework=\"net462\" />\n  <package id=\"System.Data.SQLite.EF6\" version=\"1.0.113.0\" targetFramework=\"net462\" />\n  <package id=\"System.Data.SQLite.Linq\" version=\"1.0.113.0\" targetFramework=\"net462\" />\n  <package id=\"System.ValueTuple\" version=\"4.5.0\" targetFramework=\"net462\" />\n</packages>"
  },
  {
    "path": "src/net46/Overt.User.Application/AutoMapperProfiles.cs",
    "content": "﻿using AutoMapper;\nusing Overt.User.Application.Models;\nusing Overt.User.Domain.Entities;\n\nnamespace Overt.User.Application\n{\n    public class AutoMapperProfiles : Profile\n    {\n        public AutoMapperProfiles()\n        {\n            #region Input\n            CreateMap<UserPostModel, UserEntity>();\n            CreateMap<UserPostModel, SubUserEntity>();\n            CreateMap<UserPostModel, SubDbUserEntity>();\n            CreateMap<UserPostModel, SubDbUser2Entity>();\n            #endregion\n\n            #region Output\n            CreateMap<UserEntity,UserModel>();\n            CreateMap<SubUserEntity, UserModel>();\n            CreateMap<SubDbUserEntity, UserModel>();\n            CreateMap<SubDbUser2Entity, UserModel>();\n            #endregion\n        }\n    }\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Application/AutofacExtensions.cs",
    "content": "﻿using Autofac;\nusing Overt.User.Application.Constracts;\nusing Overt.User.Application.Services;\nusing Overt.User.Domain;\n\nnamespace Overt.User.Application\n{\n    public static class AutofacExtensions\n    {\n        public static void AddApplicationDI(this ContainerBuilder builder)\n        {\n            builder.RegisterType<UserService>().As<IUserService>();\n            builder.RegisterType<SubUserService>().As<ISubUserService>();\n            builder.RegisterType<SubDbUserService>().As<ISubDbUserService>();\n            builder.RegisterType<SubDbUser2Service>().As<ISubDbUser2Service>();\n\n            builder.AddDomainDI();\n        }\n    }\n}"
  },
  {
    "path": "src/net46/Overt.User.Application/Constracts/ISubDbUser2Service.cs",
    "content": "﻿using Overt.User.Application.Models;\nusing System.Threading.Tasks;\n\nnamespace Overt.User.Application.Constracts\n{\n    public interface ISubDbUser2Service\n    {\n        int Add(UserPostModel model);\n        UserModel Get(int userId, bool isMaster = false);\n\n        Task<int> AddAsync(UserPostModel model);\n\n        Task<UserModel> GetAsync(int userId, bool isMaster = false);\n    }\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Application/Constracts/ISubDbUserService.cs",
    "content": "﻿using Overt.User.Application.Models;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Overt.User.Application.Constracts\n{\n    public interface ISubDbUserService\n    {\n        Task<int> AddAsync(UserPostModel model);\n\n        Task<UserModel> GetAsync(int userId, bool isMaster = false);\n    }\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Application/Constracts/ISubUserService.cs",
    "content": "﻿using Overt.User.Application.Models;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Overt.User.Application.Constracts\n{\n    public interface ISubUserService\n    {\n        Task<int> AddAsync(UserPostModel model);\n\n        Task<UserModel> GetAsync(int userId, bool isMaster = false);\n    }\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Application/Constracts/IUserService.cs",
    "content": "﻿using Overt.User.Application.Models;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Overt.User.Application.Constracts\n{\n    public interface IUserService\n    {\n        Task<UserModel> GetAsync(int userId, bool isMaster = false);\n\n        Task<List<UserModel>> GetListAsync(List<int> userIds, bool isMaster = false);\n\n        Task<(int, List<UserModel>)> GetPageAsync(UserSearchModel model);\n\n        Task<int> AddAsync(UserPostModel model);\n\n        Task<bool> UpdateAsync(int userId, bool isSex);\n\n        Task<bool> DeleteAsync(int userId);\n\n        Task<List<string>> OtherSqlAsync();\n\n        Task<bool> ExecuteInTransactionAsync();\n    }\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Application/Extensions/ModelValidationExtensions.cs",
    "content": "﻿using System;\nusing System.ComponentModel.DataAnnotations;\nusing System.Linq;\n\nnamespace Overt.User.Application\n{\n    public static class ModelValidationExtensions\n    {\n        public static bool IsValid(this object obj,out Exception exception)\n        {\n            exception = null;\n\n            if(obj == null)\n            {\n                exception = new ArgumentNullException();\n                return false;\n            }\n\n            var context = new ValidationContext(obj);\n            var result = Validate(context);\n            if (result == null)\n                return true;\n\n            exception = new Exception(result.ErrorMessage);\n            return false;\n        }\n\n        private static ValidationResult Validate(ValidationContext context)\n        {\n            var properties = context.ObjectType.GetProperties();\n\n            if (context.ObjectInstance is IValidatableObject)\n            {\n                IValidatableObject valid = (IValidatableObject)context.ObjectInstance;\n                var validationResults = valid.Validate(context);\n                if (validationResults != null && validationResults.Count() > 0)\n                {\n                    return valid.Validate(context).FirstOrDefault();\n                }\n            }\n\n            foreach (var property in properties)\n            {\n                var validationAttributes = property.GetCustomAttributes(false).OfType<ValidationAttribute>();\n                foreach (var attribute in validationAttributes)\n                {\n                    bool isValid = attribute.IsValid(property.GetValue(context.ObjectInstance));\n                    if (!isValid)\n                    {\n                        return new ValidationResult(attribute.ErrorMessage, new[] { property.Name });\n                    }\n                }\n            }\n\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Application/Models/UserModel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\nusing System.Text;\n\nnamespace Overt.User.Application.Models\n{\n    public class UserModel\n    {\n        public int UserId { get; set; }\n        public string UserName { get; set; }\n        public string RealName { get; set; }\n        public string Password { get; set; }\n        public DateTime AddTime { get; set; }\n        public bool IsSex { get; set; }\n        /// <summary>\n        /// Json类型\n        /// </summary>\n        public string JsonValue { get; set; }\n    }\n\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Application/Models/UserPostModel.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Overt.User.Application.Models\n{\n    public class UserPostModel : IValidatableObject\n    {\n        public string UserName { get; set; }\n        public string RealName { get; set; }\n        public string Password { get; set; }\n        public DateTime AddTime { get; set; }\n        public bool IsSex { get; set; }\n        /// <summary>\n        /// Json类型\n        /// </summary>\n        public string JsonValue { get; set; }\n\n\n        /// <summary>\n        /// 验证方法\n        /// </summary>\n        /// <param name=\"validationContext\"></param>\n        /// <returns></returns>\n        public virtual IEnumerable<ValidationResult> Validate(ValidationContext validationContext)\n        {\n            if (string.IsNullOrWhiteSpace(UserName))\n                yield return new ValidationResult(\"用户名必须提供\", new[] { nameof(UserName) });\n\n            if (string.IsNullOrWhiteSpace(Password))\n                yield return new ValidationResult(\"密码必须提供\", new[] { nameof(Password) });\n        }\n    }\n\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Application/Models/UserSearchModel.cs",
    "content": "﻿using Overt.Core.Data;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Linq.Expressions;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Overt.User.Application.Models\n{\n    public class UserSearchModel\n    {\n        public int Page { get; set; }\n\n        public int Size { get; set; }\n\n        public bool IsMaster { get; set; }\n\n        public List<int> UserIds { get; set; }\n\n        public string SearchKey { get; set; }\n\n        public Expression<Func<UserEntity, bool>> GetExpression()\n        {\n            Expression<Func<UserEntity, bool>> expression = oo => oo.UserId > 0;\n            if (UserIds?.Count > 0)\n                expression = expression.And(oo => UserIds.Contains(oo.UserId));\n\n            if (!string.IsNullOrEmpty(SearchKey))\n                expression = expression.And(oo => oo.UserName.Contains(SearchKey));\n\n            return expression;\n        }\n\n        public OrderByField[] GetOrder()\n        {\n            var list = new List<OrderByField>()\n           {\n               OrderByField.Create(nameof(UserEntity.AddTime), FieldSortType.Asc)\n           };\n            return list.ToArray();\n        }\n\n    }\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Application/Overt.User.Application.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{5ADB2A33-42E4-484B-997E-3F8B942539E4}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Overt.User.Application</RootNamespace>\n    <AssemblyName>Overt.User.Application</AssemblyName>\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <Deterministic>true</Deterministic>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Autofac, Version=4.8.1.0, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\..\\packages\\Autofac.4.8.1\\lib\\net45\\Autofac.dll</HintPath>\n    </Reference>\n    <Reference Include=\"AutoMapper, Version=9.0.0.0, Culture=neutral, PublicKeyToken=be96cd2c38ef1005, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\..\\packages\\AutoMapper.9.0.0\\lib\\net461\\AutoMapper.dll</HintPath>\n    </Reference>\n    <Reference Include=\"MySql.Data, Version=6.10.7.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\..\\packages\\MySql.Data.6.10.7\\lib\\net452\\MySql.Data.dll</HintPath>\n    </Reference>\n    <Reference Include=\"netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.ComponentModel\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Configuration.Install\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Drawing.Design\" />\n    <Reference Include=\"System.Management\" />\n    <Reference Include=\"System.Transactions\" />\n    <Reference Include=\"System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\..\\packages\\System.ValueTuple.4.5.0\\lib\\netstandard1.0\\System.ValueTuple.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"AutofacExtensions.cs\" />\n    <Compile Include=\"AutoMapperProfiles.cs\" />\n    <Compile Include=\"Constracts\\ISubDbUser2Service.cs\" />\n    <Compile Include=\"Constracts\\ISubDbUserService.cs\" />\n    <Compile Include=\"Constracts\\ISubUserService.cs\" />\n    <Compile Include=\"Constracts\\IUserService.cs\" />\n    <Compile Include=\"Extensions\\ModelValidationExtensions.cs\" />\n    <Compile Include=\"Models\\UserModel.cs\" />\n    <Compile Include=\"Models\\UserPostModel.cs\" />\n    <Compile Include=\"Models\\UserSearchModel.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Services\\SubDbUser2Service.cs\" />\n    <Compile Include=\"Services\\SubDbUserService.cs\" />\n    <Compile Include=\"Services\\SubUserService.cs\" />\n    <Compile Include=\"Services\\UserService.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\Overt.Core.Data\\Overt.Core.Data.csproj\">\n      <Project>{8b1b556f-1d2c-49d2-8cb9-f9d2c7080786}</Project>\n      <Name>Overt.Core.Data</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\Overt.User.Domain\\Overt.User.Domain.csproj\">\n      <Project>{f34f6b13-b939-47a3-827e-e7015fd1b434}</Project>\n      <Name>Overt.User.Domain</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n</Project>"
  },
  {
    "path": "src/net46/Overt.User.Application/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// 有关程序集的一般信息由以下\n// 控制。更改这些特性值可修改\n// 与程序集关联的信息。\n[assembly: AssemblyTitle(\"Overt.User.Application\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"Microsoft\")]\n[assembly: AssemblyProduct(\"Overt.User.Application\")]\n[assembly: AssemblyCopyright(\"Copyright © Microsoft 2018\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// 将 ComVisible 设置为 false 会使此程序集中的类型\n//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型\n//请将此类型的 ComVisible 特性设置为 true。\n[assembly: ComVisible(false)]\n\n// 如果此项目向 COM 公开，则下列 GUID 用于类型库的 ID\n[assembly: Guid(\"5adb2a33-42e4-484b-997e-3f8b942539e4\")]\n\n// 程序集的版本信息由下列四个值组成: \n//\n//      主版本\n//      次版本\n//      生成号\n//      修订号\n//\n// 可以指定所有值，也可以使用以下所示的 \"*\" 预置版本号和修订号\n//通过使用 \"*\"，如下所示:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "src/net46/Overt.User.Application/Services/SubDbUser2Service.cs",
    "content": "﻿using AutoMapper;\nusing Overt.User.Application.Constracts;\nusing Overt.User.Application.Models;\nusing Overt.User.Domain.Contracts;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Threading.Tasks;\n\nnamespace Overt.User.Application.Services\n{\n    public class SubDbUser2Service : ISubDbUser2Service\n    {\n        IMapper _mapper;\n        ISubDbUser2Repository _repository;\n        public SubDbUser2Service(\n            IMapper mapper,\n            ISubDbUser2Repository repository)\n        {\n            _mapper = mapper;\n            _repository = repository;\n        }\n\n        public int Add(UserPostModel model)\n        {\n            if (!model.IsValid(out Exception ex))\n                throw ex;\n\n            _repository.SubDbAddTime = DateTime.Now;\n            var entity = _mapper.Map<SubDbUser2Entity>(model);\n            entity.AddTime = DateTime.Now;\n            var result = _repository.Add(entity, true);\n            if (!result)\n                throw new Exception($\"新增失败\");\n            return entity.UserId;\n        }\n\n        public UserModel Get(int userId, bool isMaster = false)\n        {\n            if (userId <= 0)\n                throw new Exception($\"UserId必须大于0\");\n\n            _repository.SubDbAddTime = DateTime.Now;\n            var entity = _repository.Get(oo => oo.UserId == userId, isMaster: isMaster);\n            return _mapper.Map<UserModel>(entity);\n        }\n\n        public async Task<int> AddAsync(UserPostModel model)\n        {\n            if (!model.IsValid(out Exception ex))\n                throw ex;\n\n            _repository.SubDbAddTime = DateTime.Now;\n            var entity = _mapper.Map<SubDbUser2Entity>(model);\n            entity.AddTime = DateTime.Now;\n            var result = await _repository.AddAsync(entity, true);\n            if (!result)\n                throw new Exception($\"新增失败\");\n            return entity.UserId;\n        }\n\n        public async Task<UserModel> GetAsync(int userId, bool isMaster = false)\n        {\n            if (userId <= 0)\n                throw new Exception($\"UserId必须大于0\");\n\n            _repository.SubDbAddTime = DateTime.Now;\n            var entity = await _repository.GetAsync(oo => oo.UserId == userId, isMaster: isMaster);\n            return _mapper.Map<UserModel>(entity);\n        }\n    }\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Application/Services/SubDbUserService.cs",
    "content": "﻿using AutoMapper;\nusing Overt.User.Application.Constracts;\nusing Overt.User.Application.Models;\nusing Overt.User.Domain.Contracts;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Threading.Tasks;\n\nnamespace Overt.User.Application.Services\n{\n    public class SubDbUserService : ISubDbUserService\n    {\n        IMapper _mapper;\n        ISubDbUserRepository _repository;\n        public SubDbUserService(\n            IMapper mapper,\n            ISubDbUserRepository repository)\n        {\n            _mapper = mapper;\n            _repository = repository;\n        }\n\n        public async Task<int> AddAsync(UserPostModel model)\n        {\n            if (!model.IsValid(out Exception ex))\n                throw ex;\n\n            var entity = _mapper.Map<SubDbUserEntity>(model);\n            entity.AddTime = DateTime.Now;\n            var result = await _repository.AddAsync(entity, true);\n            if (!result)\n                throw new Exception($\"新增失败\");\n            return entity.UserId;\n        }\n\n        public async Task<UserModel> GetAsync(int userId, bool isMaster = false)\n        {\n            if (userId <= 0)\n                throw new Exception($\"UserId必须大于0\");\n\n            var entity = await _repository.GetAsync(oo => oo.UserId == userId, isMaster: isMaster);\n            return _mapper.Map<UserModel>(entity);\n        }\n    }\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Application/Services/SubUserService.cs",
    "content": "﻿using AutoMapper;\nusing Overt.User.Application.Constracts;\nusing Overt.User.Application.Models;\nusing Overt.User.Domain.Contracts;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\nusing System.Transactions;\n\nnamespace Overt.User.Application.Services\n{\n    public class SubUserService : ISubUserService\n    {\n        IMapper _mapper;\n        ISubUserRepository _repository;\n        public SubUserService(\n            IMapper mapper,\n            ISubUserRepository repository)\n        {\n            _mapper = mapper;\n            _repository = repository;\n        }\n\n        public async Task<int> AddAsync(UserPostModel model)\n        {\n            if (!model.IsValid(out Exception ex))\n                throw ex;\n\n            // 分表标识赋值\n            _repository.AddTime = DateTime.Now;\n\n            var entity = _mapper.Map<SubUserEntity>(model);\n            entity.AddTime = DateTime.Now;\n            var result = await _repository.AddAsync(entity, true);\n            if (!result)\n                throw new Exception($\"新增失败\");\n            return entity.UserId;\n        }\n\n        public async Task<UserModel> GetAsync(int userId, bool isMaster = false)\n        {\n            if (userId <= 0)\n                throw new Exception($\"UserId必须大于0\");\n\n            // 分表标识赋值\n            _repository.AddTime = DateTime.Now;\n            var entity = await _repository.GetAsync(oo => oo.UserId == userId, isMaster: isMaster);\n            return _mapper.Map<UserModel>(entity);\n        }\n    }\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Application/Services/UserService.cs",
    "content": "﻿using AutoMapper;\nusing Overt.User.Application.Constracts;\nusing Overt.User.Application.Models;\nusing Overt.User.Domain.Contracts;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Threading.Tasks;\nusing System.Transactions;\n\nnamespace Overt.User.Application.Services\n{\n    public class UserService : IUserService\n    {\n        IMapper _mapper;\n        IUserRepository _userRepository;\n        ISubUserRepository _subUserRepository;\n        public UserService(\n            IMapper mapper,\n            IUserRepository userRepository,\n            ISubUserRepository subUserRepository)\n        {\n            _mapper = mapper;\n            _userRepository = userRepository;\n            _subUserRepository = subUserRepository;\n        }\n\n        public async Task<int> AddAsync(UserPostModel model)\n        {\n            if (!model.IsValid(out Exception ex))\n                throw ex;\n\n            var entity = _mapper.Map<UserEntity>(model);\n            entity.AddTime = DateTime.Now;\n            var result = await _userRepository.AddAsync(entity, true);\n            if (!result)\n                throw new Exception($\"新增失败\");\n            return entity.UserId;\n        }\n\n        public async Task<bool> DeleteAsync(int userId)\n        {\n            if (userId <= 0)\n                throw new Exception($\"UserId必须大于0\");\n\n            return await _userRepository.DeleteAsync(oo => oo.UserId == userId);\n        }\n\n        public async Task<UserModel> GetAsync(int userId, bool isMaster = false)\n        {\n            if (userId <= 0)\n                throw new Exception($\"UserId必须大于0\");\n\n            var entity = await _userRepository.GetAsync(oo => oo.UserId == userId, isMaster: isMaster);\n            return _mapper.Map<UserModel>(entity);\n        }\n\n        public async Task<List<UserModel>> GetListAsync(List<int> userIds, bool isMaster = false)\n        {\n            if ((userIds?.Count ?? 0) <= 0)\n                throw new Exception($\"UserIds至少提供一个\");\n\n            var entities = await _userRepository.GetListAsync(1, userIds.Count, oo => userIds.Contains(oo.UserId), isMaster: isMaster);\n            return _mapper.Map<List<UserModel>>(entities);\n        }\n\n        public async Task<(int, List<UserModel>)> GetPageAsync(UserSearchModel model)\n        {\n            var expression = model.GetExpression();\n            var orders = model.GetOrder();\n            var count = await _userRepository.CountAsync(expression, model.IsMaster);\n            var entities = await _userRepository.GetListAsync(model.Page, model.Size, expression, isMaster: model.IsMaster, orderByFields: orders);\n            var models = _mapper.Map<List<UserModel>>(entities);\n            return (count, models);\n        }\n\n        public async Task<List<string>> OtherSqlAsync()\n        {\n            var result = await _userRepository.OtherSqlAsync();\n            return result;\n        }\n\n        public async Task<bool> UpdateAsync(int userId, bool isSex)\n        {\n            if (userId <= 0)\n                throw new Exception($\"UserId必须大于0\");\n\n            // 第一种\n            var dic = new Dictionary<string, object>()\n            {\n                { nameof(UserEntity.IsSex), isSex }\n            };\n            var updateResult1 = await _userRepository.SetAsync(() => dic, oo => oo.UserId == userId);\n\n            // 第二种\n            var updateResult2 = await _userRepository.SetAsync(() => new { IsSex = isSex }, oo => oo.UserId == userId);\n\n            // 第三种\n            var entity = await _userRepository.GetAsync(oo => oo.UserId == userId, isMaster: true);\n            if (entity?.UserId != userId)\n                throw new Exception($\"无可更新数据\");\n            entity.IsSex = isSex;\n            var updateResult3 = await _userRepository.SetAsync(entity);\n\n            return updateResult3;\n        }\n\n        public async Task<bool> ExecuteInTransactionAsync()\n        {\n            // 分布式事务\n            using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))\n            {\n                var result = false;\n                try\n                {\n                    result = await _userRepository.AddAsync(new UserEntity()\n                    {\n                        UserName = \"222222222\",\n                        RealName = \"22222222\",\n                        Password = \"123456\",\n                        IsSex = false,\n                        JsonValue = \"{}\",\n                        AddTime = DateTime.Now\n                    });\n                    result &= await _subUserRepository.AddAsync(new SubUserEntity()\n                    {\n                        UserName = \"222222222\",\n                        RealName = \"22222222\",\n                        Password = \"123456\",\n                        IsSex = false,\n                        JsonValue = \"{}\",\n                        AddTime = DateTime.Now\n                    });\n\n                    scope.Complete();\n                    return result;\n                }\n                catch(Exception ex)\n                {\n                    // logger\n                }\n                return false;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Application/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Autofac\" version=\"4.8.1\" targetFramework=\"net46\" />\n  <package id=\"AutoMapper\" version=\"9.0.0\" targetFramework=\"net462\" />\n  <package id=\"MySql.Data\" version=\"6.10.7\" targetFramework=\"net46\" />\n  <package id=\"System.ValueTuple\" version=\"4.5.0\" targetFramework=\"net46\" requireReinstallation=\"true\" />\n</packages>"
  },
  {
    "path": "src/net46/Overt.User.Domain/AutofacExtensions.cs",
    "content": "﻿using Autofac;\nusing Overt.User.Domain.Contracts;\nusing Overt.User.Domain.Repositories;\n\nnamespace Overt.User.Domain\n{\n    public static class AutofacExtensions\n    {\n        public static void AddDomainDI(this ContainerBuilder builder)\n        {\n            builder.RegisterType<UserRepository>().As<IUserRepository>();\n            builder.RegisterType<SubUserRepository>().As<ISubUserRepository>();\n            builder.RegisterType<SubDbUserRepository>().As<ISubDbUserRepository>();\n            builder.RegisterType<SubDbUser2Repository>().As<ISubDbUser2Repository>();\n        }\n    }\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Domain/Contracts/ISubDbUser2Repository.cs",
    "content": "﻿using Overt.Core.Data;\nusing Overt.User.Domain.Entities;\nusing System;\n\nnamespace Overt.User.Domain.Contracts\n{\n    public interface ISubDbUser2Repository : IBaseRepository<SubDbUser2Entity>\n    {\n        /// <summary>\n        /// 分库标识\n        /// </summary>\n        DateTime SubDbAddTime { get; set; }\n    }\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Domain/Contracts/ISubDbUserRepository.cs",
    "content": "﻿using Overt.Core.Data;\nusing Overt.User.Domain.Entities;\n\nnamespace Overt.User.Domain.Contracts\n{\n    public interface ISubDbUserRepository : IBaseRepository<SubDbUserEntity>\n    {\n    }\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Domain/Contracts/ISubUserRepository.cs",
    "content": "﻿using Overt.Core.Data;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Overt.User.Domain.Contracts\n{\n    public interface ISubUserRepository : IBaseRepository<SubUserEntity>\n    {\n        /// <summary>\n        /// 分表标识 第二种\n        /// 第一种为HASH模式，实体标记Submeter\n        /// </summary>\n        DateTime AddTime { get; set; }\n             \n    }\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Domain/Contracts/IUserRepository.cs",
    "content": "﻿using Overt.Core.Data;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace Overt.User.Domain.Contracts\n{\n    public interface IUserRepository : IBaseRepository<UserEntity>\n    {\n        /// <summary>\n        /// 其他sql 本案例中 统计UserName去重个数\n        /// </summary>\n        /// <returns></returns>\n        Task<List<string>> OtherSqlAsync();\n    }\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Domain/Entities/SubDbUser2Entity.cs",
    "content": "﻿using Overt.Core.Data;\nusing System;\nusing System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\n\nnamespace Overt.User.Domain.Entities\n{\n    [Table(\"User\")]\n    public class SubDbUser2Entity\n    {\n        // 第一种分表标识，Md5(UserId)取{Bit}位 尽量不用，使用自定义模式\n        //[Submeter(Bit = 2)]\n        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]\n        public int UserId { get; set; }\n        public string UserName { get; set; }\n        public string RealName { get; set; }\n        public string Password { get; set; }\n        public DateTime AddTime { get; set; }\n        public bool IsSex { get; set; }\n        /// <summary>\n        /// \n        /// </summary>\n        public int Age { get; set; }\n        /// <summary>\n        /// Json类型\n        /// </summary>\n        public string JsonValue { get; set; }\n    }\n\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Domain/Entities/SubDbUserEntity.cs",
    "content": "﻿using Overt.Core.Data;\nusing System;\nusing System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\n\nnamespace Overt.User.Domain.Entities\n{\n    [Table(\"User\")]\n    public class SubDbUserEntity\n    {\n        // 第一种分表标识，Md5(UserId)取{Bit}位 尽量不用，使用自定义模式\n        //[Submeter(Bit = 2)]\n        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]\n        public int UserId { get; set; }\n        public string UserName { get; set; }\n        public string RealName { get; set; }\n        public string Password { get; set; }\n        public DateTime AddTime { get; set; }\n        public bool IsSex { get; set; }\n        /// <summary>\n        /// Json类型\n        /// </summary>\n        public string JsonValue { get; set; }\n    }\n\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Domain/Entities/SubUserEntity.cs",
    "content": "﻿using Overt.Core.Data;\nusing System;\nusing System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\n\nnamespace Overt.User.Domain.Entities\n{\n    [Table(\"User\")]\n    public class SubUserEntity\n    {\n        // 第一种分表标识，Md5(UserId)取{Bit}位 尽量不用，使用自定义模式\n        //[Submeter(Bit = 2)]\n        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]\n        public int UserId { get; set; }\n        public string UserName { get; set; }\n        public string RealName { get; set; }\n        public string Password { get; set; }\n        public DateTime AddTime { get; set; }\n        public bool IsSex { get; set; }\n        /// <summary>\n        /// Json类型\n        /// </summary>\n        public string JsonValue { get; set; }\n    }\n\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Domain/Entities/UserEntity.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.ComponentModel.DataAnnotations;\nusing System.ComponentModel.DataAnnotations.Schema;\nusing System.Text;\n\nnamespace Overt.User.Domain.Entities\n{\n    [Table(\"User\")]\n    public class UserEntity\n    {\n        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]\n        public int UserId { get; set; }\n        public string UserName { get; set; }\n        public string RealName { get; set; }\n        public string Password { get; set; }\n        public DateTime AddTime { get; set; }\n        public bool IsSex { get; set; }\n        /// <summary>\n        /// Json类型\n        /// </summary>\n        public string JsonValue { get; set; }\n    }\n\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Domain/Overt.User.Domain.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{F34F6B13-B939-47A3-827E-E7015FD1B434}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Overt.User.Domain</RootNamespace>\n    <AssemblyName>Overt.User.Domain</AssemblyName>\n    <TargetFrameworkVersion>v4.6.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <Deterministic>true</Deterministic>\n    <TargetFrameworkProfile />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Autofac, Version=4.8.1.0, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\..\\packages\\Autofac.4.8.1\\lib\\net45\\Autofac.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Dapper, Version=1.50.2.0, Culture=neutral, processorArchitecture=MSIL\">\n      <HintPath>..\\..\\..\\packages\\Dapper.1.50.2\\lib\\net451\\Dapper.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"AutofacExtensions.cs\" />\n    <Compile Include=\"Contracts\\ISubDbUser2Repository.cs\" />\n    <Compile Include=\"Contracts\\ISubDbUserRepository.cs\" />\n    <Compile Include=\"Contracts\\ISubUserRepository.cs\" />\n    <Compile Include=\"Contracts\\IUserRepository.cs\" />\n    <Compile Include=\"Entities\\SubDbUser2Entity.cs\" />\n    <Compile Include=\"Entities\\SubDbUserEntity.cs\" />\n    <Compile Include=\"Entities\\SubUserEntity.cs\" />\n    <Compile Include=\"Entities\\UserEntity.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"Repositories\\SubDbUser2Repository.cs\" />\n    <Compile Include=\"Repositories\\SubDbUserRepository.cs\" />\n    <Compile Include=\"Repositories\\SubUserRepository.cs\" />\n    <Compile Include=\"Repositories\\UserRepository.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\Overt.Core.Data\\Overt.Core.Data.csproj\">\n      <Project>{8b1b556f-1d2c-49d2-8cb9-f9d2c7080786}</Project>\n      <Name>Overt.Core.Data</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n</Project>"
  },
  {
    "path": "src/net46/Overt.User.Domain/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// 有关程序集的一般信息由以下\n// 控制。更改这些特性值可修改\n// 与程序集关联的信息。\n[assembly: AssemblyTitle(\"Overt.User.Domain\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"Microsoft\")]\n[assembly: AssemblyProduct(\"Overt.User.Domain\")]\n[assembly: AssemblyCopyright(\"Copyright © Microsoft 2018\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// 将 ComVisible 设置为 false 会使此程序集中的类型\n//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型\n//请将此类型的 ComVisible 特性设置为 true。\n[assembly: ComVisible(false)]\n\n// 如果此项目向 COM 公开，则下列 GUID 用于类型库的 ID\n[assembly: Guid(\"f34f6b13-b939-47a3-827e-e7015fd1b434\")]\n\n// 程序集的版本信息由下列四个值组成: \n//\n//      主版本\n//      次版本\n//      生成号\n//      修订号\n//\n// 可以指定所有值，也可以使用以下所示的 \"*\" 预置版本号和修订号\n//通过使用 \"*\"，如下所示:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "src/net46/Overt.User.Domain/Repositories/SubDbUser2Repository.cs",
    "content": "﻿using Overt.Core.Data;\nusing Overt.User.Domain.Contracts;\nusing Overt.User.Domain.Entities;\nusing System;\nusing System.Configuration;\n\nnamespace Overt.User.Domain.Repositories\n{\n    public class SubDbUser2Repository : BaseRepository<SubDbUser2Entity>, ISubDbUser2Repository\n    {\n        public SubDbUser2Repository()\n            : base()\n        {\n        }\n\n\n        // Service层进行赋值即可\n        public DateTime SubDbAddTime { get; set; }\n\n        public override Func<bool, ConnectionStringSettings> ConnectionFunc => (isMaster) =>\n        {\n            var connectionString = string.Empty;\n\n            var dbName = $\"TestDb_{SubDbAddTime.ToString(\"yyyy\")}\";\n            if (isMaster)\n                connectionString = $\"Data Source=127.0.0.1;Initial Catalog={dbName};Persist Security Info=True;User ID=sa;Password=123465\";\n            else\n                connectionString = $\"Data Source=127.0.0.1;Initial Catalog={dbName};Persist Security Info=True;User ID=sa;Password=123465\";\n            return new ConnectionStringSettings(dbName, connectionString, \"System.Data.SqlClient\");\n        };\n    }\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Domain/Repositories/SubDbUserRepository.cs",
    "content": "﻿using Overt.Core.Data;\nusing Overt.User.Domain.Contracts;\nusing Overt.User.Domain.Entities;\n\nnamespace Overt.User.Domain.Repositories\n{\n    public class SubDbUserRepository : BaseRepository<SubDbUserEntity>, ISubDbUserRepository\n    {\n        public SubDbUserRepository()\n            : base(\"subdb\")\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Domain/Repositories/SubUserRepository.cs",
    "content": "﻿using Overt.Core.Data;\nusing Overt.User.Domain.Contracts;\nusing Overt.User.Domain.Entities;\nusing System;\n\nnamespace Overt.User.Domain.Repositories\n{\n    public class SubUserRepository : BaseRepository<SubUserEntity>, ISubUserRepository\n    {\n        public SubUserRepository() : base()\n        {\n        }\n\n        // Service层进行赋值即可\n        public DateTime AddTime { get; set; }\n\n        public override Func<string> TableNameFunc => () =>\n        {\n            var tableName = $\"{GetMainTableName()}_{DateTime.Now.ToString(\"yyyyMMdd\")}\";\n            return tableName;\n        };\n\n        public override Func<string, string> CreateScriptFunc => (tableName) =>\n        {\n            return $\"CREATE TABLE [{tableName}] (\" +\n                    \"  [UserId] int  IDENTITY(1,1) NOT NULL,\" +\n                    \"  [UserName] varchar(200) COLLATE Chinese_PRC_CI_AS DEFAULT NULL NULL,\" +\n                    \"  [Password] varchar(200) COLLATE Chinese_PRC_CI_AS DEFAULT NULL NULL,\" +\n                    \"  [RealName] varchar(200) COLLATE Chinese_PRC_CI_AS DEFAULT NULL NULL,\" +\n                    \"  [AddTime] datetime DEFAULT NULL NULL,\" +\n                    \"  [IsSex] bit DEFAULT NULL NULL,\" +\n                    \"  [JsonValue] varchar(1000) COLLATE Chinese_PRC_CI_AS DEFAULT NULL NULL\" +\n                    \") \";\n        };\n    }\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Domain/Repositories/UserRepository.cs",
    "content": "﻿using Dapper;\nusing Overt.Core.Data;\nusing Overt.User.Domain.Contracts;\nusing Overt.User.Domain.Entities;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nnamespace Overt.User.Domain.Repositories\n{\n    public class UserRepository : BaseRepository<UserEntity>, IUserRepository\n    {\n        public UserRepository()\n            : base() // dbStoreKey 可用于不同数据库切换，连接字符串key前缀：xxx.master xxx.secondary\n        {\n        }\n\n        public async Task<List<string>> OtherSqlAsync()\n        {\n            // 表名最好使用这个方法获取，支持分表，分表案例详见其他案例\n            var tableName = GetTableName();\n            var sql = $\"select distinct([UserName]) from [{tableName}]\";\n            return await Execute(async connecdtion =>\n            {\n                var task = await connecdtion.QueryAsync<string>(sql);\n                return task.ToList();\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "src/net46/Overt.User.Domain/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Autofac\" version=\"4.8.1\" targetFramework=\"net46\" />\n  <package id=\"Dapper\" version=\"1.50.2\" targetFramework=\"net462\" />\n</packages>"
  }
]