<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>OdinSam&#39;s blogs-一个热爱编程性格开朗的Coder</title>
  
  
  <link href="https://odinsam.com/atom.xml" rel="self"/>
  
  <link href="https://odinsam.com/"/>
  <updated>2025-11-23T04:31:43.097Z</updated>
  <id>https://odinsam.com/</id>
  
  <author>
    <name>OdinSam</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>VsCode插件开发 - odin-DebugWindows</title>
    <link href="https://odinsam.com/2025/1123/9107.html"/>
    <id>https://odinsam.com/2025/1123/9107.html</id>
    <published>2025-11-23T03:00:00.000Z</published>
    <updated>2025-11-23T04:31:43.097Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>在调试过程中，你是否遇到过这样的困扰：想要查看一个复杂的数据结构（如 DataTable、List、Dictionary），但在调试窗口中只能看到简单的字符串表示，无法直观地查看数据内容？今天我要向大家介绍一款我开发的 VSCode 扩展插件——<strong>odin-DebugWindows</strong>，它可以让调试过程变得更加高效和直观。</p></blockquote><span id="more"></span><h1 id="让调试更高效odin-debugwindows-一个强大的-vscode-调试窗口扩展"><a class="markdownIt-Anchor" href="#让调试更高效odin-debugwindows-一个强大的-vscode-调试窗口扩展"></a> 让调试更高效：odin-DebugWindows - 一个强大的 VSCode 调试窗口扩展</h1><h2 id="插件简介"><a class="markdownIt-Anchor" href="#插件简介"></a> 📖 插件简介</h2><p><strong>odin-DebugWindows</strong> 是一款专为 VSCode 开发的调试辅助扩展。它的核心功能是：当程序在调试模式下暂停时，你可以直接在调试窗口中输入变量名，插件会自动解析变量值并以表格形式展示，支持分页、筛选、导出等功能。</p><h3 id="为什么需要这个插件"><a class="markdownIt-Anchor" href="#为什么需要这个插件"></a> 为什么需要这个插件？</h3><p>在日常开发中，我们经常需要调试复杂的数据结构：</p><ul><li><strong>C# 开发</strong>：查看 <code>DataTable</code>、<code>List&lt;T&gt;</code>、<code>Dictionary&lt;TKey, TValue&gt;</code> 等集合类型</li><li><strong>JavaScript/TypeScript 开发</strong>：查看 JSON 对象、数组等数据结构</li><li><strong>数据验证</strong>：需要快速查看大量数据，验证数据是否正确</li></ul><p>传统的调试方式存在以下问题：</p><ol><li><strong>数据展示不直观</strong>：复杂对象在调试窗口中只能看到类型和简单信息</li><li><strong>数据量大时难以查看</strong>：没有分页和筛选功能</li><li><strong>无法导出数据</strong>：无法将调试数据导出进行分析</li></ol><p><strong>odin-DebugWindows</strong> 正是为了解决这些问题而诞生的。</p><h2 id="核心功能"><a class="markdownIt-Anchor" href="#核心功能"></a> ✨ 核心功能</h2><h3 id="1-智能变量解析"><a class="markdownIt-Anchor" href="#1-智能变量解析"></a> 1. 智能变量解析</h3><p>插件支持多种编程语言和数据类型：</p><h4 id="javascripttypescript-支持"><a class="markdownIt-Anchor" href="#javascripttypescript-支持"></a> JavaScript/TypeScript 支持</h4><ul><li>✅ JSON 对象/数组（自动解析 JSON 字符串，包括多重转义）</li><li>✅ 数组（对象数组、简单值数组）</li><li>✅ 对象（普通 JavaScript 对象）</li><li>✅ 类数组对象（NodeList、Arguments 等）</li><li>✅ 基本类型</li></ul><h4 id="c-支持"><a class="markdownIt-Anchor" href="#c-支持"></a> C# 支持</h4><ul><li>✅ <strong>DataTable</strong> - 完整解析列和行数据</li><li>✅ <strong>List<T></strong> - 自动遍历列表元素</li><li>✅ <strong>Dictionary&lt;TKey, TValue&gt;</strong> - 键值对展示</li><li>✅ 数组、对象、基本类型</li></ul><h3 id="2-强大的表格功能"><a class="markdownIt-Anchor" href="#2-强大的表格功能"></a> 2. 强大的表格功能</h3><p>解析后的数据会以表格形式展示，支持：</p><ul><li><strong>分页显示</strong>：每页显示 20 行数据，支持大量数据浏览</li><li><strong>实时筛选</strong>：输入关键词快速过滤数据</li><li><strong>数据导出</strong>：一键导出为 CSV 或 Excel 格式</li><li><strong>响应式设计</strong>：适配不同窗口大小</li></ul><h3 id="3-智能建议"><a class="markdownIt-Anchor" href="#3-智能建议"></a> 3. 智能建议</h3><ul><li>自动获取当前调试上下文中的变量</li><li>输入时显示变量名建议</li><li>支持键盘导航选择</li></ul><h3 id="4-项目类型自动检测"><a class="markdownIt-Anchor" href="#4-项目类型自动检测"></a> 4. 项目类型自动检测</h3><p>插件会自动检测项目类型（C#、JavaScript、TypeScript、Vue、Python、Java、Go、Rust 等），并根据项目类型选择相应的解析器。</p><h2 id="快速开始"><a class="markdownIt-Anchor" href="#快速开始"></a> 🚀 快速开始</h2><h3 id="安装方式"><a class="markdownIt-Anchor" href="#安装方式"></a> 安装方式</h3><h4 id="方式一从-vsix-安装"><a class="markdownIt-Anchor" href="#方式一从-vsix-安装"></a> 方式一：从 VSIX 安装</h4><ol><li>下载最新版本的 <code>.vsix</code> 文件</li><li>在 VSCode 中按 <code>Ctrl+Shift+P</code> (Windows/Linux) 或 <code>Cmd+Shift+P</code> (Mac)</li><li>输入 <code>Extensions: Install from VSIX...</code></li><li>选择下载的 <code>.vsix</code> 文件</li></ol><h4 id="方式二从源码安装"><a class="markdownIt-Anchor" href="#方式二从源码安装"></a> 方式二：从源码安装</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://gitee.com/odinsam/debug-window.git</span><br><span class="line"><span class="built_in">cd</span> debug-window</span><br><span class="line">npm install</span><br><span class="line">npm run compile</span><br><span class="line"><span class="comment"># 按 F5 键在扩展开发宿主窗口中运行</span></span><br></pre></td></tr></table></figure><h3 id="基本使用"><a class="markdownIt-Anchor" href="#基本使用"></a> 基本使用</h3><ol><li><p><strong>启动调试</strong></p><ul><li>在 VSCode 中启动调试会话（按 <code>F5</code>）</li><li>在断点处暂停程序</li></ul></li><li><p><strong>打开调试窗口</strong></p><ul><li>在侧边栏找到&quot;调试窗口&quot;面板</li><li>或使用命令面板：<code>Ctrl+Shift+P</code> → <code>显示调试窗口</code></li></ul></li><li><p><strong>解析变量</strong></p><ul><li>在输入框中输入变量名（如 <code>users</code>、<code>dataTable</code>）</li><li>按回车键</li><li>变量值会自动解析并显示为表格</li></ul></li><li><p><strong>操作表格</strong></p><ul><li>使用筛选框过滤数据</li><li>使用分页按钮浏览数据</li><li>点击导出按钮导出为 CSV 或 Excel</li></ul></li></ol><h2 id="使用示例"><a class="markdownIt-Anchor" href="#使用示例"></a> 💡 使用示例</h2><h3 id="javascripttypescript-示例"><a class="markdownIt-Anchor" href="#javascripttypescript-示例"></a> JavaScript/TypeScript 示例</h3><p>假设我们有以下代码：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 对象数组</span></span><br><span class="line"><span class="keyword">const</span> users = [</span><br><span class="line">  &#123; <span class="attr">id</span>: <span class="number">1</span>, <span class="attr">name</span>: <span class="string">&quot;张三&quot;</span>, <span class="attr">age</span>: <span class="number">25</span>, <span class="attr">city</span>: <span class="string">&quot;北京&quot;</span> &#125;,</span><br><span class="line">  &#123; <span class="attr">id</span>: <span class="number">2</span>, <span class="attr">name</span>: <span class="string">&quot;李四&quot;</span>, <span class="attr">age</span>: <span class="number">30</span>, <span class="attr">city</span>: <span class="string">&quot;上海&quot;</span> &#125;,</span><br><span class="line">  &#123; <span class="attr">id</span>: <span class="number">3</span>, <span class="attr">name</span>: <span class="string">&quot;王五&quot;</span>, <span class="attr">age</span>: <span class="number">28</span>, <span class="attr">city</span>: <span class="string">&quot;广州&quot;</span> &#125;</span><br><span class="line">];</span><br><span class="line"></span><br><span class="line"><span class="comment">// JSON 字符串</span></span><br><span class="line"><span class="keyword">const</span> jsonStr = <span class="string">&#x27;[&#123;&quot;id&quot;:1,&quot;name&quot;:&quot;张三&quot;&#125;,&#123;&quot;id&quot;:2,&quot;name&quot;:&quot;李四&quot;&#125;]&#x27;</span>;</span><br></pre></td></tr></table></figure><p>在调试窗口中输入 <code>users</code> 或 <code>jsonStr</code>，插件会自动解析并显示为表格：</p><table><thead><tr><th>id</th><th>name</th><th>age</th><th>city</th></tr></thead><tbody><tr><td>1</td><td>张三</td><td>25</td><td>北京</td></tr><tr><td>2</td><td>李四</td><td>30</td><td>上海</td></tr><tr><td>3</td><td>王五</td><td>28</td><td>广州</td></tr></tbody></table><h3 id="c-示例"><a class="markdownIt-Anchor" href="#c-示例"></a> C# 示例</h3><h4 id="datatable-解析"><a class="markdownIt-Anchor" href="#datatable-解析"></a> DataTable 解析</h4><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">DataTable dt = <span class="keyword">new</span> DataTable();</span><br><span class="line">dt.Columns.Add(<span class="string">&quot;ID&quot;</span>, <span class="keyword">typeof</span>(<span class="built_in">int</span>));</span><br><span class="line">dt.Columns.Add(<span class="string">&quot;Name&quot;</span>, <span class="keyword">typeof</span>(<span class="built_in">string</span>));</span><br><span class="line">dt.Columns.Add(<span class="string">&quot;Age&quot;</span>, <span class="keyword">typeof</span>(<span class="built_in">int</span>));</span><br><span class="line">dt.Rows.Add(<span class="number">1</span>, <span class="string">&quot;张三&quot;</span>, <span class="number">25</span>);</span><br><span class="line">dt.Rows.Add(<span class="number">2</span>, <span class="string">&quot;李四&quot;</span>, <span class="number">30</span>);</span><br><span class="line">dt.Rows.Add(<span class="number">3</span>, <span class="string">&quot;王五&quot;</span>, <span class="number">28</span>);</span><br></pre></td></tr></table></figure><p>在调试窗口中输入 <code>dt</code>，插件会：</p><ol><li>自动获取列名（ID, Name, Age）</li><li>遍历所有行数据</li><li>以表格形式展示</li></ol><h4 id="listt-解析"><a class="markdownIt-Anchor" href="#listt-解析"></a> List<T> 解析</h4><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">List&lt;User&gt; users = <span class="keyword">new</span> List&lt;User&gt;</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">new</span> User &#123; Id = <span class="number">1</span>, Name = <span class="string">&quot;张三&quot;</span>, Age = <span class="number">25</span> &#125;,</span><br><span class="line">    <span class="keyword">new</span> User &#123; Id = <span class="number">2</span>, Name = <span class="string">&quot;李四&quot;</span>, Age = <span class="number">30</span> &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>输入 <code>users</code> 后，插件会自动遍历列表中的每个元素，提取属性并展示为表格。</p><h4 id="dictionarytkey-tvalue-解析"><a class="markdownIt-Anchor" href="#dictionarytkey-tvalue-解析"></a> Dictionary&lt;TKey, TValue&gt; 解析</h4><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Dictionary&lt;<span class="built_in">string</span>, <span class="built_in">string</span>&gt; dict = <span class="keyword">new</span> Dictionary&lt;<span class="built_in">string</span>, <span class="built_in">string</span>&gt;();</span><br><span class="line">dict.Add(<span class="string">&quot;name&quot;</span>, <span class="string">&quot;张三&quot;</span>);</span><br><span class="line">dict.Add(<span class="string">&quot;city&quot;</span>, <span class="string">&quot;北京&quot;</span>);</span><br><span class="line">dict.Add(<span class="string">&quot;job&quot;</span>, <span class="string">&quot;工程师&quot;</span>);</span><br></pre></td></tr></table></figure><p>输入 <code>dict</code> 后，会显示为键值对表格：</p><table><thead><tr><th>键</th><th>值</th></tr></thead><tbody><tr><td>name</td><td>张三</td></tr><tr><td>city</td><td>北京</td></tr><tr><td>job</td><td>工程师</td></tr></tbody></table><p><img src="/images/9107/e.g.gif" alt="" /></p><h2 id="️-技术实现"><a class="markdownIt-Anchor" href="#️-技术实现"></a> 🏗️ 技术实现</h2><h3 id="架构设计"><a class="markdownIt-Anchor" href="#架构设计"></a> 架构设计</h3><p>插件采用模块化、面向对象的设计：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">src/</span><br><span class="line">├── extension.ts              # 扩展入口</span><br><span class="line">├── parsers/                 # 解析器模块</span><br><span class="line">│   ├── VariableParser.ts    # 解析器基类</span><br><span class="line">│   ├── JavaScriptParser.ts  # JavaScript/TypeScript 解析器</span><br><span class="line">│   └── CSharpParser.ts      # C# 解析器</span><br><span class="line">├── providers/               # 提供者模块</span><br><span class="line">│   └── DebugWindowViewProvider.ts  # 调试窗口视图提供者</span><br><span class="line">├── types/                   # 类型定义</span><br><span class="line">└── utils/                   # 工具类</span><br><span class="line">    ├── ProjectTypeDetector.ts  # 项目类型检测</span><br><span class="line">    └── TableExporter.ts       # 表格导出工具</span><br></pre></td></tr></table></figure><h3 id="核心特性"><a class="markdownIt-Anchor" href="#核心特性"></a> 核心特性</h3><h4 id="1-解析器模式"><a class="markdownIt-Anchor" href="#1-解析器模式"></a> 1. 解析器模式</h4><p>插件使用策略模式实现不同类型的解析器：</p><ul><li><strong>VariableParser</strong>：抽象基类，提供通用方法（<code>arrayToTable</code>、<code>objectToTable</code> 等）</li><li><strong>JavaScriptParser</strong>：处理 JavaScript/TypeScript 变量</li><li><strong>CSharpParser</strong>：处理 C# 特定类型（DataTable、List、Dictionary）</li></ul><p>这种设计使得扩展新语言支持变得非常简单，只需：</p><ol><li>创建新的解析器类（继承 <code>VariableParser</code>）</li><li>实现 <code>parse()</code> 和 <code>supports()</code> 方法</li><li>在 <code>DebugWindowViewProvider</code> 中注册</li></ol><h4 id="2-复杂类型处理"><a class="markdownIt-Anchor" href="#2-复杂类型处理"></a> 2. 复杂类型处理</h4><p>对于 C# 的复杂类型，插件通过 VSCode 调试 API 递归获取数据：</p><p><strong>DataTable 解析流程：</strong></p><ol><li>获取列名：通过 <code>evaluate</code> 表达式获取 <code>dataTable.Columns[i].ColumnName</code></li><li>获取行数据：遍历 <code>dataTable.Rows[i]</code>，提取 <code>ItemArray</code> 值</li><li>格式化数据：清理引号、格式化日期等</li></ol><p><strong>Dictionary 解析流程：</strong></p><ol><li>通过 <code>variablesReference</code> 获取 KeyValuePair 数组</li><li>对每个 KeyValuePair，获取 Key 和 Value</li><li>构建键值对表格</li></ol><h4 id="3-json-字符串处理"><a class="markdownIt-Anchor" href="#3-json-字符串处理"></a> 3. JSON 字符串处理</h4><p>插件能够处理多重转义的 JSON 字符串：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 处理这种情况：</span></span><br><span class="line"><span class="keyword">const</span> str = <span class="string">&#x27;&quot;[&#123;\\\&quot;id\\\&quot;:1,\\\&quot;name\\\&quot;:\\\&quot;张三\\\&quot;&#125;]&quot;&#x27;</span></span><br><span class="line"><span class="comment">// 插件会自动解析为对象数组</span></span><br></pre></td></tr></table></figure><h4 id="4-智能建议"><a class="markdownIt-Anchor" href="#4-智能建议"></a> 4. 智能建议</h4><p>插件通过 VSCode 调试 API 获取当前作用域的所有变量，并在用户输入时提供智能建议。</p><h2 id="使用场景"><a class="markdownIt-Anchor" href="#使用场景"></a> 🎯 使用场景</h2><h3 id="场景一调试-api-返回数据"><a class="markdownIt-Anchor" href="#场景一调试-api-返回数据"></a> 场景一：调试 API 返回数据</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 调用 API 获取用户列表</span></span><br><span class="line"><span class="keyword">const</span> response = <span class="keyword">await</span> <span class="title function_">fetch</span>(<span class="string">&#x27;/api/users&#x27;</span>);</span><br><span class="line"><span class="keyword">const</span> users = <span class="keyword">await</span> response.<span class="title function_">json</span>();</span><br><span class="line"></span><br><span class="line"><span class="comment">// 在调试窗口中输入 users，快速查看数据结构</span></span><br></pre></td></tr></table></figure><h3 id="场景二验证数据库查询结果"><a class="markdownIt-Anchor" href="#场景二验证数据库查询结果"></a> 场景二：验证数据库查询结果</h3><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// C# 中查询数据库</span></span><br><span class="line">DataTable dt = ExecuteQuery(<span class="string">&quot;SELECT * FROM Users WHERE Age &gt; 25&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 在调试窗口中输入 dt，查看查询结果</span></span><br></pre></td></tr></table></figure><h3 id="场景三分析复杂对象结构"><a class="markdownIt-Anchor" href="#场景三分析复杂对象结构"></a> 场景三：分析复杂对象结构</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 复杂的嵌套对象</span></span><br><span class="line"><span class="keyword">const</span> data = &#123;</span><br><span class="line">  <span class="attr">users</span>: [</span><br><span class="line">    &#123; <span class="attr">id</span>: <span class="number">1</span>, <span class="attr">profile</span>: &#123; <span class="attr">name</span>: <span class="string">&quot;张三&quot;</span>, <span class="attr">contacts</span>: [...] &#125; &#125;</span><br><span class="line">  ],</span><br><span class="line">  <span class="attr">metadata</span>: &#123; <span class="attr">total</span>: <span class="number">100</span>, <span class="attr">page</span>: <span class="number">1</span> &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 输入 data.users，查看用户列表</span></span><br><span class="line"><span class="comment">// 输入 data.metadata，查看元数据</span></span><br></pre></td></tr></table></figure><h3 id="场景四导出调试数据"><a class="markdownIt-Anchor" href="#场景四导出调试数据"></a> 场景四：导出调试数据</h3><p>当需要将调试数据分享给团队成员或进行进一步分析时，可以直接导出为 CSV 或 Excel 格式。</p><h2 id="高级功能"><a class="markdownIt-Anchor" href="#高级功能"></a> 🔧 高级功能</h2><h3 id="1-编译时自动清理"><a class="markdownIt-Anchor" href="#1-编译时自动清理"></a> 1. 编译时自动清理</h3><p>插件会在检测到编译任务时自动清空调试窗口，避免旧数据干扰。</p><h3 id="2-支持的命令"><a class="markdownIt-Anchor" href="#2-支持的命令"></a> 2. 支持的命令</h3><p>在输入框中可以输入以下命令：</p><ul><li><code>help</code> - 显示帮助信息</li><li><code>clear</code> - 清空消息和表格</li><li><code>time</code> - 显示当前时间</li><li><code>project</code> - 显示当前项目类型</li></ul><h3 id="3-扩展性"><a class="markdownIt-Anchor" href="#3-扩展性"></a> 3. 扩展性</h3><p>插件采用模块化设计，可以轻松扩展：</p><ul><li>添加新的语言支持（Python、Java、Go 等）</li><li>添加新的数据类型解析器</li><li>自定义表格显示样式</li></ul><p>详细扩展指南请查看：<a href="./%E6%89%A9%E5%B1%95%E6%8C%87%E5%8D%97.md">扩展指南.md</a></p><h2 id="性能优化"><a class="markdownIt-Anchor" href="#性能优化"></a> 📊 性能优化</h2><ul><li><strong>分页显示</strong>：大量数据时只渲染当前页，提升性能</li><li><strong>懒加载</strong>：按需获取变量数据，避免不必要的 API 调用</li><li><strong>缓存机制</strong>：缓存已解析的数据，避免重复解析</li></ul><h2 id="问题排查"><a class="markdownIt-Anchor" href="#问题排查"></a> 🐛 问题排查</h2><h3 id="问题变量解析失败"><a class="markdownIt-Anchor" href="#问题变量解析失败"></a> 问题：变量解析失败</h3><p><strong>可能原因：</strong></p><ol><li>变量不在当前作用域</li><li>变量类型不支持</li><li>调试会话未暂停</li></ol><p><strong>解决方案：</strong></p><ul><li>确保程序在断点处暂停</li><li>检查变量名是否正确</li><li>查看控制台错误信息</li></ul><h3 id="问题表格显示为空"><a class="markdownIt-Anchor" href="#问题表格显示为空"></a> 问题：表格显示为空</h3><p><strong>可能原因：</strong></p><ol><li>数据为空</li><li>解析失败（查看消息窗口的错误信息）</li></ol><p><strong>解决方案：</strong></p><ul><li>检查变量是否有数据</li><li>查看消息窗口的错误提示</li></ul><h2 id="未来计划"><a class="markdownIt-Anchor" href="#未来计划"></a> 🚧 未来计划</h2><ul><li>[ ] 支持更多编程语言（Python、Java、Go、Rust 等）</li><li>[ ] 支持更多数据类型（pandas DataFrame、numpy array 等）</li><li>[ ] 添加表格排序功能</li><li>[ ] 支持自定义解析器</li><li>[ ] 添加数据可视化（图表展示）</li><li>[ ] 支持多变量对比</li></ul><h2 id="总结"><a class="markdownIt-Anchor" href="#总结"></a> 📝 总结</h2><p><strong>odin-DebugWindows</strong> 是一款实用的 VSCode 调试辅助工具，它通过智能解析和表格展示，让调试过程变得更加高效和直观。无论你是 C# 开发者还是 JavaScript/TypeScript 开发者，都能从中受益。</p><h3 id="主要优势"><a class="markdownIt-Anchor" href="#主要优势"></a> 主要优势</h3><p>✅ <strong>直观展示</strong> - 表格形式展示复杂数据<br />✅ <strong>功能强大</strong> - 支持分页、筛选、导出<br />✅ <strong>智能解析</strong> - 自动识别数据类型并选择解析器<br />✅ <strong>易于扩展</strong> - 模块化设计，方便添加新功能<br />✅ <strong>开源免费</strong> - MIT 许可证，可自由使用和修改</p><p>如果你觉得这个插件有用，欢迎：</p><ul><li>⭐ 给项目点个 Star</li><li>🐛 提交 Issue 反馈问题</li><li>💡 提出功能建议</li><li>🔧 贡献代码</li></ul><p><a href="/2024/0709/459a.html">VsCode插件开发</a></p><p><strong>项目地址</strong>：<a href="https://gitee.com/odinsam/debug-window">https://gitee.com/odinsam/debug-window</a></p><hr /><p><em>本文介绍了 odin-DebugWindows 插件的功能和使用方法。如果你在开发过程中也遇到了类似的调试困扰，不妨试试这个插件，相信它会让你事半功倍！</em></p>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;在调试过程中，你是否遇到过这样的困扰：想要查看一个复杂的数据结构（如 DataTable、List、Dictionary），但在调试窗口中只能看到简单的字符串表示，无法直观地查看数据内容？今天我要向大家介绍一款我开发的 VSCode 扩展插件——&lt;strong&gt;odin-DebugWindows&lt;/strong&gt;，它可以让调试过程变得更加高效和直观。&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="VsCode-plugin" scheme="https://odinsam.com/categories/VsCode-plugin/"/>
    
    
    <category term="VsCode-plugin" scheme="https://odinsam.com/tags/VsCode-plugin/"/>
    
    <category term="odin-DebugWindows" scheme="https://odinsam.com/tags/odin-DebugWindows/"/>
    
    <category term="DebugWindows" scheme="https://odinsam.com/tags/DebugWindows/"/>
    
  </entry>
  
  <entry>
    <title>使用sql语句替换Json类型的列中两个值</title>
    <link href="https://odinsam.com/2025/1117/c134.html"/>
    <id>https://odinsam.com/2025/1117/c134.html</id>
    <published>2025-11-17T12:34:00.000Z</published>
    <updated>2025-11-17T12:37:09.047Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>使用sql语句替换Json类型的列中两个值。</p></blockquote><figure class="highlight sql"><figcaption><span>替换目标字段</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">UPDATE</span> 表 </span><br><span class="line"><span class="keyword">SET</span> JsonResult <span class="operator">=</span> JSON_MODIFY(</span><br><span class="line">    <span class="built_in">CAST</span>(JsonResult <span class="keyword">AS</span> nvarchar(max)), </span><br><span class="line">    <span class="string">&#x27;$.目标字段&#x27;</span>, </span><br><span class="line">    <span class="built_in">JSON_VALUE</span>(<span class="built_in">CAST</span>(JsonResult <span class="keyword">AS</span> nvarchar(max)), <span class="string">&#x27;$.原字段&#x27;</span>)</span><br><span class="line">)</span><br><span class="line"><span class="keyword">WHERE</span> ISJSON(<span class="built_in">CAST</span>(JsonResult <span class="keyword">AS</span> nvarchar(max))) <span class="operator">=</span> <span class="number">1</span> </span><br><span class="line">  <span class="keyword">AND</span> <span class="built_in">JSON_VALUE</span>(<span class="built_in">CAST</span>(JsonResult <span class="keyword">AS</span> nvarchar(max)), <span class="string">&#x27;$.原字段&#x27;</span>) <span class="keyword">IS</span> <span class="keyword">NOT</span> <span class="keyword">NULL</span>;</span><br></pre></td></tr></table></figure><figure class="highlight sql"><figcaption><span>清空原值</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"> <span class="keyword">UPDATE</span> 表 </span><br><span class="line"><span class="keyword">SET</span> JsonResult <span class="operator">=</span> JSON_MODIFY(</span><br><span class="line">    <span class="built_in">CAST</span>(JsonResult <span class="keyword">AS</span> nvarchar(max)), </span><br><span class="line">    <span class="string">&#x27;$.原字段&#x27;</span>, <span class="string">&#x27;&#x27;</span></span><br><span class="line">)</span><br><span class="line"><span class="keyword">WHERE</span> ISJSON(<span class="built_in">CAST</span>(JsonResult <span class="keyword">AS</span> nvarchar(max))) <span class="operator">=</span> <span class="number">1</span>;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;使用sql语句替换Json类型的列中两个值。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure class=&quot;highlight sql&quot;&gt;&lt;figcaption&gt;&lt;span&gt;替换目标字段&lt;/span&gt;&lt;/figcaption&gt;&lt;table&gt;&lt;t</summary>
      
    
    
    
    <category term="Sql" scheme="https://odinsam.com/categories/Sql/"/>
    
    
    <category term="json列替换值" scheme="https://odinsam.com/tags/json%E5%88%97%E6%9B%BF%E6%8D%A2%E5%80%BC/"/>
    
  </entry>
  
  <entry>
    <title>使用sql命令生成数据字典</title>
    <link href="https://odinsam.com/2025/1112/db1d.html"/>
    <id>https://odinsam.com/2025/1112/db1d.html</id>
    <published>2025-11-12T02:55:00.000Z</published>
    <updated>2025-11-12T02:57:50.770Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>使用sql命令生成数据字典。</p></blockquote><span id="more"></span><figure class="highlight sql"><figcaption><span>sqlserver</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"> </span><br><span class="line"><span class="keyword">SELECT</span> </span><br><span class="line">表名 <span class="operator">=</span> <span class="keyword">CASE</span> <span class="keyword">WHEN</span> A.COLORDER<span class="operator">=</span><span class="number">1</span> <span class="keyword">THEN</span> D.NAME <span class="keyword">ELSE</span> <span class="string">&#x27;&#x27;</span> <span class="keyword">END</span>,</span><br><span class="line">表备注 <span class="operator">=</span> <span class="keyword">CASE</span> <span class="keyword">WHEN</span> A.COLORDER<span class="operator">=</span><span class="number">1</span> <span class="keyword">THEN</span> ISNULL(F.VALUE,<span class="string">&#x27;&#x27;</span>) <span class="keyword">ELSE</span> <span class="string">&#x27;&#x27;</span> <span class="keyword">END</span>,</span><br><span class="line">列序号 <span class="operator">=</span> A.COLORDER,</span><br><span class="line">列名称 <span class="operator">=</span> A.NAME,</span><br><span class="line">标识 <span class="operator">=</span> <span class="keyword">CASE</span> <span class="keyword">WHEN</span> COLUMNPROPERTY(A.ID,A.NAME,<span class="string">&#x27;ISIDENTITY&#x27;</span>)<span class="operator">=</span><span class="number">1</span> <span class="keyword">THEN</span> <span class="string">&#x27;√ &#x27;</span> <span class="keyword">ELSE</span> <span class="string">&#x27;&#x27;</span> <span class="keyword">END</span>,</span><br><span class="line">主键 <span class="operator">=</span> <span class="keyword">CASE</span> <span class="keyword">WHEN</span> <span class="keyword">EXISTS</span>(<span class="keyword">SELECT</span> <span class="number">1</span> <span class="keyword">FROM</span> SYSOBJECTS <span class="keyword">WHERE</span> XTYPE<span class="operator">=</span><span class="string">&#x27;PK&#x27;</span> <span class="keyword">AND</span> PARENT_OBJ<span class="operator">=</span>A.ID <span class="keyword">AND</span> NAME <span class="keyword">IN</span> (</span><br><span class="line"><span class="keyword">SELECT</span> NAME <span class="keyword">FROM</span> SYSINDEXES <span class="keyword">WHERE</span> INDID <span class="keyword">IN</span>(</span><br><span class="line"><span class="keyword">SELECT</span> INDID <span class="keyword">FROM</span> SYSINDEXKEYS <span class="keyword">WHERE</span> ID<span class="operator">=</span>A.ID <span class="keyword">AND</span> COLID<span class="operator">=</span>A.COLID))) <span class="keyword">THEN</span> <span class="string">&#x27;√&#x27;</span> <span class="keyword">ELSE</span> <span class="string">&#x27;&#x27;</span> <span class="keyword">END</span>,</span><br><span class="line">类型 <span class="operator">=</span> B.NAME,</span><br><span class="line">字节 <span class="operator">=</span> A.LENGTH,</span><br><span class="line">长度 <span class="operator">=</span> COLUMNPROPERTY(A.ID,A.NAME,<span class="string">&#x27;PRECISION&#x27;</span>),</span><br><span class="line">小数位 <span class="operator">=</span> ISNULL(COLUMNPROPERTY(A.ID,A.NAME,<span class="string">&#x27;SCALE&#x27;</span>),<span class="number">0</span>),</span><br><span class="line">允许空 <span class="operator">=</span> <span class="keyword">CASE</span> <span class="keyword">WHEN</span> A.ISNULLABLE<span class="operator">=</span><span class="number">1</span> <span class="keyword">THEN</span> <span class="string">&#x27;√ &#x27;</span><span class="keyword">ELSE</span> <span class="string">&#x27;&#x27;</span> <span class="keyword">END</span>,</span><br><span class="line">默认值 <span class="operator">=</span> ISNULL(E.TEXT,<span class="string">&#x27;&#x27;</span>),</span><br><span class="line">列备注 <span class="operator">=</span> ISNULL(G.[<span class="keyword">VALUE</span>],<span class="string">&#x27;&#x27;</span>)</span><br><span class="line"><span class="keyword">FROM</span> </span><br><span class="line">SYSCOLUMNS A</span><br><span class="line"><span class="keyword">LEFT</span> <span class="keyword">JOIN</span> SYSTYPES B <span class="keyword">ON</span> A.XUSERTYPE<span class="operator">=</span>B.XUSERTYPE</span><br><span class="line"><span class="keyword">INNER</span> <span class="keyword">JOIN</span> SYSOBJECTS D <span class="keyword">ON</span> A.ID<span class="operator">=</span>D.ID <span class="keyword">AND</span> D.XTYPE<span class="operator">=</span><span class="string">&#x27;U &#x27;</span> <span class="comment">--AND D.NAME&lt;&gt;&#x27;DTPROPERTIES&#x27;</span></span><br><span class="line"><span class="keyword">LEFT</span> <span class="keyword">JOIN</span> SYSCOMMENTS E <span class="keyword">ON</span> A.CDEFAULT<span class="operator">=</span>E.ID</span><br><span class="line"><span class="keyword">LEFT</span> <span class="keyword">JOIN</span> sys.extended_properties G <span class="keyword">ON</span> A.ID<span class="operator">=</span>G.major_id <span class="keyword">AND</span> A.COLID<span class="operator">=</span>G.minor_id   </span><br><span class="line"><span class="keyword">LEFT</span> <span class="keyword">JOIN</span> sys.extended_properties F <span class="keyword">ON</span> D.ID<span class="operator">=</span>F.major_id <span class="keyword">AND</span> F.minor_id<span class="operator">=</span><span class="number">0</span></span><br><span class="line"><span class="comment">--where D.NAME=&#x27;tbname&#x27;   --查询这个表</span></span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> A.ID,A.COLORDER </span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><figcaption><span>mysql</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">select</span><br><span class="line">c.table_name as 表名,</span><br><span class="line">    t.TABLE_COMMENT as 表名描述,</span><br><span class="line">    c.column_name as 字段名称,</span><br><span class="line">    c.column_type as 数据类型,</span><br><span class="line">c.DATA_TYPE AS 字段类型,</span><br><span class="line">c.CHARACTER_MAXIMUM_LENGTH AS 长度,</span><br><span class="line"> </span><br><span class="line">c.COLUMN_DEFAULT as 默认值,</span><br><span class="line">    if(c.column_key = &#x27;PRI&#x27;,&#x27;Y&#x27;,&#x27;N&#x27;) as 主键,</span><br><span class="line">    if(c.is_nullable=&#x27;no&#x27;,&#x27;Y&#x27;,&#x27;N&#x27;) as 非空,</span><br><span class="line">    c.column_comment as 注释</span><br><span class="line">from</span><br><span class="line">information_schema.columns c</span><br><span class="line">left join</span><br><span class="line">information_schema.tables t</span><br><span class="line">on c.table_name=t.table_name </span><br><span class="line">where c.TABLE_SCHEMA=&#x27;XXXX&#x27; -- 指定库</span><br><span class="line">and t.TABLE_SCHEMA=&#x27;XXXX&#x27; -- 指定库</span><br><span class="line">-- and c.table_name like &#x27;abc_%&#x27;  -- 我这里是导出以abc_开头的表  </span><br></pre></td></tr></table></figure><p>生成后，导出数据到excel即可。</p>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;使用sql命令生成数据字典。&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="SqlServer" scheme="https://odinsam.com/categories/SqlServer/"/>
    
    <category term="MySql" scheme="https://odinsam.com/categories/SqlServer/MySql/"/>
    
    
    <category term="数据字典" scheme="https://odinsam.com/tags/%E6%95%B0%E6%8D%AE%E5%AD%97%E5%85%B8/"/>
    
    <category term="sqlserver" scheme="https://odinsam.com/tags/sqlserver/"/>
    
    <category term="mysql" scheme="https://odinsam.com/tags/mysql/"/>
    
  </entry>
  
  <entry>
    <title>netcore 基于orm查询的条件拼接</title>
    <link href="https://odinsam.com/2025/1106/bb0d.html"/>
    <id>https://odinsam.com/2025/1106/bb0d.html</id>
    <published>2025-11-06T09:50:00.000Z</published>
    <updated>2025-11-06T09:57:22.541Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>netcore 基于orm查询的条件拼接。</p></blockquote><span id="more"></span><h4 id="帮助类"><a class="markdownIt-Anchor" href="#帮助类"></a> 帮助类</h4><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> System;</span><br><span class="line"><span class="keyword">using</span> System.Collections.Generic;</span><br><span class="line"><span class="keyword">using</span> System.Linq;</span><br><span class="line"><span class="keyword">using</span> System.Text.Json;</span><br><span class="line"><span class="keyword">using</span> Insurance.Api.Model.Models.Labour;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Insurance.Application.Helpers</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> LabourRecord 查询辅助类</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> 用于处理 JsonResult 中的数据查询和日期比较</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title">LabourRecordQueryHelper</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> 查询条件委托</span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="built_in">delegate</span> <span class="built_in">bool</span> <span class="title">QueryCondition</span>(<span class="params">Dictionary&lt;<span class="built_in">string</span>, <span class="built_in">string</span>&gt; jsonData</span>)</span>;</span><br><span class="line"></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> 创建简单的相等条件</span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;fieldName&quot;&gt;</span>字段名<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;value&quot;&gt;</span>值<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>查询条件<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> QueryCondition <span class="title">CreateEqualCondition</span>(<span class="params"><span class="built_in">string</span> fieldName, <span class="built_in">string</span> <span class="keyword">value</span></span>)</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> (jsonData) =&gt; jsonData.GetFieldValue(fieldName) == <span class="keyword">value</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> 创建简单的相等条件</span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;fieldName&quot;&gt;</span>字段名<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;value&quot;&gt;</span>值<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>查询条件<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> QueryCondition <span class="title">CreateNotEqualCondition</span>(<span class="params"><span class="built_in">string</span> fieldName, <span class="built_in">string</span> <span class="keyword">value</span></span>)</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> (jsonData) =&gt; jsonData.GetFieldValue(fieldName) != <span class="keyword">value</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> 创建日期大于条件</span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;fieldName&quot;&gt;</span>字段名<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;dateValue&quot;&gt;</span>日期值<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>查询条件<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> QueryCondition <span class="title">CreateDateGreaterThanCondition</span>(<span class="params"><span class="built_in">string</span> fieldName, <span class="built_in">string</span> dateValue</span>)</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> (jsonData) =&gt; IsDateGreaterThan(jsonData.GetFieldValue(fieldName), dateValue);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> 创建日期小于条件</span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;fieldName&quot;&gt;</span>字段名<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;dateValue&quot;&gt;</span>日期值<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>查询条件<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> QueryCondition <span class="title">CreateDateLessThanCondition</span>(<span class="params"><span class="built_in">string</span> fieldName, <span class="built_in">string</span> dateValue</span>)</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> (jsonData) =&gt; IsDateLessThan(jsonData.GetFieldValue(fieldName), dateValue);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> 创建日期等于条件</span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;fieldName&quot;&gt;</span>字段名<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;dateValue&quot;&gt;</span>日期值<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>查询条件<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> QueryCondition <span class="title">CreateDateEqualCondition</span>(<span class="params"><span class="built_in">string</span> fieldName, <span class="built_in">string</span> dateValue</span>)</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> (jsonData) =&gt; IsDateEqual(jsonData.GetFieldValue(fieldName), dateValue);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> 创建日期大于等于条件</span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;fieldName&quot;&gt;</span>字段名<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;dateValue&quot;&gt;</span>日期值<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>查询条件<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> QueryCondition <span class="title">CreateDateGreaterThanOrEqualCondition</span>(<span class="params"><span class="built_in">string</span> fieldName, <span class="built_in">string</span> dateValue</span>)</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> (jsonData) =&gt; IsDateGreaterThanOrEqual(jsonData.GetFieldValue(fieldName), dateValue);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> 创建日期小于等于条件</span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;fieldName&quot;&gt;</span>字段名<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;dateValue&quot;&gt;</span>日期值<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>查询条件<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> QueryCondition <span class="title">CreateDateLessThanOrEqualCondition</span>(<span class="params"><span class="built_in">string</span> fieldName, <span class="built_in">string</span> dateValue</span>)</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> (jsonData) =&gt; IsDateLessThanOrEqual(jsonData.GetFieldValue(fieldName), dateValue);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> 创建字段 IndexOf 条件</span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> 如：P11.IndexOf(&quot;12&quot;) &gt; -1 表示 P11 包含 &quot;12&quot;</span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;fieldName&quot;&gt;</span>字段名<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;searchValue&quot;&gt;</span>要查找的值<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;compareValue&quot;&gt;</span>比较值（通常是 -1 用于检查是否包含）<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;comparison&quot;&gt;</span>比较类型：&gt;, <span class="doctag">&lt;, ==, !=, &gt;</span>=, <span class="doctag">&lt;=&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>查询条件<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> QueryCondition <span class="title">CreateIndexOfCondition</span>(<span class="params"></span></span></span><br><span class="line"><span class="params"><span class="function">            <span class="built_in">string</span> fieldName,</span></span></span><br><span class="line"><span class="params"><span class="function">            <span class="built_in">string</span> searchValue,</span></span></span><br><span class="line"><span class="params"><span class="function">            <span class="built_in">int</span> compareValue,</span></span></span><br><span class="line"><span class="params"><span class="function">            <span class="built_in">string</span> comparison = <span class="string">&quot;&gt;&quot;</span></span>)</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> (jsonData) =&gt;</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">var</span> fieldValue = jsonData.GetFieldValue(fieldName);</span><br><span class="line">                <span class="keyword">if</span> (<span class="built_in">string</span>.IsNullOrEmpty(fieldValue))</span><br><span class="line">                &#123;</span><br><span class="line">                    <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">var</span> indexOfResult = fieldValue.IndexOf(searchValue, StringComparison.Ordinal);</span><br><span class="line"></span><br><span class="line">                <span class="keyword">return</span> comparison <span class="keyword">switch</span></span><br><span class="line">                &#123;</span><br><span class="line">                    <span class="string">&quot;&gt;&quot;</span> =&gt; indexOfResult &gt; compareValue,</span><br><span class="line">                    <span class="string">&quot;&lt;&quot;</span> =&gt; indexOfResult &lt; compareValue,</span><br><span class="line">                    <span class="string">&quot;==&quot;</span> =&gt; indexOfResult == compareValue,</span><br><span class="line">                    <span class="string">&quot;!=&quot;</span> =&gt; indexOfResult != compareValue,</span><br><span class="line">                    <span class="string">&quot;&gt;=&quot;</span> =&gt; indexOfResult &gt;= compareValue,</span><br><span class="line">                    <span class="string">&quot;&lt;=&quot;</span> =&gt; indexOfResult &lt;= compareValue,</span><br><span class="line">                    _ =&gt; <span class="keyword">throw</span> <span class="keyword">new</span> ArgumentException(<span class="string">$&quot;不支持的比较类型: <span class="subst">&#123;comparison&#125;</span>&quot;</span>)</span><br><span class="line">                &#125;;</span><br><span class="line">            &#125;;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> 创建字段包含检查条件（简化的 IndexOf &gt; -1）</span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;fieldName&quot;&gt;</span>字段名<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;searchValue&quot;&gt;</span>要查找的值<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>查询条件<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> QueryCondition <span class="title">CreateContainsCondition</span>(<span class="params"><span class="built_in">string</span> fieldName, <span class="built_in">string</span> searchValue</span>)</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> CreateIndexOfCondition(fieldName, searchValue, <span class="number">-1</span>, <span class="string">&quot;&gt;&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> 创建常量字符串 IndexOf 条件</span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> 如：&quot;12&quot;.IndexOf(S15) &gt; -1 表示 &quot;12&quot; 包含 S15 的值</span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;constantString&quot;&gt;</span>常量字符串<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;fieldName&quot;&gt;</span>字段名<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;compareValue&quot;&gt;</span>比较值（通常是 -1 用于检查是否包含）<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;comparison&quot;&gt;</span>比较类型：&gt;, <span class="doctag">&lt;, ==, !=, &gt;</span>=, <span class="doctag">&lt;=&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>查询条件<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> QueryCondition <span class="title">CreateConstantIndexOfCondition</span>(<span class="params"></span></span></span><br><span class="line"><span class="params"><span class="function">            <span class="built_in">string</span> constantString,</span></span></span><br><span class="line"><span class="params"><span class="function">            <span class="built_in">string</span> fieldName,</span></span></span><br><span class="line"><span class="params"><span class="function">            <span class="built_in">int</span> compareValue,</span></span></span><br><span class="line"><span class="params"><span class="function">            <span class="built_in">string</span> comparison = <span class="string">&quot;&gt;&quot;</span></span>)</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> (jsonData) =&gt;</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">var</span> fieldValue = jsonData.GetFieldValue(fieldName);</span><br><span class="line">                <span class="keyword">if</span> (<span class="built_in">string</span>.IsNullOrEmpty(fieldValue))</span><br><span class="line">                &#123;</span><br><span class="line">                    <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">var</span> indexOfResult = constantString.IndexOf(fieldValue, StringComparison.Ordinal);</span><br><span class="line"></span><br><span class="line">                <span class="keyword">return</span> comparison <span class="keyword">switch</span></span><br><span class="line">                &#123;</span><br><span class="line">                    <span class="string">&quot;&gt;&quot;</span> =&gt; indexOfResult &gt; compareValue,</span><br><span class="line">                    <span class="string">&quot;&lt;&quot;</span> =&gt; indexOfResult &lt; compareValue,</span><br><span class="line">                    <span class="string">&quot;==&quot;</span> =&gt; indexOfResult == compareValue,</span><br><span class="line">                    <span class="string">&quot;!=&quot;</span> =&gt; indexOfResult != compareValue,</span><br><span class="line">                    <span class="string">&quot;&gt;=&quot;</span> =&gt; indexOfResult &gt;= compareValue,</span><br><span class="line">                    <span class="string">&quot;&lt;=&quot;</span> =&gt; indexOfResult &lt;= compareValue,</span><br><span class="line">                    _ =&gt; <span class="keyword">throw</span> <span class="keyword">new</span> ArgumentException(<span class="string">$&quot;不支持的比较类型: <span class="subst">&#123;comparison&#125;</span>&quot;</span>)</span><br><span class="line">                &#125;;</span><br><span class="line">            &#125;;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> 创建常量字符串包含字段值检查条件（简化的常量 IndexOf &gt; -1）</span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;constantString&quot;&gt;</span>常量字符串<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;fieldName&quot;&gt;</span>字段名<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>查询条件<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> QueryCondition <span class="title">CreateConstantContainsCondition</span>(<span class="params"><span class="built_in">string</span> constantString, <span class="built_in">string</span> fieldName</span>)</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> CreateConstantIndexOfCondition(constantString, fieldName, <span class="number">-1</span>, <span class="string">&quot;&gt;&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> 创建字段 SubString 条件</span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;fieldName&quot;&gt;</span>字段名<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;start&quot;&gt;</span>起始位置<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;length&quot;&gt;</span>长度<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;compareValue&quot;&gt;</span>比较值<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;comparison&quot;&gt;</span>比较类型：==, !=<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>查询条件<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> QueryCondition <span class="title">CreateSubStringCondition</span>(<span class="params"></span></span></span><br><span class="line"><span class="params"><span class="function">            <span class="built_in">string</span> fieldName,</span></span></span><br><span class="line"><span class="params"><span class="function">            <span class="built_in">int</span> start,</span></span></span><br><span class="line"><span class="params"><span class="function">            <span class="built_in">int</span> length,</span></span></span><br><span class="line"><span class="params"><span class="function">            <span class="built_in">string</span> compareValue,</span></span></span><br><span class="line"><span class="params"><span class="function">            <span class="built_in">string</span> comparison = <span class="string">&quot;==&quot;</span></span>)</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> (jsonData) =&gt;</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">var</span> fieldValue = jsonData.GetFieldValue(fieldName);</span><br><span class="line">                <span class="keyword">if</span> (<span class="built_in">string</span>.IsNullOrEmpty(fieldValue) || fieldValue.Length &lt; start + length)</span><br><span class="line">                &#123;</span><br><span class="line">                    <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">var</span> subString = fieldValue.Substring(start, length);</span><br><span class="line"></span><br><span class="line">                <span class="keyword">return</span> comparison <span class="keyword">switch</span></span><br><span class="line">                &#123;</span><br><span class="line">                    <span class="string">&quot;==&quot;</span> =&gt; subString == compareValue,</span><br><span class="line">                    <span class="string">&quot;!=&quot;</span> =&gt; subString != compareValue,</span><br><span class="line">                    _ =&gt; <span class="keyword">throw</span> <span class="keyword">new</span> ArgumentException(<span class="string">$&quot;SubString 只支持 == 或 != 比较&quot;</span>)</span><br><span class="line">                &#125;;</span><br><span class="line">            &#125;;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> 组合多个条件（AND）</span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;conditions&quot;&gt;</span>条件数组<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>组合后的查询条件<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> QueryCondition <span class="title">CombineAnd</span>(<span class="params"><span class="keyword">params</span> QueryCondition[] conditions</span>)</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> (jsonData) =&gt; conditions.All(condition =&gt; condition(jsonData));</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> 组合多个条件（OR）</span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;conditions&quot;&gt;</span>条件数组<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line">        <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span>组合后的查询条件<span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> QueryCondition <span class="title">CombineOr</span>(<span class="params"><span class="keyword">params</span> QueryCondition[] conditions</span>)</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> (jsonData) =&gt; conditions.Any(condition =&gt; condition(jsonData));</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h4 id="调用方法"><a class="markdownIt-Anchor" href="#调用方法"></a> 调用方法</h4><figure class="highlight csharp"><figcaption><span>见分进元</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> LabourRecordQueryHelper.<span class="function">QueryCondition <span class="title">GetQueryCondition</span>(<span class="params"></span></span></span><br><span class="line"><span class="params"><span class="function">        <span class="built_in">string</span> startDate,</span></span></span><br><span class="line"><span class="params"><span class="function">        <span class="built_in">string</span> endDate</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="comment">// 实现你的查询条件逻辑</span></span><br><span class="line">        <span class="keyword">var</span> condition1 = LabourRecordQueryHelper.CreateEqualCondition(<span class="string">&quot;S15&quot;</span>, <span class="string">&quot;1&quot;</span>);</span><br><span class="line">        <span class="keyword">var</span> condition2 = LabourRecordQueryHelper.CreateSubStringCondition(<span class="string">&quot;P11&quot;</span>, <span class="number">0</span>, <span class="number">2</span>, <span class="string">&quot;00&quot;</span>, <span class="string">&quot;!=&quot;</span>);</span><br><span class="line">        <span class="keyword">var</span> conditionResult1 = LabourRecordQueryHelper.CombineAnd(condition1, condition2);</span><br><span class="line"></span><br><span class="line">        LabourRecordQueryHelper.QueryCondition condition3 = LabourRecordQueryHelper.CreateNotEqualCondition(<span class="string">&quot;G62&quot;</span>, <span class="string">&quot;是&quot;</span>);</span><br><span class="line">        LabourRecordQueryHelper.QueryCondition condition4 = LabourRecordQueryHelper.CreateNotEqualCondition(<span class="string">&quot;G62&quot;</span>, <span class="string">&quot;T&quot;</span>);</span><br><span class="line">        <span class="keyword">var</span> conditionResult2 = LabourRecordQueryHelper.CombineAnd(condition3, condition4);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> LabourRecordQueryHelper.CombineAnd(conditionResult1, conditionResult2);</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;netcore 基于orm查询的条件拼接。&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term=".Net Core" scheme="https://odinsam.com/categories/Net-Core/"/>
    
    
    <category term=".Net Core" scheme="https://odinsam.com/tags/Net-Core/"/>
    
    <category term="条件拼接" scheme="https://odinsam.com/tags/%E6%9D%A1%E4%BB%B6%E6%8B%BC%E6%8E%A5/"/>
    
  </entry>
  
  <entry>
    <title>c# 实现round、roundup以及roundDown</title>
    <link href="https://odinsam.com/2025/1106/2161.html"/>
    <id>https://odinsam.com/2025/1106/2161.html</id>
    <published>2025-11-06T09:44:00.000Z</published>
    <updated>2025-11-06T09:49:25.855Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>文章主要讲述了在 c# 中实现round、roundup以及roundDown</p></blockquote><span id="more"></span><figure class="highlight csharp"><figcaption><span>round</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Math.Round(<span class="keyword">value</span>, 保留小数位数, MidpointRounding.AwayFromZero)</span><br></pre></td></tr></table></figure><figure class="highlight csharp"><figcaption><span>roundup</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">value</span> &gt;= <span class="number">0</span> ? Math.Ceiling(<span class="keyword">value</span> * (<span class="built_in">decimal</span>)Math.Pow(<span class="number">10</span>, 保留小数位数)) / (<span class="built_in">decimal</span>)Math.Pow(<span class="number">10</span>, 保留小数位数) : Math.Floor(<span class="keyword">value</span> * (<span class="built_in">decimal</span>)Math.Pow(<span class="number">10</span>, 保留小数位数)) / (<span class="built_in">decimal</span>)Math.Pow(<span class="number">10</span>, 保留小数位数);</span><br></pre></td></tr></table></figure><figure class="highlight csharp"><figcaption><span>rounddown</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">value</span> &gt;= <span class="number">0</span> ? Math.Floor(<span class="keyword">value</span> * (<span class="built_in">decimal</span>)Math.Pow(<span class="number">10</span>, 保留小数位数)) / (<span class="built_in">decimal</span>)Math.Pow(<span class="number">10</span>, 保留小数位数) : Math.Ceiling(<span class="keyword">value</span> * (<span class="built_in">decimal</span>)Math.Pow(<span class="number">10</span>, 保留小数位数)) / (<span class="built_in">decimal</span>)Math.Pow(<span class="number">10</span>, 保留小数位数)</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;文章主要讲述了在 c# 中实现round、roundup以及roundDown&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="c#" scheme="https://odinsam.com/categories/c/"/>
    
    
    <category term="c#" scheme="https://odinsam.com/tags/c/"/>
    
    <category term="round" scheme="https://odinsam.com/tags/round/"/>
    
    <category term="roundup" scheme="https://odinsam.com/tags/roundup/"/>
    
    <category term="rounddown" scheme="https://odinsam.com/tags/rounddown/"/>
    
  </entry>
  
  <entry>
    <title>Vscode和Rider配置Asp.NetCore 调试和发布项目</title>
    <link href="https://odinsam.com/2025/0523/4ac0.html"/>
    <id>https://odinsam.com/2025/0523/4ac0.html</id>
    <published>2025-05-23T02:04:00.000Z</published>
    <updated>2025-05-23T03:07:12.377Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>文章主要讲述了 Asp.NetCore 在 VsCode 和 Rider 中配置带参数调试和发布项目。</p></blockquote><span id="more"></span><h4 id="1-vscode-中配置调试"><a class="markdownIt-Anchor" href="#1-vscode-中配置调试"></a> 1. VsCode 中配置调试</h4><h5 id="11-launchjson-文件配置"><a class="markdownIt-Anchor" href="#11-launchjson-文件配置"></a> 1.1 launch.json 文件配置</h5><figure class="highlight json"><figcaption><span>launch.json</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;version&quot;</span><span class="punctuation">:</span> <span class="string">&quot;0.2.0&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;configurations&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="comment">// 整个配置可以配置多个，启动时在 VsCode 的调试启动下拉列表中</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="comment">// 调试配置的名称，会显示在 VsCode 的调试启动下拉列表中</span></span><br><span class="line">            <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;asp.netcore -1 &quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="comment">// 指定调试器类型，coreclr 用于 .NET Core 应用程序</span></span><br><span class="line">            <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;coreclr&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="comment">// 指定调试模式为&quot;启动&quot;（而非&quot;附加&quot;到已运行的进程）。</span></span><br><span class="line">            <span class="attr">&quot;request&quot;</span><span class="punctuation">:</span> <span class="string">&quot;launch&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="comment">// 在开始调试前执行的任务，这里会执行名为 &quot;build-xxx&quot; 的构建任务（通常在 tasks.json 中定义）。</span></span><br><span class="line">            <span class="attr">&quot;preLaunchTask&quot;</span><span class="punctuation">:</span> <span class="string">&quot;build-xxx&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="comment">// 指定要调试的程序路径：</span></span><br><span class="line">            <span class="comment">// $&#123;workspaceFolder&#125;: VS Code 工作区根目录</span></span><br><span class="line">            <span class="comment">// 指向 xxxProject 项目的 net8.0 调试版本的 DLL 文件</span></span><br><span class="line">            <span class="attr">&quot;program&quot;</span><span class="punctuation">:</span> <span class="string">&quot;$&#123;workspaceFolder&#125;/xxxProject/bin/Debug/net8.0/xxx.dll&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="comment">// 传递给应用程序的命令行参数：</span></span><br><span class="line">            <span class="comment">// --devConfig xxxArg: 指定使用名为 &quot;xxxArg&quot; 的开发配置</span></span><br><span class="line">            <span class="attr">&quot;args&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">                <span class="string">&quot;--devConfig&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;xxxArg&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">            <span class="comment">// 设置工作目录为 xxxProject 项目目录</span></span><br><span class="line">            <span class="attr">&quot;cwd&quot;</span><span class="punctuation">:</span> <span class="string">&quot;$&#123;workspaceFolder&#125;/xxxProject&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="comment">// 是否在程序入口点自动暂停，false 表示不暂停。</span></span><br><span class="line">            <span class="attr">&quot;stopAtEntry&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">            <span class="comment">// 当检测到服务器就绪时的操作：</span></span><br><span class="line">            <span class="comment">// action: &quot;openExternally&quot; 表示在外部浏览器中打开</span></span><br><span class="line">            <span class="comment">// pattern: 用于从控制台输出中提取 URL 的正则表达式（匹配 &quot;Now listening on:&quot; 后的 URL）</span></span><br><span class="line">            <span class="attr">&quot;serverReadyAction&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">                <span class="attr">&quot;action&quot;</span><span class="punctuation">:</span> <span class="string">&quot;openExternally&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="attr">&quot;pattern&quot;</span><span class="punctuation">:</span> <span class="string">&quot;\\bNow listening on:\\s+(https?://\\S+)&quot;</span></span><br><span class="line">            <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="comment">// 设置环境变量：</span></span><br><span class="line">            <span class="comment">// ASPNETCORE_ENVIRONMENT: 设置为 &quot;Development&quot;，表示这是开发环境</span></span><br><span class="line">            <span class="attr">&quot;env&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">                <span class="attr">&quot;ASPNETCORE_ENVIRONMENT&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Development&quot;</span></span><br><span class="line">            <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="comment">// 映射编译路径到源文件路径：</span></span><br><span class="line">            <span class="comment">// 将运行时路径 &quot;/Views&quot; 映射到本地工作区的 &quot;Insurance.Api/Views&quot; 目录</span></span><br><span class="line">            <span class="attr">&quot;sourceFileMap&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">                <span class="attr">&quot;/Views&quot;</span><span class="punctuation">:</span> <span class="string">&quot;$&#123;workspaceFolder&#125;/xxxProject/Views&quot;</span></span><br><span class="line">            <span class="punctuation">&#125;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h5 id="12-taskjson-文件配置"><a class="markdownIt-Anchor" href="#12-taskjson-文件配置"></a> 1.2 task.json 文件配置</h5><figure class="highlight json"><figcaption><span>task.json</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;version&quot;</span><span class="punctuation">:</span> <span class="string">&quot;2.0.0&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="comment">// demo 共配置了两个任务 win F1 mac fn+F1  run task 选择执行</span></span><br><span class="line">    <span class="attr">&quot;tasks&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="comment">// 配置的第一个任务 build-xxx 和 上边 launch.json 中配置的 preLaunchTask 关联 用于launch.json中配置启动项目在启动前先编译项目</span></span><br><span class="line">         <span class="punctuation">&#123;</span></span><br><span class="line">         <span class="comment">// 任务的名称，在 VsCode 中引用这个任务时会用到（如在 launch.json 的 preLaunchTask 中）</span></span><br><span class="line">            <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="string">&quot;build-xxx&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="comment">// 要执行的命令，这里是 .NET CLI</span></span><br><span class="line">            <span class="attr">&quot;command&quot;</span><span class="punctuation">:</span> <span class="string">&quot;dotnet&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="comment">// 任务类型，表示将作为独立进程运行</span></span><br><span class="line">            <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;process&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="comment">// build: 执行构建操作</span></span><br><span class="line">            <span class="comment">// $&#123;workspaceFolder&#125;/xxxProject/xxxProject.csproj: 要构建的项目文件路径</span></span><br><span class="line">            <span class="comment">// /property:GenerateFullPaths=true: 生成完整路径（便于错误定位）</span></span><br><span class="line">            <span class="comment">// /consoleloggerparameters:NoSummary: 控制台输出不显示摘要信息</span></span><br><span class="line">            <span class="attr">&quot;args&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">                <span class="string">&quot;build&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;$&#123;workspaceFolder&#125;/xxxProject/xxxProject.csproj&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;/property:GenerateFullPaths=true&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;/consoleloggerparameters:NoSummary&quot;</span></span><br><span class="line">            <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">            <span class="comment">// 使用 VsCode 内置的 MSBuild 问题匹配器，可以解析构建错误和警告</span></span><br><span class="line">            <span class="attr">&quot;problemMatcher&quot;</span><span class="punctuation">:</span> <span class="string">&quot;$msCompile&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="comment">// 配置的第二个任务， 用于发布项目</span></span><br><span class="line">        <span class="punctuation">&#123;</span></span><br><span class="line">            <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="string">&quot;publish-release-xxx&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;command&quot;</span><span class="punctuation">:</span> <span class="string">&quot;dotnet&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;type&quot;</span><span class="punctuation">:</span> <span class="string">&quot;process&quot;</span><span class="punctuation">,</span></span><br><span class="line">            <span class="comment">// 执行参数  当前示例中的参数 都和 dotnet publish 相关。</span></span><br><span class="line">            <span class="comment">/*</span></span><br><span class="line"><span class="comment">            args: 发布命令的详细参数</span></span><br><span class="line"><span class="comment">publish: 执行发布操作</span></span><br><span class="line"><span class="comment">项目文件路径</span></span><br><span class="line"><span class="comment">-c Release: 使用 Release 配置构建</span></span><br><span class="line"><span class="comment">-p:Platform=AnyCPU: 指定目标平台为 AnyCPU</span></span><br><span class="line"><span class="comment">--framework net8.0: 目标框架是 .NET 8.0</span></span><br><span class="line"><span class="comment">-o /Users/odinsam/gitee/xxx/serverPublish: 输出目录</span></span><br><span class="line"><span class="comment">--self-contained false: 非自包含部署（需要目标机器有 .NET 运行时）</span></span><br><span class="line"><span class="comment">/p:Version=1.0.0: 设置版本号为 1.0.0</span></span><br><span class="line"><span class="comment">/p:DevConfig=xxx: 重要参数！指定开发配置为&quot;xxx&quot;</span></span><br><span class="line"><span class="comment">            */</span></span><br><span class="line">            <span class="attr">&quot;args&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">                <span class="string">&quot;publish&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;$&#123;workspaceFolder&#125;/xxxProject/xxxProject.csproj&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;-c&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;Release&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;-p:Platform=AnyCPU&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;--framework&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;net8.0&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;-o&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;/Users/odinsam/gitee/xxx/serverPublish&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;--self-contained&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;false&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;/p:Version=1.0.0&quot;</span><span class="punctuation">,</span></span><br><span class="line">                <span class="string">&quot;/p:DevConfig=xxx&quot;</span></span><br><span class="line">            <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">            <span class="attr">&quot;problemMatcher&quot;</span><span class="punctuation">:</span> <span class="string">&quot;$msCompile&quot;</span></span><br><span class="line">        <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h4 id="2-在rider中配置调试"><a class="markdownIt-Anchor" href="#2-在rider中配置调试"></a> 2. 在Rider中配置调试</h4><h5 id="21-launchsettingsjson-配置"><a class="markdownIt-Anchor" href="#21-launchsettingsjson-配置"></a> 2.1 launchSettings.json 配置</h5><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;$schema&quot;</span><span class="punctuation">:</span> <span class="string">&quot;http://json.schemastore.org/launchsettings.json&quot;</span><span class="punctuation">,</span></span><br><span class="line">  </span><br><span class="line">  <span class="comment">/*</span></span><br><span class="line"><span class="comment">  IIS 设置部分</span></span><br><span class="line"><span class="comment">  windowsAuthentication: false - 禁用 Windows 身份验证</span></span><br><span class="line"><span class="comment">anonymousAuthentication: true - 启用匿名身份验证</span></span><br><span class="line"><span class="comment">iisExpress:</span></span><br><span class="line"><span class="comment">applicationUrl: IIS Express 使用的 URL (http://localhost:60716)</span></span><br><span class="line"><span class="comment">sslPort: 0 表示不使用 SSL</span></span><br><span class="line"><span class="comment">  */</span></span><br><span class="line">  <span class="attr">&quot;iisSettings&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;windowsAuthentication&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;anonymousAuthentication&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;iisExpress&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;applicationUrl&quot;</span><span class="punctuation">:</span> <span class="string">&quot;http://localhost:60716&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;sslPort&quot;</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="comment">// 配置环境 (profiles) 定义了多个启动配置环境，可以通过 Visual Studio 或 CLI 选择使用哪个配置启动项目。</span></span><br><span class="line">  <span class="attr">&quot;profiles&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">  <span class="comment">// xxxProject 配置 (xxxProject.config)</span></span><br><span class="line">    <span class="comment">/*</span></span><br><span class="line"><span class="comment">    commandName: &quot;Project&quot; - 直接运行项目（使用 Kestrel 服务器）</span></span><br><span class="line"><span class="comment">launchBrowser: true - 启动后自动打开浏览器</span></span><br><span class="line"><span class="comment">applicationUrl: 应用监听的 URL (http://localhost:8081)</span></span><br><span class="line"><span class="comment">environmentVariables:</span></span><br><span class="line"><span class="comment">ASPNETCORE_ENVIRONMENT: &quot;Development&quot; - 设置环境为开发环境</span></span><br><span class="line"><span class="comment">    commandLineArgs: &quot;--devConfig=xxx&quot; - 传递命令行参数,多个参数用 空格 分开</span></span><br><span class="line"><span class="comment">    */</span></span><br><span class="line">    <span class="attr">&quot;xxxProject.config&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;commandName&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Project&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;launchBrowser&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;applicationUrl&quot;</span><span class="punctuation">:</span> <span class="string">&quot;http://localhost:8081&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;environmentVariables&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;ASPNETCORE_ENVIRONMENT&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Development&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;commandLineArgs&quot;</span><span class="punctuation">:</span> <span class="string">&quot;--devConfig=xxx&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="comment">// IIS Express 配置</span></span><br><span class="line">    <span class="comment">/*</span></span><br><span class="line"><span class="comment">    commandName: &quot;IISExpress&quot; - 使用 IIS Express 作为服务器</span></span><br><span class="line"><span class="comment">launchBrowser: true - 启动后自动打开浏览器</span></span><br><span class="line"><span class="comment">environmentVariables:</span></span><br><span class="line"><span class="comment">ASPNETCORE_ENVIRONMENT: &quot;Development&quot; - 开发环境</span></span><br><span class="line"><span class="comment">    */</span></span><br><span class="line">    <span class="attr">&quot;IIS Express&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;commandName&quot;</span><span class="punctuation">:</span> <span class="string">&quot;IISExpress&quot;</span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;launchBrowser&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line">      <span class="attr">&quot;environmentVariables&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;ASPNETCORE_ENVIRONMENT&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Development&quot;</span></span><br><span class="line">      <span class="punctuation">&#125;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h4 id="3-发布项目"><a class="markdownIt-Anchor" href="#3-发布项目"></a> 3. 发布项目</h4><h5 id="31-发布项目的配置"><a class="markdownIt-Anchor" href="#31-发布项目的配置"></a> 3.1 发布项目的配置</h5><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br></pre></td><td class="code"><pre><span class="line">&lt;Project Sdk=&quot;Microsoft.NET.Sdk.Web&quot;&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!-- 构建时先编译ConfigMerger --&gt;</span><br><span class="line">    &lt;!-- </span><br><span class="line">    自定义构建目标 - BuildConfigMerger</span><br><span class="line">    BeforeTargets=&quot;BeforeBuild&quot;: 在常规构建之前执行</span><br><span class="line">删除发布目录（如果存在）</span><br><span class="line">构建配置合并工具项目</span><br><span class="line">    --&gt;</span><br><span class="line">    &lt;Target Name=&quot;BuildConfigMerger&quot; BeforeTargets=&quot;BeforeBuild&quot;&gt;</span><br><span class="line">        &lt;RemoveDir Directories=&quot;$(PublishDir)&quot; Condition=&quot;Exists(&#x27;$(PublishDir)&#x27;)&quot;/&gt;</span><br><span class="line">        &lt;MSBuild Projects=&quot;$(ConfigMergerProj)&quot; Targets=&quot;Build&quot; Properties=&quot;Configuration=$(Configuration)&quot;/&gt;</span><br><span class="line">    &lt;/Target&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!-- 发布时合并配置 --&gt;</span><br><span class="line">    &lt;!-- </span><br><span class="line">    自定义发布目标 - MergeAppSettings AfterTargets=&quot;Publish&quot;: 在发布完成后执行</span><br><span class="line">    --&gt;</span><br><span class="line">    &lt;Target Name=&quot;MergeAppSettings&quot; AfterTargets=&quot;Publish&quot;&gt;</span><br><span class="line">        &lt;PropertyGroup&gt;</span><br><span class="line">            &lt;PublishDir&gt;$([MSBuild]::NormalizePath(&#x27;$(PublishDir)&#x27;))&lt;/PublishDir&gt;</span><br><span class="line">            &lt;!-- 发布项目时 DevConfig对应的参数，发布时可以手动修改参数 --&gt;</span><br><span class="line">            &lt;DevConfig Condition=&quot;&#x27;$(DevConfig)&#x27; == &#x27;&#x27;&quot;&gt;xxx&lt;/DevConfig&gt;</span><br><span class="line">            &lt;MergedConfigFile&gt;$(PublishDir)appsettings.json&lt;/MergedConfigFile&gt;</span><br><span class="line">            &lt;!-- 要保留的文件名 --&gt;</span><br><span class="line">            &lt;ConfigToKeep&gt;appsettings.json&lt;/ConfigToKeep&gt;</span><br><span class="line">        &lt;/PropertyGroup&gt;</span><br><span class="line"></span><br><span class="line">        &lt;ItemGroup&gt;</span><br><span class="line">            &lt;!-- 找到所有appsettings.Development.*.json文件 --&gt;</span><br><span class="line">            &lt;AllDevConfigs Include=&quot;$(PublishDir)appsettings.Development.*.json&quot;/&gt;</span><br><span class="line"></span><br><span class="line">            &lt;!-- 筛选出要删除的文件（排除要保留的） --&gt;</span><br><span class="line">            &lt;DevConfigsToDelete Include=&quot;@(AllDevConfigs)&quot;</span><br><span class="line">                                Exclude=&quot;$(PublishDir)$(ConfigToKeep)&quot;/&gt;</span><br><span class="line">        &lt;/ItemGroup&gt;</span><br><span class="line"></span><br><span class="line">        &lt;Message Importance=&quot;high&quot; Text=&quot;正在合并配置文件: appsettings.json + appsettings.Development.$(DevConfig).json -&gt; $(MergedConfigFile)&quot;/&gt;</span><br><span class="line"></span><br><span class="line">        &lt;Exec Command=&quot;dotnet &amp;quot;$(ConfigMergerDll)&amp;quot; &amp;quot;$(MergedConfigFile)&amp;quot; &amp;quot;$(MergedConfigFile)&amp;quot; &amp;quot;$(PublishDir)appsettings.Development.$(DevConfig).json&amp;quot;&quot;</span><br><span class="line">              WorkingDirectory=&quot;$(ProjectDir)&quot;/&gt;</span><br><span class="line"></span><br><span class="line">        &lt;!-- 显示将要删除的文件（调试用） --&gt;</span><br><span class="line">        &lt;Message Text=&quot;将保留的文件: $(PublishDir)$(ConfigToKeep)&quot; Importance=&quot;high&quot;/&gt;</span><br><span class="line">        &lt;Message Text=&quot;将删除的文件: @(DevConfigsToDelete)&quot; Importance=&quot;high&quot;/&gt;</span><br><span class="line">        &lt;Message Text=&quot;将删除的文件: appsettings.Development.json&quot; Importance=&quot;high&quot;/&gt;</span><br><span class="line"></span><br><span class="line">        &lt;!-- 执行删除 --&gt;</span><br><span class="line">        &lt;Delete Files=&quot;@(DevConfigsToDelete)&quot;/&gt;</span><br><span class="line">        &lt;Delete Files=&quot;$(PublishDir)appsettings.Development.json&quot;/&gt;</span><br><span class="line">    &lt;/Target&gt;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    &lt;PropertyGroup&gt;</span><br><span class="line">        &lt;OutputType&gt;Exe&lt;/OutputType&gt;</span><br><span class="line">        &lt;AspNetCoreHostingModel&gt;InProcess&lt;/AspNetCoreHostingModel&gt;</span><br><span class="line">        &lt;LangVersion&gt;latest&lt;/LangVersion&gt;</span><br><span class="line">        &lt;ErrorOnDuplicatePublishOutputFiles&gt;false&lt;/ErrorOnDuplicatePublishOutputFiles&gt;</span><br><span class="line">        &lt;TargetFramework&gt;net8.0&lt;/TargetFramework&gt;</span><br><span class="line">        &lt;!--&lt;AspNetCoreHostingModel&gt;OutOfProcess&lt;/AspNetCoreHostingModel&gt;--&gt;</span><br><span class="line">       &lt;!-- </span><br><span class="line">       配置合并工具路径</span><br><span class="line">ConfigMergerDir: 合并工具项目目录</span><br><span class="line">ConfigMergerProj: 合并工具项目文件路径</span><br><span class="line">ConfigMergerDll: 合并工具生成的 DLL 路径</span><br><span class="line">       --&gt; &lt;ConfigMergerDir&gt;$([MSBuild]::NormalizePath(&#x27;$(MSBuildThisFileDirectory)..&#x27;, &#x27;ConfigMerger/&#x27;))&lt;/ConfigMergerDir&gt;</span><br><span class="line">        &lt;ConfigMergerProj&gt;$([MSBuild]::NormalizePath(&#x27;$(ConfigMergerDir)&#x27;, &#x27;ConfigMerger.csproj&#x27;))&lt;/ConfigMergerProj&gt;</span><br><span class="line">        &lt;ConfigMergerDll&gt;$([MSBuild]::NormalizePath(&#x27;$(ConfigMergerDir)&#x27;, &#x27;bin/$(Configuration)/net8.0/ConfigMerger.dll&#x27;))&lt;/ConfigMergerDll&gt;</span><br><span class="line"></span><br><span class="line">    &lt;/PropertyGroup&gt;</span><br><span class="line">&lt;/Project&gt;</span><br></pre></td></tr></table></figure><h5 id="32-合并配置文件的帮助类"><a class="markdownIt-Anchor" href="#32-合并配置文件的帮助类"></a> 3.2 合并配置文件的帮助类</h5><p>创建控制台项目 ConfigMerger</p><figure class="highlight csharp"><figcaption><span>Program.cs</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> Newtonsoft.Json.Linq;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (args.Length &lt; <span class="number">3</span>)</span><br><span class="line">&#123;</span><br><span class="line">    Console.WriteLine(<span class="string">&quot;Usage: ConfigMerger &lt;outputFile&gt; &lt;baseConfig&gt; &lt;overrideConfig&gt;&quot;</span>);</span><br><span class="line">    <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">try</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment">// e.g /Users/odinsam/gitee/zb/xxx/serverPublish/appsettings.json</span></span><br><span class="line">    <span class="keyword">var</span> outputFile = args[<span class="number">0</span>];</span><br><span class="line">    <span class="comment">// e.g /Users/odinsam/gitee/zb/xxx/serverPublish/appsettings.json</span></span><br><span class="line">    <span class="keyword">var</span> baseConfig = args[<span class="number">1</span>];</span><br><span class="line">    <span class="comment">// e.g /Users/odinsam/gitee/zb/xxx/serverPublish/appsettings.Development.xxx.json</span></span><br><span class="line">    <span class="keyword">var</span> overrideConfig = args[<span class="number">2</span>];</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 读取基础配置</span></span><br><span class="line">    <span class="keyword">var</span> baseJson = File.Exists(baseConfig)</span><br><span class="line">        ? JObject.Parse(File.ReadAllText(baseConfig))</span><br><span class="line">        : <span class="keyword">new</span> JObject();</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 读取覆盖配置</span></span><br><span class="line">    <span class="keyword">if</span> (File.Exists(overrideConfig))</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">var</span> overrideJson = JObject.Parse(File.ReadAllText(overrideConfig))!;</span><br><span class="line">        MergeJsonObjects(baseJson, overrideJson);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 写入合并后的文件</span></span><br><span class="line">    Directory.CreateDirectory(Path.GetDirectoryName(outputFile));</span><br><span class="line">    File.WriteAllText(outputFile, baseJson.ToString(Newtonsoft.Json.Formatting.Indented));</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">catch</span> (Exception ex)</span><br><span class="line">&#123;</span><br><span class="line">    Console.WriteLine(<span class="string">$&quot;Error merging configs: <span class="subst">&#123;ex.Message&#125;</span>&quot;</span>);</span><br><span class="line">    <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">static</span> <span class="keyword">void</span> <span class="title">MergeJsonObjects</span>(<span class="params">JObject target, JObject source</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">foreach</span> (<span class="keyword">var</span> property <span class="keyword">in</span> source.Properties())</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (property.Value <span class="keyword">is</span> JObject sourceObj &amp;&amp;</span><br><span class="line">            target.TryGetValue(property.Name, <span class="keyword">out</span> <span class="keyword">var</span> targetValue) &amp;&amp;</span><br><span class="line">            targetValue <span class="keyword">is</span> JObject targetObj)</span><br><span class="line">        &#123;</span><br><span class="line">            MergeJsonObjects(targetObj, sourceObj);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">        &#123;</span><br><span class="line">            target[property.Name] = property.Value?.DeepClone();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;文章主要讲述了 Asp.NetCore 在 VsCode 和 Rider 中配置带参数调试和发布项目。&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="VsCode" scheme="https://odinsam.com/categories/VsCode/"/>
    
    <category term="Rider" scheme="https://odinsam.com/categories/VsCode/Rider/"/>
    
    
    <category term="配置" scheme="https://odinsam.com/tags/%E9%85%8D%E7%BD%AE/"/>
    
    <category term="vscode" scheme="https://odinsam.com/tags/vscode/"/>
    
    <category term="rider" scheme="https://odinsam.com/tags/rider/"/>
    
  </entry>
  
  <entry>
    <title>字符串表达式查询解决方案</title>
    <link href="https://odinsam.com/2025/0403/dc0d.html"/>
    <id>https://odinsam.com/2025/0403/dc0d.html</id>
    <published>2025-04-03T08:52:00.000Z</published>
    <updated>2025-05-22T10:40:11.824Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>在日常的开发当中，会遇到前端构建用户所需要的查询条件，在后端使用对应的查询条件进行查询。但是前端构建的复杂查询条件往往是以字符串形式传递，后端在使用EF等orm框架时，不是很好操作。本文章就是为了解决这个问题。</p></blockquote><h3 id="主要是对用户的字符串表达式进行解析生成对应的表达式树然后使用表达式树进行对应的查询"><a class="markdownIt-Anchor" href="#主要是对用户的字符串表达式进行解析生成对应的表达式树然后使用表达式树进行对应的查询"></a> 主要是对用户的字符串表达式进行解析生成对应的表达式树，然后使用表达式树进行对应的查询</h3><h4 id="1-后端对字符串表达式的解析"><a class="markdownIt-Anchor" href="#1-后端对字符串表达式的解析"></a> 1. 后端对字符串表达式的解析</h4><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">JsonQueryBuilder</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> 应用JSON条件到查询</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> ISugarQueryable&lt;LabourRecord, MDMUser, MDMOrganization&gt; <span class="title">ApplyJsonConditions</span>(<span class="params"></span></span></span><br><span class="line"><span class="params"><span class="function">        ISugarQueryable&lt;LabourRecord, MDMUser, MDMOrganization&gt; query,</span></span></span><br><span class="line"><span class="params"><span class="function">        <span class="built_in">string</span> userCondition,</span></span></span><br><span class="line"><span class="params"><span class="function">        List&lt;MongoLabourDbColumnInfo&gt; dBColumns</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="built_in">string</span>.IsNullOrWhiteSpace(userCondition) || userCondition.Trim() == <span class="string">&quot;1==1&quot;</span> || userCondition.Trim() == <span class="string">&quot;(1==1)&quot;</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> query;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">var</span> conditions = ParseConditions(userCondition);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">0</span>; i &lt; conditions.Count; i++)</span><br><span class="line">        &#123;</span><br><span class="line">            query = ApplyCondition(query, conditions[i], i, dBColumns);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> query;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> ISugarQueryable&lt;LabourRecord, MDMUser, MDMOrganization&gt; <span class="title">ApplyCondition</span>(<span class="params"></span></span></span><br><span class="line"><span class="params"><span class="function">        ISugarQueryable&lt;LabourRecord, MDMUser, MDMOrganization&gt; query,</span></span></span><br><span class="line"><span class="params"><span class="function">        JsonQueryCondition condition,</span></span></span><br><span class="line"><span class="params"><span class="function">        <span class="built_in">int</span> conditionIndex,</span></span></span><br><span class="line"><span class="params"><span class="function">        List&lt;MongoLabourDbColumnInfo&gt; dBColumns</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">var</span> isNotContains = <span class="literal">false</span>;</span><br><span class="line">        <span class="built_in">string</span> jsonAccess = <span class="string">$&quot;JSON_VALUE(CAST(JsonResult AS NVARCHAR(MAX)), &#x27;$.<span class="subst">&#123;condition.Field&#125;</span>&#x27;)&quot;</span>;</span><br><span class="line">        <span class="keyword">if</span> (jsonAccess.Contains(<span class="string">&quot;$.!&quot;</span>))</span><br><span class="line">        &#123;</span><br><span class="line">            isNotContains = <span class="literal">true</span>;</span><br><span class="line">            jsonAccess = jsonAccess.Replace(<span class="string">&quot;$.!&quot;</span>, <span class="string">&quot;$.&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="built_in">string</span> paramName = <span class="string">$&quot;val<span class="subst">&#123;conditionIndex&#125;</span>&quot;</span>;  <span class="comment">// 唯一参数名</span></span><br><span class="line">        <span class="built_in">string</span> filed = condition.Field;</span><br><span class="line">        filed = filed.StartsWith(<span class="string">&quot;!&quot;</span>) ? filed.Substring(<span class="number">1</span>) : filed;</span><br><span class="line">        <span class="keyword">var</span> currentColumn = dBColumns.SingleOrDefault(c =&gt; c.ColumnCode == filed);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">var</span> whereString = <span class="built_in">string</span>.Empty;</span><br><span class="line">        <span class="keyword">var</span> <span class="keyword">value</span> = condition.Value;</span><br><span class="line">        <span class="keyword">value</span> = <span class="keyword">value</span>.Replace(<span class="string">&quot;\&quot;&quot;</span>, <span class="string">&quot;&quot;</span>);</span><br><span class="line">        <span class="keyword">var</span> op = condition.Field.StartsWith(<span class="string">&quot;!&quot;</span>) &amp;&amp; condition.Operator == <span class="string">&quot;Contains&quot;</span></span><br><span class="line">        ? <span class="string">&quot;!Contains&quot;</span></span><br><span class="line">        : condition.Operator;</span><br><span class="line">        <span class="keyword">if</span> (op == <span class="string">&quot;==&quot;</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            op = <span class="string">&quot;=&quot;</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        whereString = <span class="string">$&quot;<span class="subst">&#123;jsonAccess&#125;</span> <span class="subst">&#123;op&#125;</span> @<span class="subst">&#123;paramName&#125;</span>&quot;</span>;</span><br><span class="line"></span><br><span class="line">        <span class="built_in">object</span> objectParams = <span class="literal">null</span>;</span><br><span class="line">        <span class="keyword">if</span> (currentColumn.DataType.StartsWith(<span class="string">&quot;decimal&quot;</span>))</span><br><span class="line">        &#123;</span><br><span class="line">            objectParams = <span class="keyword">new</span> Dictionary&lt;<span class="built_in">string</span>, <span class="built_in">object</span>&gt; &#123; [paramName] = Convert.ToInt32(<span class="keyword">value</span>) &#125;;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">        &#123;</span><br><span class="line">            objectParams = <span class="keyword">new</span> Dictionary&lt;<span class="built_in">string</span>, <span class="built_in">string</span>&gt; &#123; [paramName] = <span class="keyword">value</span> &#125;;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">switch</span> (op)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">case</span> <span class="string">&quot;=&quot;</span>:</span><br><span class="line">            <span class="keyword">case</span> <span class="string">&quot;!=&quot;</span>:</span><br><span class="line">            <span class="keyword">case</span> <span class="string">&quot;&gt;&quot;</span>:</span><br><span class="line">            <span class="keyword">case</span> <span class="string">&quot;&lt;&quot;</span>:</span><br><span class="line">            <span class="keyword">case</span> <span class="string">&quot;&gt;=&quot;</span>:</span><br><span class="line">            <span class="keyword">case</span> <span class="string">&quot;&lt;=&quot;</span>:</span><br><span class="line">                <span class="keyword">return</span> query.Where(whereString, objectParams);</span><br><span class="line">            <span class="keyword">case</span> <span class="string">&quot;Contains&quot;</span>:</span><br><span class="line">                <span class="keyword">return</span> query.Where(<span class="string">$&quot;<span class="subst">&#123;jsonAccess&#125;</span> LIKE @<span class="subst">&#123;paramName&#125;</span>&quot;</span>,</span><br><span class="line">                    <span class="keyword">new</span> Dictionary&lt;<span class="built_in">string</span>, <span class="built_in">object</span>&gt; &#123; [paramName] = <span class="string">$&quot;%<span class="subst">&#123;<span class="keyword">value</span>&#125;</span>%&quot;</span> &#125;);</span><br><span class="line"></span><br><span class="line">            <span class="keyword">case</span> <span class="string">&quot;!Contains&quot;</span>:</span><br><span class="line">                <span class="comment">// 处理否定包含条件</span></span><br><span class="line">                <span class="keyword">return</span> query.Where(<span class="string">$&quot;(<span class="subst">&#123;jsonAccess&#125;</span> IS NULL OR <span class="subst">&#123;jsonAccess&#125;</span> NOT LIKE @<span class="subst">&#123;paramName&#125;</span>)&quot;</span>,</span><br><span class="line">                    <span class="keyword">new</span> Dictionary&lt;<span class="built_in">string</span>, <span class="built_in">object</span>&gt; &#123; [paramName] = <span class="string">$&quot;%<span class="subst">&#123;<span class="keyword">value</span>&#125;</span>%&quot;</span> &#125;);</span><br><span class="line"></span><br><span class="line">            <span class="literal">default</span>:</span><br><span class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> ArgumentException(<span class="string">$&quot;不支持的运算符: <span class="subst">&#123;condition.Operator&#125;</span>&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> 解析条件字符串为条件对象列表</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> List&lt;JsonQueryCondition&gt; <span class="title">ParseConditions</span>(<span class="params"><span class="built_in">string</span> conditionStr</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">var</span> conditions = <span class="keyword">new</span> List&lt;JsonQueryCondition&gt;();</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 分割条件，忽略空条件和1==1</span></span><br><span class="line">        <span class="keyword">var</span> andGroups = conditionStr.Split(<span class="keyword">new</span>[] &#123; <span class="string">&quot;&amp;&amp;&quot;</span> &#125;, StringSplitOptions.RemoveEmptyEntries)</span><br><span class="line">            .ToList()</span><br><span class="line">            .Where(cond =&gt; cond.Trim() != <span class="string">&quot;1==1&quot;</span>)</span><br><span class="line">            .Where(cond =&gt; !<span class="built_in">string</span>.IsNullOrWhiteSpace(cond))</span><br><span class="line">            .ToList();</span><br><span class="line"></span><br><span class="line">        <span class="keyword">foreach</span> (<span class="keyword">var</span> <span class="keyword">group</span> <span class="keyword">in</span> andGroups)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">var</span> trimmed = <span class="keyword">group</span>.Trim();</span><br><span class="line">            <span class="keyword">if</span> (<span class="built_in">string</span>.IsNullOrWhiteSpace(trimmed)) <span class="keyword">continue</span>;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">var</span> condition = <span class="keyword">new</span> JsonQueryCondition();</span><br><span class="line"></span><br><span class="line">            <span class="comment">// 处理 Contains</span></span><br><span class="line">            <span class="keyword">if</span> (trimmed.Contains(<span class="string">&quot;.Contains(&quot;</span>))</span><br><span class="line">            &#123;</span><br><span class="line">                condition.Field = trimmed.Substring(<span class="number">0</span>, trimmed.IndexOf(<span class="string">&#x27;.&#x27;</span>)).Trim();</span><br><span class="line">                condition.Operator = <span class="string">&quot;Contains&quot;</span>;</span><br><span class="line">                condition.Value = GetStringBetweenQuotes(trimmed);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">// 处理 ==</span></span><br><span class="line">            <span class="keyword">else</span> <span class="keyword">if</span> (trimmed.Contains(<span class="string">&quot;==&quot;</span>))</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">var</span> parts = trimmed.Split(<span class="keyword">new</span>[] &#123; <span class="string">&quot;==&quot;</span> &#125;, StringSplitOptions.RemoveEmptyEntries);</span><br><span class="line">                condition.Field = parts[<span class="number">0</span>].Trim();</span><br><span class="line">                condition.Operator = <span class="string">&quot;==&quot;</span>;</span><br><span class="line">                condition.Value = parts[<span class="number">1</span>].Trim().Trim(<span class="string">&#x27;&quot;&#x27;</span>);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">// 处理 !=</span></span><br><span class="line">            <span class="keyword">else</span> <span class="keyword">if</span> (trimmed.Contains(<span class="string">&quot;!=&quot;</span>))</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">var</span> parts = trimmed.Split(<span class="keyword">new</span>[] &#123; <span class="string">&quot;!=&quot;</span> &#125;, StringSplitOptions.RemoveEmptyEntries);</span><br><span class="line">                condition.Field = parts[<span class="number">0</span>].Trim();</span><br><span class="line">                condition.Operator = <span class="string">&quot;!=&quot;</span>;</span><br><span class="line">                condition.Value = parts[<span class="number">1</span>].Trim().Trim(<span class="string">&#x27;&quot;&#x27;</span>);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">// 处理 &gt;</span></span><br><span class="line">            <span class="keyword">else</span> <span class="keyword">if</span> (trimmed.Contains(<span class="string">&quot;&gt;&quot;</span>))</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">var</span> parts = trimmed.Split(<span class="string">&#x27;&gt;&#x27;</span>);</span><br><span class="line">                condition.Field = parts[<span class="number">0</span>].Trim();</span><br><span class="line">                condition.Operator = <span class="string">&quot;&gt;&quot;</span>;</span><br><span class="line">                condition.Value = parts[<span class="number">1</span>].Trim();</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">// 处理 &lt;</span></span><br><span class="line">            <span class="keyword">else</span> <span class="keyword">if</span> (trimmed.Contains(<span class="string">&quot;&lt;&quot;</span>))</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">var</span> parts = trimmed.Split(<span class="string">&#x27;&lt;&#x27;</span>);</span><br><span class="line">                condition.Field = parts[<span class="number">0</span>].Trim();</span><br><span class="line">                condition.Operator = <span class="string">&quot;&lt;&quot;</span>;</span><br><span class="line">                condition.Value = parts[<span class="number">1</span>].Trim();</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">// 处理 &gt;=</span></span><br><span class="line">            <span class="keyword">else</span> <span class="keyword">if</span> (trimmed.Contains(<span class="string">&quot;&gt;=&quot;</span>))</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">var</span> parts = trimmed.Split(<span class="keyword">new</span>[] &#123; <span class="string">&quot;&gt;=&quot;</span> &#125;, StringSplitOptions.RemoveEmptyEntries);</span><br><span class="line">                condition.Field = parts[<span class="number">0</span>].Trim();</span><br><span class="line">                condition.Operator = <span class="string">&quot;&gt;=&quot;</span>;</span><br><span class="line">                condition.Value = parts[<span class="number">1</span>].Trim();</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">// 处理 &lt;=</span></span><br><span class="line">            <span class="keyword">else</span> <span class="keyword">if</span> (trimmed.Contains(<span class="string">&quot;&lt;=&quot;</span>))</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">var</span> parts = trimmed.Split(<span class="keyword">new</span>[] &#123; <span class="string">&quot;&lt;=&quot;</span> &#125;, StringSplitOptions.RemoveEmptyEntries);</span><br><span class="line">                condition.Field = parts[<span class="number">0</span>].Trim();</span><br><span class="line">                condition.Operator = <span class="string">&quot;&lt;=&quot;</span>;</span><br><span class="line">                condition.Value = parts[<span class="number">1</span>].Trim();</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">else</span></span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> ArgumentException(<span class="string">$&quot;无法识别的条件格式: <span class="subst">&#123;trimmed&#125;</span>&quot;</span>);</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            conditions.Add(condition);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> conditions;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> 获取引号之间的字符串</span></span><br><span class="line">    <span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="built_in">string</span> <span class="title">GetStringBetweenQuotes</span>(<span class="params"><span class="built_in">string</span> input</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="built_in">int</span> firstQuote = input.IndexOf(<span class="string">&#x27;&quot;&#x27;</span>);</span><br><span class="line">        <span class="keyword">if</span> (firstQuote == <span class="number">-1</span>) <span class="keyword">return</span> <span class="built_in">string</span>.Empty;</span><br><span class="line"></span><br><span class="line">        <span class="built_in">int</span> secondQuote = input.IndexOf(<span class="string">&#x27;&quot;&#x27;</span>, firstQuote + <span class="number">1</span>);</span><br><span class="line">        <span class="keyword">if</span> (secondQuote == <span class="number">-1</span>) <span class="keyword">return</span> <span class="built_in">string</span>.Empty;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> input.Substring(firstQuote + <span class="number">1</span>, secondQuote - firstQuote - <span class="number">1</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure><h4 id="2-具体的查询举例"><a class="markdownIt-Anchor" href="#2-具体的查询举例"></a> 2. 具体的查询举例</h4><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> selectQuery = <span class="keyword">this</span>._dbContext.Insurance.Queryable&lt;LabourRecord&gt;()</span><br><span class="line">                    .InnerJoin&lt;MDMUser&gt;((lr, usr) =&gt; lr.UserID == usr.ID)</span><br><span class="line">                    .InnerJoin&lt;MDMOrganization&gt;((lr, usr, org) =&gt; lr.DeptID == org.ID)</span><br><span class="line">                    .AS(<span class="string">$&quot;Labour_Record_<span class="subst">&#123;dbCode&#125;</span>&quot;</span>)</span><br><span class="line">                    .Where((lr, usr, org) =&gt;</span><br><span class="line">                        lr.Status == <span class="number">1</span> &amp;&amp; usr.Status == <span class="number">1</span> &amp;&amp; org.Status == <span class="number">1</span></span><br><span class="line">                    );</span><br><span class="line"><span class="keyword">if</span> (!<span class="built_in">string</span>.IsNullOrEmpty(search.entity.Filter) &amp;&amp; search.entity.Filter != <span class="string">&quot;(1==1)&quot;</span>)</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">var</span> condation = search.entity.Filter;</span><br><span class="line">                <span class="comment">// 去掉引号 可忽略</span></span><br><span class="line">                condation = <span class="built_in">string</span>.IsNullOrEmpty(condation) ? <span class="string">&quot;1==1&quot;</span> : condation.Substring(<span class="number">1</span>, condation.Length - <span class="number">2</span>);</span><br><span class="line">                selectQuery = JsonQueryBuilder.ApplyJsonConditions(selectQuery, condation, dbColumns);</span><br><span class="line">                System.Console.WriteLine(selectQuery.ToSqlString());</span><br><span class="line">                <span class="keyword">return</span> selectQuery;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">else</span></span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">return</span> selectQuery;</span><br><span class="line">            &#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;在日常的开发当中，会遇到前端构建用户所需要的查询条件，在后端使用对应的查询条件进行查询。但是前端构建的复杂查询条件往往是以字符串形式传递，后端在使用EF等orm框架时，不是很好操作。本文章就是为了解决这个问题。&lt;/p&gt;
&lt;/blockquote&gt;
</summary>
      
    
    
    
    <category term=".Net Core" scheme="https://odinsam.com/categories/Net-Core/"/>
    
    
    <category term="字符串表达式" scheme="https://odinsam.com/tags/%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%A1%A8%E8%BE%BE%E5%BC%8F/"/>
    
    <category term="查询" scheme="https://odinsam.com/tags/%E6%9F%A5%E8%AF%A2/"/>
    
  </entry>
  
  <entry>
    <title>SqlSugar仓储架构通用查询/分页</title>
    <link href="https://odinsam.com/2025/0303/4a7a.html"/>
    <id>https://odinsam.com/2025/0303/4a7a.html</id>
    <published>2025-03-03T08:16:00.000Z</published>
    <updated>2025-03-03T08:21:35.845Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>SqlSugar是现在非常常用的ORM框架，在实际的项目中无论是DDD还是MVC一般都会使用仓储设计。这里展示的是通用查询和分页查询的方法</p></blockquote><span id="more"></span><h4 id="1-通用查询"><a class="markdownIt-Anchor" href="#1-通用查询"></a> 1、通用查询</h4><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> 通用的查询方法，支持单表查询和多表联查</span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;typeparam name=&quot;TResult&quot;&gt;</span>返回的 DTO 类型<span class="doctag">&lt;/typeparam&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;selectExpression&quot;&gt;</span>选择字段表达式<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;joinExpression&quot;&gt;</span>联表表达式（可为空）<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;whereExpressions&quot;&gt;</span>查询条件表达式集合（可为空）<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;whereIfExpressions&quot;&gt;</span>动态条件表达式集合（可为空）<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;orderExpressions&quot;&gt;</span>多排序表达式集合（可为空）<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;tableName&quot;&gt;</span>查询主表的表名（可为空）<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span><span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="title">List</span>&lt;<span class="title">TResult</span>&gt; <span class="title">Query</span>&lt;<span class="title">TResult</span>&gt;(<span class="params"></span></span></span><br><span class="line"><span class="params"><span class="function">    Expression&lt;Func&lt;TEntity, TResult&gt;&gt; selectExpression,</span></span></span><br><span class="line"><span class="params"><span class="function">    Func&lt;ISugarQueryable&lt;TEntity&gt;, ISugarQueryable&lt;TEntity&gt;&gt;? joinExpression=<span class="literal">null</span>,</span></span></span><br><span class="line"><span class="params"><span class="function">    List&lt;Expression&lt;Func&lt;TEntity, <span class="built_in">bool</span>&gt;&gt;&gt;? whereExpressions = <span class="literal">null</span>,</span></span></span><br><span class="line"><span class="params"><span class="function">    List&lt;WhereIfExpression&lt;TEntity&gt;&gt;? whereIfExpressions = <span class="literal">null</span>,</span></span></span><br><span class="line"><span class="params"><span class="function">    List&lt;OrderExpression&lt;TEntity&gt;&gt;? orderExpressions = <span class="literal">null</span>,</span></span></span><br><span class="line"><span class="params"><span class="function">    <span class="built_in">string</span>? tableName = <span class="literal">null</span></span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">var</span> query = <span class="built_in">string</span>.IsNullOrEmpty(tableName)</span><br><span class="line">        ? _db.Queryable&lt;TEntity&gt;()</span><br><span class="line">        : _db.Queryable&lt;TEntity&gt;().AS(tableName);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 联表</span></span><br><span class="line">    <span class="keyword">if</span> (joinExpression != <span class="literal">null</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        query = joinExpression(query);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 查询条件</span></span><br><span class="line">    <span class="keyword">if</span> (whereExpressions != <span class="literal">null</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        query = whereExpressions.Aggregate(</span><br><span class="line">            query, </span><br><span class="line">            (current, whereExpression) =&gt; </span><br><span class="line">                current.Where(whereExpression));</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (whereIfExpressions != <span class="literal">null</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        query = whereIfExpressions.Aggregate(</span><br><span class="line">            query, </span><br><span class="line">            (current, whereIfExpression) =&gt; </span><br><span class="line">                current.WhereIF(whereIfExpression.IsWhere, whereIfExpression.WhereIf));</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="comment">// 排序条件</span></span><br><span class="line">    <span class="keyword">if</span> (orderExpressions != <span class="literal">null</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        query = orderExpressions.Aggregate(</span><br><span class="line">            query, </span><br><span class="line">            (current, orderExpression) =&gt; </span><br><span class="line">                current.OrderBy(orderExpression.Order, orderExpression.OrderType));</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 选择字段</span></span><br><span class="line">    <span class="keyword">return</span> query.Select(selectExpression).ToList();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="2-分页查询"><a class="markdownIt-Anchor" href="#2-分页查询"></a> 2、分页查询</h4><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;summary&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> 通用的查询方法，支持单表查询和多表联查</span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;/summary&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;typeparam name=&quot;TResult&quot;&gt;</span>返回的 DTO 类型<span class="doctag">&lt;/typeparam&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;pageQueryResponse&quot;&gt;</span>分页查询返回对象<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;selectExpression&quot;&gt;</span>选择字段表达式<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;primaryKeyExpression&quot;&gt;</span>选择字段表达式<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;joinExpression&quot;&gt;</span>联表表达式（可为空）<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;whereExpressions&quot;&gt;</span>查询条件表达式集合（可为空）<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;whereIfExpressions&quot;&gt;</span>动态条件表达式集合（可为空）<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;orderExpressions&quot;&gt;</span>多排序表达式集合（可为空）<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;tableName&quot;&gt;</span>查询主表的表名（可为空）<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;pageIndex&quot;&gt;</span>查询第几页（可为空,默认第一页）<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;param name=&quot;pageSize&quot;&gt;</span>查询每页大小（可为空,默认一页10条记录）<span class="doctag">&lt;/param&gt;</span></span></span><br><span class="line"><span class="comment"><span class="doctag">///</span> <span class="doctag">&lt;returns&gt;</span><span class="doctag">&lt;/returns&gt;</span></span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="title">PageQueryResponse</span>&lt;<span class="title">TResult</span>&gt; <span class="title">QueryPageing</span>&lt;<span class="title">TResult</span>&gt;(<span class="params"></span></span></span><br><span class="line"><span class="params"><span class="function">    PageQueryResponse&lt;TResult&gt; pageQueryResponse,</span></span></span><br><span class="line"><span class="params"><span class="function">    Expression&lt;Func&lt;TEntity, TResult&gt;&gt; selectExpression,</span></span></span><br><span class="line"><span class="params"><span class="function">    Expression&lt;Func&lt;TEntity,TKey&gt;&gt; primaryKeyExpression,</span></span></span><br><span class="line"><span class="params"><span class="function">    Func&lt;ISugarQueryable&lt;TEntity&gt;, ISugarQueryable&lt;TEntity&gt;&gt;? joinExpression=<span class="literal">null</span>,</span></span></span><br><span class="line"><span class="params"><span class="function">    List&lt;Expression&lt;Func&lt;TEntity, <span class="built_in">bool</span>&gt;&gt;&gt;? whereExpressions = <span class="literal">null</span>,</span></span></span><br><span class="line"><span class="params"><span class="function">    List&lt;WhereIfExpression&lt;TEntity&gt;&gt;? whereIfExpressions = <span class="literal">null</span>,</span></span></span><br><span class="line"><span class="params"><span class="function">    List&lt;OrderExpression&lt;TEntity&gt;&gt;? orderExpressions = <span class="literal">null</span>,</span></span></span><br><span class="line"><span class="params"><span class="function">    <span class="built_in">string</span>? tableName = <span class="literal">null</span>,</span></span></span><br><span class="line"><span class="params"><span class="function">    <span class="built_in">int</span> pageIndex = <span class="number">0</span>,</span></span></span><br><span class="line"><span class="params"><span class="function">    <span class="built_in">int</span> pageSize = <span class="number">10</span></span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">var</span> query = <span class="built_in">string</span>.IsNullOrEmpty(tableName)</span><br><span class="line">        ? _db.Queryable&lt;TEntity&gt;()</span><br><span class="line">        : _db.Queryable&lt;TEntity&gt;().AS(tableName);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 联表</span></span><br><span class="line">    <span class="keyword">if</span> (joinExpression != <span class="literal">null</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        query = joinExpression(query);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 查询条件</span></span><br><span class="line">    <span class="keyword">if</span> (whereExpressions != <span class="literal">null</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        query = whereExpressions.Aggregate(</span><br><span class="line">            query, </span><br><span class="line">            (current, whereExpression) =&gt; </span><br><span class="line">                current.Where(whereExpression));</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (whereIfExpressions != <span class="literal">null</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        query = whereIfExpressions.Aggregate(</span><br><span class="line">            query, </span><br><span class="line">            (current, whereIfExpression) =&gt; </span><br><span class="line">                current.WhereIF(whereIfExpression.IsWhere, whereIfExpression.WhereIf));</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="comment">// 排序条件</span></span><br><span class="line">    <span class="keyword">if</span> (orderExpressions != <span class="literal">null</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        query = orderExpressions.Aggregate(</span><br><span class="line">            query, </span><br><span class="line">            (current, orderExpression) =&gt; </span><br><span class="line">                current.OrderBy(orderExpression.Order, orderExpression.OrderType));</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    </span><br><span class="line">    <span class="keyword">var</span> totalNumber = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">var</span> primaryKeys = query</span><br><span class="line">        .Select(primaryKeyExpression)</span><br><span class="line">        .ToPageList(pageQueryResponse.PageNumber,pageQueryResponse.PageSize,<span class="keyword">ref</span> totalNumber);</span><br><span class="line">    </span><br><span class="line">    pageQueryResponse.TotalNumber = totalNumber;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">var</span> pagedQuery =<span class="built_in">string</span>.IsNullOrEmpty(tableName)</span><br><span class="line">        ? _db.Queryable&lt;TEntity&gt;().Where(p =&gt; primaryKeys!.Contains(p.Id))</span><br><span class="line">        : _db.Queryable&lt;TEntity&gt;().AS(tableName).Where(p =&gt; primaryKeys!.Contains(p.Id));</span><br><span class="line">    </span><br><span class="line">    <span class="comment">// 联表（如果传入联表表达式）</span></span><br><span class="line">    <span class="keyword">if</span> (joinExpression != <span class="literal">null</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        pagedQuery = joinExpression(pagedQuery);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 选择字段（如果传入选择字段表达式）</span></span><br><span class="line">    pageQueryResponse.Data = pagedQuery.Select(selectExpression).ToList();</span><br><span class="line">    </span><br><span class="line">    <span class="comment">// 选择字段</span></span><br><span class="line">    <span class="keyword">return</span> pageQueryResponse;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;SqlSugar是现在非常常用的ORM框架，在实际的项目中无论是DDD还是MVC一般都会使用仓储设计。这里展示的是通用查询和分页查询的方法&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="c#" scheme="https://odinsam.com/categories/c/"/>
    
    
    <category term="sqlsugar" scheme="https://odinsam.com/tags/sqlsugar/"/>
    
  </entry>
  
  <entry>
    <title>带有Json字符串格式的表数据的查询</title>
    <link href="https://odinsam.com/2025/0303/438a.html"/>
    <id>https://odinsam.com/2025/0303/438a.html</id>
    <published>2025-03-03T08:08:00.000Z</published>
    <updated>2025-03-03T08:13:50.342Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>在日常的开发中，可能会遇到数据库的表结构设计中某个字段是一个Json字符串，并且在查询的时候需要多Json中的数据进行查询排序等操作。</p></blockquote><span id="more"></span><h4 id="一-带有json字符串格式的表数据的查询"><a class="markdownIt-Anchor" href="#一-带有json字符串格式的表数据的查询"></a> 一、带有Json字符串格式的表数据的查询</h4><h5 id="11-linq-查询"><a class="markdownIt-Anchor" href="#11-linq-查询"></a> 1.1 linq 查询</h5><figure class="highlight csharp"><figcaption><span>linq 查询</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="keyword">var</span> userGDAA = (<span class="keyword">from</span> gdaa <span class="keyword">in</span> allGDAADatas</span><br><span class="line">    <span class="keyword">where</span> gdaa.UserID == currentUserId</span><br><span class="line">    <span class="keyword">let</span> recordDic = JsonConvert.DeserializeObject&lt;Dictionary&lt;<span class="built_in">string</span>, <span class="built_in">string</span>&gt;&gt;(gdaa.JsonResult)</span><br><span class="line">    <span class="keyword">orderby</span> recordDic[<span class="string">&quot;S18&quot;</span>]</span><br><span class="line">    <span class="keyword">select</span> gdaa).ToList();</span><br><span class="line"></span><br></pre></td></tr></table></figure><figure class="highlight csharp"><figcaption><span>lambada 查询</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="keyword">var</span> userGDAA = allGDAADatas</span><br><span class="line">    .Where(gdaa =&gt; gdaa.UserID == currentUserId)</span><br><span class="line">    .Select(gdaa =&gt; <span class="keyword">new</span> </span><br><span class="line">    &#123; </span><br><span class="line">        Gdaa = gdaa, </span><br><span class="line">        RecordDic = JsonConvert.DeserializeObject&lt;Dictionary&lt;<span class="built_in">string</span>, <span class="built_in">string</span>&gt;&gt;(gdaa.JsonResult) </span><br><span class="line">    &#125;)</span><br><span class="line">    .OrderBy(x =&gt; x.RecordDic[<span class="string">&quot;S18&quot;</span>])</span><br><span class="line">    .Select(x =&gt; x.Gdaa)</span><br><span class="line">    .ToList();</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;在日常的开发中，可能会遇到数据库的表结构设计中某个字段是一个Json字符串，并且在查询的时候需要多Json中的数据进行查询排序等操作。&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="c#" scheme="https://odinsam.com/categories/c/"/>
    
    
    <category term="c#" scheme="https://odinsam.com/tags/c/"/>
    
    <category term="linq" scheme="https://odinsam.com/tags/linq/"/>
    
    <category term="lambada" scheme="https://odinsam.com/tags/lambada/"/>
    
  </entry>
  
  <entry>
    <title>SQL-删除特定正则表名的表</title>
    <link href="https://odinsam.com/2025/0228/cf1f.html"/>
    <id>https://odinsam.com/2025/0228/cf1f.html</id>
    <published>2025-02-28T01:45:00.000Z</published>
    <updated>2025-02-28T01:47:24.891Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>在SqlServer中，可以通过正则表达式指定表名，并删除对应的表</p></blockquote><span id="more"></span><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="keyword">DECLARE</span> <span class="variable">@TableName</span> NVARCHAR(<span class="number">255</span>)</span><br><span class="line"><span class="keyword">DECLARE</span> <span class="variable">@Sql</span> NVARCHAR(MAX)</span><br><span class="line"></span><br><span class="line"><span class="keyword">DECLARE</span> TableCursor <span class="keyword">CURSOR</span> <span class="keyword">FOR</span></span><br><span class="line"><span class="keyword">SELECT</span> </span><br><span class="line">    TABLE_NAME</span><br><span class="line"><span class="keyword">FROM</span> </span><br><span class="line">    INFORMATION_SCHEMA.TABLES</span><br><span class="line"><span class="keyword">WHERE</span> </span><br><span class="line">    TABLE_NAME <span class="keyword">LIKE</span> <span class="string">&#x27;%_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]&#x27;</span></span><br><span class="line">    <span class="keyword">AND</span> TABLE_TYPE <span class="operator">=</span> <span class="string">&#x27;BASE TABLE&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">OPEN</span> TableCursor</span><br><span class="line"><span class="keyword">FETCH</span> NEXT <span class="keyword">FROM</span> TableCursor <span class="keyword">INTO</span> <span class="variable">@TableName</span></span><br><span class="line">a</span><br><span class="line">WHILE @<span class="variable">@FETCH_STATUS</span> <span class="operator">=</span> <span class="number">0</span></span><br><span class="line"><span class="keyword">BEGIN</span></span><br><span class="line">    <span class="keyword">SET</span> <span class="variable">@Sql</span> <span class="operator">=</span> <span class="string">&#x27;DROP TABLE &#x27;</span> <span class="operator">+</span> QUOTENAME(<span class="variable">@TableName</span>)</span><br><span class="line">    <span class="keyword">EXEC</span> sp_executesql <span class="variable">@Sql</span></span><br><span class="line">    PRINT <span class="string">&#x27;Deleted table: &#x27;</span> <span class="operator">+</span> <span class="variable">@TableName</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">FETCH</span> NEXT <span class="keyword">FROM</span> TableCursor <span class="keyword">INTO</span> <span class="variable">@TableName</span></span><br><span class="line"><span class="keyword">END</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">CLOSE</span> TableCursor</span><br><span class="line"><span class="keyword">DEALLOCATE</span> TableCursor</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;在SqlServer中，可以通过正则表达式指定表名，并删除对应的表&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="SqlServer" scheme="https://odinsam.com/categories/SqlServer/"/>
    
    
    <category term="SqlServer" scheme="https://odinsam.com/tags/SqlServer/"/>
    
  </entry>
  
  <entry>
    <title>Axios封装</title>
    <link href="https://odinsam.com/2025/0224/b552.html"/>
    <id>https://odinsam.com/2025/0224/b552.html</id>
    <published>2025-02-24T04:18:00.000Z</published>
    <updated>2025-02-24T04:30:00.895Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>Axios是 web 开发中最常用到的ajax操作库，其内置的方法有很多，进过二次封装后，可以有效的提高我们的工作效率，同时对我们的代码质量也是有很大影响。</p></blockquote><span id="more"></span><h4 id="一-axios封装"><a class="markdownIt-Anchor" href="#一-axios封装"></a> 一、axios封装</h4><h5 id="11-httpclientconfig类型定义"><a class="markdownIt-Anchor" href="#11-httpclientconfig类型定义"></a> 1.1 HttpClientConfig类型定义</h5><figure class="highlight ts"><figcaption><span>httpClientConfig.ts</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * @Date: 2025-02-23 11:30:23</span></span><br><span class="line"><span class="comment"> * @LastEditors: odinsam 123679@qq.com</span></span><br><span class="line"><span class="comment"> * @LastEditTime: 2025-02-23 13:38:17</span></span><br><span class="line"><span class="comment"> * @FilePath: /odin-node-util/lib/src/axios/httpClientConfig.ts</span></span><br><span class="line"><span class="comment"> * @Description: HttpClientConfig</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> &#123; <span class="title class_">AxiosError</span>, <span class="title class_">AxiosResponse</span>, <span class="title class_">InternalAxiosRequestConfig</span> &#125; <span class="keyword">from</span> <span class="string">&quot;axios&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 定义配置接口</span></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">interface</span> <span class="title class_">HttpClientConfig</span> &#123;</span><br><span class="line">    baseURL?: <span class="built_in">string</span>;</span><br><span class="line">    timeout?: <span class="built_in">number</span>;</span><br><span class="line">    token?: <span class="built_in">string</span>;<span class="comment">// 是否自动添加 token</span></span><br><span class="line">    requestInterceptor?: <span class="function">(<span class="params"><span class="attr">config</span>: <span class="title class_">InternalAxiosRequestConfig</span></span>) =&gt;</span> <span class="title class_">InternalAxiosRequestConfig</span>;</span><br><span class="line">    responseInterceptor?: <span class="function">(<span class="params"><span class="attr">response</span>: <span class="title class_">AxiosResponse</span>&lt;<span class="built_in">any</span>, <span class="built_in">any</span>&gt;</span>) =&gt;</span> <span class="title class_">AxiosResponse</span>&lt;<span class="built_in">any</span>, <span class="built_in">any</span>&gt; | <span class="title class_">Promise</span>&lt;<span class="title class_">AxiosResponse</span>&lt;<span class="built_in">any</span>, <span class="built_in">any</span>&gt;&gt;;</span><br><span class="line">    errorInterceptor?: <span class="function">(<span class="params"><span class="attr">error</span>: <span class="title class_">AxiosError</span></span>) =&gt;</span> <span class="title class_">Promise</span>&lt;<span class="built_in">never</span>&gt;;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h5 id="12-odinaxios封装"><a class="markdownIt-Anchor" href="#12-odinaxios封装"></a> 1.2 odinAxios封装</h5><figure class="highlight ts"><figcaption><span>odinAxios.ts</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> axios, &#123; <span class="title class_">AxiosError</span>, <span class="title class_">AxiosInstance</span>, <span class="title class_">AxiosRequestConfig</span>, <span class="title class_">AxiosResponse</span>, <span class="title class_">InternalAxiosRequestConfig</span> &#125; <span class="keyword">from</span> <span class="string">&#x27;axios&#x27;</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; <span class="keyword">type</span> <span class="title class_">HttpClientConfig</span> &#125; <span class="keyword">from</span> <span class="string">&#x27;./httpClientConfig&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * @Date: 2025-02-23 11:30:23</span></span><br><span class="line"><span class="comment"> * @LastEditors: odinsam 123679@qq.com</span></span><br><span class="line"><span class="comment"> * @LastEditTime: 2025-02-24 12:21:54</span></span><br><span class="line"><span class="comment"> * @FilePath: /odin-node-util/lib/src/axios/odinAxios.ts</span></span><br><span class="line"><span class="comment"> * @Description: odinAxios</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">odinAxios</span> &#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="attr">instance</span>: <span class="title class_">AxiosInstance</span>;</span><br><span class="line">    <span class="keyword">private</span> requestInterceptor?: <span class="function">(<span class="params"><span class="attr">config</span>: <span class="title class_">InternalAxiosRequestConfig</span></span>) =&gt;</span> <span class="title class_">InternalAxiosRequestConfig</span>;</span><br><span class="line"></span><br><span class="line">    <span class="title function_">constructor</span>(<span class="params"><span class="attr">httpClientConfig</span>: <span class="title class_">HttpClientConfig</span></span>) &#123;</span><br><span class="line">        <span class="comment">// 创建 Axios 实例</span></span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">instance</span> = axios.<span class="title function_">create</span>(&#123;</span><br><span class="line">            <span class="attr">baseURL</span>: httpClientConfig.<span class="property">baseURL</span>, <span class="comment">// 默认基础地址</span></span><br><span class="line">            <span class="attr">timeout</span>: httpClientConfig.<span class="property">timeout</span>, <span class="comment">// 默认超时时间</span></span><br><span class="line">            <span class="attr">headers</span>: &#123;</span><br><span class="line">                <span class="string">&#x27;Content-Type&#x27;</span>: <span class="string">&#x27;application/json&#x27;</span>,</span><br><span class="line">            &#125;,</span><br><span class="line">        &#125;);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 保存用户自定义的拦截器</span></span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">requestInterceptor</span> = httpClientConfig.<span class="property">requestInterceptor</span>;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 请求拦截器</span></span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">instance</span>.<span class="property">interceptors</span>.<span class="property">request</span>.<span class="title function_">use</span>(</span><br><span class="line">            <span class="function">(<span class="params"><span class="attr">config</span>: <span class="title class_">InternalAxiosRequestConfig</span></span>) =&gt;</span> &#123;</span><br><span class="line">                <span class="comment">// 如果配置了 withToken，自动添加 token</span></span><br><span class="line">                <span class="keyword">if</span> (httpClientConfig.<span class="property">token</span> != <span class="literal">null</span>) &#123;</span><br><span class="line">                    config.<span class="property">headers</span>.<span class="property">Authorization</span> = <span class="string">`Bearer <span class="subst">$&#123;httpClientConfig.token&#125;</span>`</span>;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="comment">// 调用用户自定义的请求拦截器（如果存在）</span></span><br><span class="line">                <span class="keyword">if</span> (<span class="variable language_">this</span>.<span class="property">requestInterceptor</span>) &#123;</span><br><span class="line">                    <span class="keyword">return</span> <span class="variable language_">this</span>.<span class="title function_">requestInterceptor</span>(config);</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">return</span> config;</span><br><span class="line">            &#125;,</span><br><span class="line">            <span class="function">(<span class="params"><span class="attr">error</span>: <span class="title class_">AxiosError</span></span>) =&gt;</span> &#123;</span><br><span class="line">                <span class="keyword">return</span> <span class="title class_">Promise</span>.<span class="title function_">reject</span>(error);</span><br><span class="line">            &#125;</span><br><span class="line">        );</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 响应拦截器</span></span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">instance</span>.<span class="property">interceptors</span>.<span class="property">response</span>.<span class="title function_">use</span>(</span><br><span class="line">            <span class="function">(<span class="params"><span class="attr">response</span>: <span class="title class_">AxiosResponse</span>&lt;<span class="built_in">any</span>, <span class="built_in">any</span>&gt;</span>) =&gt;</span> &#123;</span><br><span class="line">                <span class="comment">// 如果用户提供了自定义的响应拦截器，调用它</span></span><br><span class="line">                <span class="keyword">if</span> (httpClientConfig.<span class="property">responseInterceptor</span>) &#123;</span><br><span class="line">                    <span class="keyword">return</span> httpClientConfig.<span class="title function_">responseInterceptor</span>(response);</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="comment">// 默认处理逻辑</span></span><br><span class="line">                <span class="keyword">if</span> (response.<span class="property">data</span>.<span class="property">code</span> !== <span class="number">200</span>) &#123;</span><br><span class="line">                    <span class="keyword">return</span> <span class="title class_">Promise</span>.<span class="title function_">reject</span>(response.<span class="property">data</span>);</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">return</span> response.<span class="property">data</span>;</span><br><span class="line">            &#125;,</span><br><span class="line">            <span class="function">(<span class="params"><span class="attr">error</span>: <span class="title class_">AxiosError</span></span>) =&gt;</span> &#123;</span><br><span class="line">                <span class="comment">// 如果用户提供了自定义的错误拦截器，调用它</span></span><br><span class="line">                <span class="keyword">if</span> (httpClientConfig.<span class="property">errorInterceptor</span>) &#123;</span><br><span class="line">                    <span class="keyword">return</span> httpClientConfig.<span class="title function_">errorInterceptor</span>(error);</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="comment">// 默认错误处理逻辑</span></span><br><span class="line">                <span class="keyword">if</span> (error.<span class="property">response</span>) &#123;</span><br><span class="line">                    <span class="keyword">switch</span> (error.<span class="property">response</span>.<span class="property">status</span>) &#123;</span><br><span class="line">                        <span class="keyword">case</span> <span class="number">401</span>:</span><br><span class="line">                            <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;未授权，请重新登录&#x27;</span>);</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                        <span class="keyword">case</span> <span class="number">404</span>:</span><br><span class="line">                            <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;请求的资源不存在&#x27;</span>);</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                        <span class="keyword">case</span> <span class="number">500</span>:</span><br><span class="line">                            <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;服务器内部错误&#x27;</span>);</span><br><span class="line">                            <span class="keyword">break</span>;</span><br><span class="line">                        <span class="attr">default</span>:</span><br><span class="line">                            <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;请求失败&#x27;</span>);</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                    <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;网络错误，请检查网络连接&#x27;</span>);</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">return</span> <span class="title class_">Promise</span>.<span class="title function_">reject</span>(error);</span><br><span class="line">            &#125;</span><br><span class="line">        );</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 封装 GET 请求</span></span><br><span class="line">    <span class="keyword">public</span> get&lt;T&gt;(<span class="attr">url</span>: <span class="built_in">string</span>, config?: <span class="title class_">AxiosRequestConfig</span>): <span class="title class_">Promise</span>&lt;<span class="title class_">AxiosResponse</span>&lt;T, <span class="built_in">any</span>&gt;&gt; &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="variable language_">this</span>.<span class="property">instance</span>.<span class="property">get</span>&lt;T&gt;(url, config);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 封装 POST 请求</span></span><br><span class="line">    <span class="keyword">public</span> post&lt;T&gt;(<span class="attr">url</span>: <span class="built_in">string</span>, data?: <span class="built_in">any</span>, config?: <span class="title class_">AxiosRequestConfig</span>): <span class="title class_">Promise</span>&lt;<span class="title class_">AxiosResponse</span>&lt;T, <span class="built_in">any</span>&gt;&gt; &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="variable language_">this</span>.<span class="property">instance</span>.<span class="property">post</span>&lt;T&gt;(url, data, config);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 封装 PUT 请求</span></span><br><span class="line">    <span class="keyword">public</span> put&lt;T&gt;(<span class="attr">url</span>: <span class="built_in">string</span>, data?: <span class="built_in">any</span>, config?: <span class="title class_">AxiosRequestConfig</span>): <span class="title class_">Promise</span>&lt;<span class="title class_">AxiosResponse</span>&lt;T, <span class="built_in">any</span>&gt;&gt; &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="variable language_">this</span>.<span class="property">instance</span>.<span class="property">put</span>&lt;T&gt;(url, data, config);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 封装 DELETE 请求</span></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">delete</span>&lt;T&gt;(<span class="attr">url</span>: <span class="built_in">string</span>, config?: <span class="title class_">AxiosRequestConfig</span>): <span class="title class_">Promise</span>&lt;<span class="title class_">AxiosResponse</span>&lt;T, <span class="built_in">any</span>&gt;&gt; &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="variable language_">this</span>.<span class="property">instance</span>.<span class="property">delete</span>&lt;T&gt;(url, config);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> odinAxios;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h4 id="二-调用示例"><a class="markdownIt-Anchor" href="#二-调用示例"></a> 二、调用示例</h4><h5 id="21-定义-axios-config-配置"><a class="markdownIt-Anchor" href="#21-定义-axios-config-配置"></a> 2.1 定义 axios config 配置</h5><figure class="highlight ts"><figcaption><span>axiosConfig.ts</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="keyword">type</span> &#123; <span class="title class_">HttpClientConfig</span> &#125; <span class="keyword">from</span> <span class="string">&quot;odin-node-util/lib/src/axios/httpClientConfig&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> <span class="title class_">AxiosConfig</span>: <span class="title class_">HttpClientConfig</span> = &#123;</span><br><span class="line">    <span class="attr">baseURL</span>: <span class="string">&quot;https://odinsam.usemock.com/&quot;</span>,</span><br><span class="line">    <span class="attr">timeout</span>: <span class="number">1000</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h5 id="22-前端项目-api-封装类"><a class="markdownIt-Anchor" href="#22-前端项目-api-封装类"></a> 2.2 前端项目 api 封装类</h5><figure class="highlight ts"><figcaption><span>axiosApi.ts</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="keyword">import</span> &#123; <span class="title class_">AxiosConfig</span> &#125; <span class="keyword">from</span> <span class="string">&quot;@/config/axiosConfig&quot;</span>;</span><br><span class="line"><span class="keyword">import</span> odinAxios <span class="keyword">from</span> <span class="string">&quot;odin-node-util/lib/src/axios/odinAxios&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * @Date: 2025-02-23 14:00:06</span></span><br><span class="line"><span class="comment"> * @LastEditors: odinsam 123679@qq.com</span></span><br><span class="line"><span class="comment"> * @LastEditTime: 2025-02-24 10:23:16</span></span><br><span class="line"><span class="comment"> * @FilePath: /vue3Template/ts/src/axios/axiosApi.ts</span></span><br><span class="line"><span class="comment"> * @Description: axiosApi</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">const</span> axiosApi = <span class="keyword">new</span> <span class="title function_">odinAxios</span>(<span class="title class_">AxiosConfig</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">function</span> getUser&lt;T&gt;() &#123;</span><br><span class="line">    <span class="keyword">return</span> axiosApi.<span class="property">get</span>&lt;T&gt;(<span class="string">&#x27;/user&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h5 id="23-vue-页面或-hooks-调用"><a class="markdownIt-Anchor" href="#23-vue-页面或-hooks-调用"></a> 2.3 vue 页面或 hooks 调用</h5><figure class="highlight plaintext"><figcaption><span>hooks调用</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">import &#123; getUser &#125; from &quot;@/axios/axiosApi&quot;</span><br><span class="line">import StringUtil from &quot;odin-node-util/lib/src/utils/StringUtil&quot;;</span><br><span class="line">import &#123; ref &#125; from &quot;vue&quot;;</span><br><span class="line"></span><br><span class="line">/*</span><br><span class="line"> * @Date: 2025-02-23 14:02:36</span><br><span class="line"> * @LastEditors: odinsam 123679@qq.com</span><br><span class="line"> * @LastEditTime: 2025-02-23 14:33:33</span><br><span class="line"> * @FilePath: /vue3Template/ts/src/hooks/useUser.ts</span><br><span class="line"> * @Description: </span><br><span class="line"> */</span><br><span class="line"></span><br><span class="line">// 后端返回data类型</span><br><span class="line">interface IUser &#123;</span><br><span class="line">    user: string</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">export default function () &#123;</span><br><span class="line">    let userName = ref(&#x27;姓名&#x27;)</span><br><span class="line">    function getUserName() &#123;</span><br><span class="line">        getUser&lt;IUser&gt;().then(res =&gt; &#123;</span><br><span class="line">            userName.value = res.data.user;</span><br><span class="line"></span><br><span class="line">        &#125;)</span><br><span class="line">    &#125;</span><br><span class="line">    return &#123;</span><br><span class="line">        userName, getUserName</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;Axios是 web 开发中最常用到的ajax操作库，其内置的方法有很多，进过二次封装后，可以有效的提高我们的工作效率，同时对我们的代码质量也是有很大影响。&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="axios" scheme="https://odinsam.com/categories/axios/"/>
    
    <category term="vue" scheme="https://odinsam.com/categories/axios/vue/"/>
    
    <category term="hooks" scheme="https://odinsam.com/categories/axios/vue/hooks/"/>
    
    
    <category term="Vue" scheme="https://odinsam.com/tags/Vue/"/>
    
    <category term="Axios" scheme="https://odinsam.com/tags/Axios/"/>
    
  </entry>
  
  <entry>
    <title>c# 见分进元和见毫进分</title>
    <link href="https://odinsam.com/2024/0729/de12.html"/>
    <id>https://odinsam.com/2024/0729/de12.html</id>
    <published>2024-07-29T12:25:00.000Z</published>
    <updated>2025-03-06T08:12:17.321Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>c# 见分进元和见毫进分是对小数的中国情况的特殊处理。</p></blockquote><span id="more"></span><h4 id="1-见分进元"><a class="markdownIt-Anchor" href="#1-见分进元"></a> 1. 见分进元</h4><figure class="highlight csharp"><figcaption><span>见分进元</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">number == Math.Floor(number) ? number : (number &gt; <span class="number">0</span> ? Math.Ceiling(number) : Math.Floor(number));</span><br></pre></td></tr></table></figure><h4 id="2-见毫进分"><a class="markdownIt-Anchor" href="#2-见毫进分"></a> 2. 见毫进分</h4><figure class="highlight csharp"><figcaption><span>见分进元</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">return</span> number * <span class="number">100</span> == Math.Floor(number * <span class="number">100</span>) ? number : (number &gt; <span class="number">0</span> ? Math.Ceiling(number * <span class="number">100</span>) / <span class="number">100</span> : Math.Floor(number * <span class="number">100</span>) / <span class="number">100</span>);</span><br></pre></td></tr></table></figure><h4 id="3-四舍五入"><a class="markdownIt-Anchor" href="#3-四舍五入"></a> 3. 四舍五入</h4><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Math.Round(number1, MidpointRounding.AwayFromZero); </span><br><span class="line"><span class="comment">// 保留两位小数</span></span><br><span class="line">Math.Round(number1, <span class="number">2</span>, MidpointRounding.AwayFromZero); </span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;c# 见分进元和见毫进分是对小数的中国情况的特殊处理。&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="c#" scheme="https://odinsam.com/categories/c/"/>
    
    
    <category term="c#" scheme="https://odinsam.com/tags/c/"/>
    
    <category term="见分进元" scheme="https://odinsam.com/tags/%E8%A7%81%E5%88%86%E8%BF%9B%E5%85%83/"/>
    
    <category term="见毫进分" scheme="https://odinsam.com/tags/%E8%A7%81%E6%AF%AB%E8%BF%9B%E5%88%86/"/>
    
  </entry>
  
  <entry>
    <title>c#动态计算表达式</title>
    <link href="https://odinsam.com/2024/0721/db9d.html"/>
    <id>https://odinsam.com/2024/0721/db9d.html</id>
    <published>2024-07-21T11:26:00.000Z</published>
    <updated>2024-07-24T01:21:44.892Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>在 C# 中，虽然没有内置的 eval 函数，但你可以使用 Roslyn 提供的脚本编译和执行功能来动态执行 C# 代码。这提供了一种类似于 eval 的功能。Roslyn 是微软的开源编译器平台，允许你动态地编译和执行 C# 代码。</p></blockquote><span id="more"></span><h4 id="安装包"><a class="markdownIt-Anchor" href="#安装包"></a> 安装包</h4><p>在 C# 中，虽然没有内置的 eval 函数，但你可以使用 Roslyn 提供的脚本编译和执行功能来动态执行 C# 代码。这提供了一种类似于 eval 的功能。Roslyn 是微软的开源编译器平台，允许你动态地编译和执行 C# 代码。</p><p>你需要安装 Microsoft.CodeAnalysis.CSharp.Scripting NuGet 包来使用这个功能。以下是一个示例，展示如何使用 Roslyn 来动态执行 C# 表达式：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">dotnet add package Microsoft.CodeAnalysis.CSharp.Scripting</span><br></pre></td></tr></table></figure><h4 id="使用-roslyn-动态执行代码"><a class="markdownIt-Anchor" href="#使用-roslyn-动态执行代码"></a> 使用 Roslyn 动态执行代码</h4><p>以下是一个示例，展示如何使用 Roslyn 的脚本编译和执行功能来动态执行 C# 代码：</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> System;</span><br><span class="line"><span class="keyword">using</span> System.Threading.Tasks;</span><br><span class="line"><span class="keyword">using</span> Microsoft.CodeAnalysis.CSharp.Scripting;</span><br><span class="line"><span class="keyword">using</span> Microsoft.CodeAnalysis.Scripting;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">Program</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">async</span> Task <span class="title">Main</span>(<span class="params"><span class="built_in">string</span>[] args</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="built_in">string</span> code = <span class="string">@&quot;</span></span><br><span class="line"><span class="string">            int Multiply(int x, int y) =&gt; x * y;</span></span><br><span class="line"><span class="string">            Multiply(a, b)</span></span><br><span class="line"><span class="string">        &quot;</span>;</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">var</span> globals = <span class="keyword">new</span> Globals &#123; a = <span class="number">3</span>, b = <span class="number">5</span> &#125;;</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">var</span> result = <span class="keyword">await</span> CSharpScript.EvaluateAsync&lt;<span class="built_in">int</span>&gt;(code, ScriptOptions.Default, globals);</span><br><span class="line">        </span><br><span class="line">        Console.WriteLine(result); <span class="comment">// 输出 15</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">class</span> <span class="title">Globals</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">public</span> <span class="built_in">int</span> a;</span><br><span class="line">        <span class="keyword">public</span> <span class="built_in">int</span> b;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>或者</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> Microsoft.CodeAnalysis.CSharp.Scripting;</span><br><span class="line"><span class="keyword">using</span> Microsoft.CodeAnalysis.Scripting;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Insurance.Api.Common.Helper</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">class</span> <span class="title">NewCsEvalHelper</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">object</span> <span class="title">Evaluate</span>(<span class="params"><span class="built_in">string</span> text</span>)</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">return</span> CSharpScript.EvaluateAsync(text, ScriptOptions.Default).Result;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="自定义-scriptoptions"><a class="markdownIt-Anchor" href="#自定义-scriptoptions"></a> 自定义 ScriptOptions</h4><p>ScriptOptions.Default 是 Roslyn 脚本执行功能中的一个静态属性，提供了默认的脚本执行选项。它定义了一些基本配置，用于控制脚本的编译和执行行为。以下是一些默认选项的关键点：</p><p>引用的程序集：默认情况下，脚本执行环境会自动引用一些常用的程序集，如 System、System.Core 等。<br />导入的命名空间：默认情况下，脚本执行环境会自动导入一些常用的命名空间，如 System、System.Linq 等。<br />其他编译选项：例如，允许调试信息，启用/禁用某些编译器特性等。<br />不过，有时候你可能需要自定义这些选项，以便满足具体需求。例如，你可能需要添加额外的程序集引用，或者导入额外的命名空间。这时，你可以使用 ScriptOptions.Default 作为基准，并在其基础上进行修改。</p><p>示例：自定义 ScriptOptions<br />以下示例展示了如何自定义 ScriptOptions，以便在脚本中使用额外的程序集和命名空间</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> System;</span><br><span class="line"><span class="keyword">using</span> System.Threading.Tasks;</span><br><span class="line"><span class="keyword">using</span> Microsoft.CodeAnalysis.CSharp.Scripting;</span><br><span class="line"><span class="keyword">using</span> Microsoft.CodeAnalysis.Scripting;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">Program</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">async</span> Task <span class="title">Main</span>(<span class="params"><span class="built_in">string</span>[] args</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="built_in">string</span> code = <span class="string">@&quot;</span></span><br><span class="line"><span class="string">            using System;</span></span><br><span class="line"><span class="string">            using System.Collections.Generic;</span></span><br><span class="line"><span class="string">            List&lt;int&gt; numbers = new List&lt;int&gt; &#123; a, b, 10 &#125;;</span></span><br><span class="line"><span class="string">            numbers.Sum()</span></span><br><span class="line"><span class="string">        &quot;</span>;</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">var</span> globals = <span class="keyword">new</span> Globals &#123; a = <span class="number">3</span>, b = <span class="number">5</span> &#125;;</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">var</span> scriptOptions = ScriptOptions.Default</span><br><span class="line">            .AddReferences(<span class="keyword">typeof</span>(System.Linq.Enumerable).Assembly) <span class="comment">// 添加 System.Linq 引用</span></span><br><span class="line">            .AddImports(<span class="string">&quot;System.Linq&quot;</span>); <span class="comment">// 导入 System.Linq 命名空间</span></span><br><span class="line">        </span><br><span class="line">        <span class="keyword">var</span> result = <span class="keyword">await</span> CSharpScript.EvaluateAsync&lt;<span class="built_in">int</span>&gt;(code, scriptOptions, globals);</span><br><span class="line">        </span><br><span class="line">        Console.WriteLine(result); <span class="comment">// 输出 18 (3 + 5 + 10)</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">class</span> <span class="title">Globals</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">public</span> <span class="built_in">int</span> a;</span><br><span class="line">        <span class="keyword">public</span> <span class="built_in">int</span> b;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h4 id="使用-scriptoptions-的更多选项"><a class="markdownIt-Anchor" href="#使用-scriptoptions-的更多选项"></a> 使用 ScriptOptions 的更多选项</h4><p>除了添加引用和导入命名空间，ScriptOptions 还提供了其他一些配置选项：</p><ul><li>WithEmitDebugInformation：指定是否生成调试信息。</li><li>WithFilePath：指定脚本文件路径，用于调试信息。</li><li>WithFileEncoding：指定脚本文件的编码。</li><li>WithLanguageVersion：指定脚本使用的 C# 语言版本。<br />以下是一个更复杂的示例，展示如何使用这些选项：</li></ul><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> System;</span><br><span class="line"><span class="keyword">using</span> System.Threading.Tasks;</span><br><span class="line"><span class="keyword">using</span> Microsoft.CodeAnalysis;</span><br><span class="line"><span class="keyword">using</span> Microsoft.CodeAnalysis.CSharp;</span><br><span class="line"><span class="keyword">using</span> Microsoft.CodeAnalysis.CSharp.Scripting;</span><br><span class="line"><span class="keyword">using</span> Microsoft.CodeAnalysis.Scripting;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title">Program</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">async</span> Task <span class="title">Main</span>(<span class="params"><span class="built_in">string</span>[] args</span>)</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="built_in">string</span> code = <span class="string">&quot;a + b&quot;</span>;</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">var</span> globals = <span class="keyword">new</span> Globals &#123; a = <span class="number">3</span>, b = <span class="number">5</span> &#125;;</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">var</span> scriptOptions = ScriptOptions.Default</span><br><span class="line">            .WithEmitDebugInformation(<span class="literal">true</span>) <span class="comment">// 生成调试信息</span></span><br><span class="line">            .WithFilePath(<span class="string">&quot;script.csx&quot;</span>) <span class="comment">// 指定脚本文件路径</span></span><br><span class="line">            .WithFileEncoding(System.Text.Encoding.UTF8) <span class="comment">// 指定文件编码</span></span><br><span class="line">            .WithLanguageVersion(LanguageVersion.CSharp8); <span class="comment">// 使用 C# 8.0 版本</span></span><br><span class="line">        </span><br><span class="line">        <span class="keyword">var</span> result = <span class="keyword">await</span> CSharpScript.EvaluateAsync&lt;<span class="built_in">int</span>&gt;(code, scriptOptions, globals);</span><br><span class="line">        </span><br><span class="line">        Console.WriteLine(result); <span class="comment">// 输出 8</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">class</span> <span class="title">Globals</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">public</span> <span class="built_in">int</span> a;</span><br><span class="line">        <span class="keyword">public</span> <span class="built_in">int</span> b;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>通过自定义 ScriptOptions，你可以灵活地控制脚本的编译和执行行为，以满足不同的需求</p><h4 id="安全性注意事项"><a class="markdownIt-Anchor" href="#安全性注意事项"></a> 安全性注意事项</h4><p>使用动态代码执行功能时，务必注意安全性，尤其是在处理用户输入时。确保执行的代码是可信的，并采取适当的措施来防止代码注入和其他安全漏洞。</p>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;在 C# 中，虽然没有内置的 eval 函数，但你可以使用 Roslyn 提供的脚本编译和执行功能来动态执行 C# 代码。这提供了一种类似于 eval 的功能。Roslyn 是微软的开源编译器平台，允许你动态地编译和执行 C# 代码。&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="c#" scheme="https://odinsam.com/categories/c/"/>
    
    
    <category term="c#" scheme="https://odinsam.com/tags/c/"/>
    
    <category term="动态计算" scheme="https://odinsam.com/tags/%E5%8A%A8%E6%80%81%E8%AE%A1%E7%AE%97/"/>
    
  </entry>
  
  <entry>
    <title>Hexo 站内搜索路径</title>
    <link href="https://odinsam.com/2024/0709/1703.html"/>
    <id>https://odinsam.com/2024/0709/1703.html</id>
    <published>2024-07-08T23:18:00.000Z</published>
    <updated>2024-07-24T01:21:44.886Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown（或其他渲染引擎）解析文章，在几秒内，即可利用靓丽的主题生成静态网页。<a href="https://hexo.io/zh-cn/">https://hexo.io/zh-cn/</a> 这里是他的中文文档，无论是结合 Github、Gitee 或者是在私人的云端都可以快速部署，非常高效快捷。为了更好的seo优化，使用pure主题给每一个post页面添加keywords 关键字。</p></blockquote><span id="more"></span><h4 id="找到主题-themespuresourcejs-文件修改-gotolink-方法"><a class="markdownIt-Anchor" href="#找到主题-themespuresourcejs-文件修改-gotolink-方法"></a> 找到主题 themes\pure\source\js 文件，修改 gotoLink 方法:</h4><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">gotoLink</span>(<span class="params">$item</span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> ($item &amp;&amp; $item.<span class="property">length</span>) &#123;</span><br><span class="line">        <span class="comment">// location.href = &quot;/&quot; + $item.attr(&#x27;data-url&#x27;); 修改为下边代码</span></span><br><span class="line">        location.<span class="property">href</span> = $item[<span class="number">0</span>].<span class="property">baseURI</span> + $item.<span class="title function_">attr</span>(<span class="string">&#x27;data-url&#x27;</span>).<span class="title function_">substring</span>(<span class="number">2</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown（或其他渲染引擎）解析文章，在几秒内，即可利用靓丽的主题生成静态网页。&lt;a href=&quot;https://hexo.io/zh-cn/&quot;&gt;https://hexo.io/zh-cn/&lt;/a&gt; 这里是他的中文文档，无论是结合 Github、Gitee 或者是在私人的云端都可以快速部署，非常高效快捷。为了更好的seo优化，使用pure主题给每一个post页面添加keywords 关键字。&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="Hexo" scheme="https://odinsam.com/categories/Hexo/"/>
    
    
    <category term="Hexo" scheme="https://odinsam.com/tags/Hexo/"/>
    
    <category term="站内搜索" scheme="https://odinsam.com/tags/%E7%AB%99%E5%86%85%E6%90%9C%E7%B4%A2/"/>
    
  </entry>
  
  <entry>
    <title>VsCode插件开发 - odinGG-NetCoreTools</title>
    <link href="https://odinsam.com/2024/0709/b112.html"/>
    <id>https://odinsam.com/2024/0709/b112.html</id>
    <published>2024-07-08T22:32:00.000Z</published>
    <updated>2025-11-23T03:10:38.523Z</updated>
    
    <content type="html"><![CDATA[<span id="more"></span><h1 id="netcoretools-for-vscode"><a class="markdownIt-Anchor" href="#netcoretools-for-vscode"></a> NetCoreTools For Vscode</h1><p><img src="https://img.shields.io/badge/version-1.0.1-brightgreen.svg" alt="" /> <img src="https://img.shields.io/github/issues/odinGitGmail/odinGG-NetCoreTools" alt="" /> <img src="https://img.shields.io/github/forks/odinGitGmail/odinGG-NetCoreTools" alt="" /> <img src="https://img.shields.io/github/stars/odinGitGmail/odinGG-NetCoreTools" alt="" /> <img src="https://img.shields.io/badge/platform-javaScript-brightgreen.svg" alt="" /> <img src="https://img.shields.io/github/license/odinGitGmail/odinGG-NetCoreTools" alt="" /> <a href="https://odinsam.com"><img src="https://img.shields.io/badge/Blog-odinsam.com-blue.svg" alt="" /></a></p><h1 id="odingg-netcoretools-for-vscode"><a class="markdownIt-Anchor" href="#odingg-netcoretools-for-vscode"></a> odinGG-NetCoreTools For Vscode</h1><p>Install above vscode (version &gt;=1.42.0) and The git plugin needs to be installed.</p><p>Fast way to build, run and test .NET Core (C#, F#) project</p><h3 id="prerequisites"><a class="markdownIt-Anchor" href="#prerequisites"></a> Prerequisites</h3><ul><li><a href="https://dotnet.microsoft.com/en-us/download">.NET Core</a> is installed</li></ul><h3 id="usage"><a class="markdownIt-Anchor" href="#usage"></a> Usage</h3><ul><li>Open a .NET Core project, right click on a .csproj, .fsproj or .sln file, and run .NET Core command from context menu.</li></ul><p>[<img src="/images/b112/eg.gif" alt="" />]</p><h3 id="change-log"><a class="markdownIt-Anchor" href="#change-log"></a> Change Log</h3><pre><code>See Change Log [here](./CHANGELOG.md)</code></pre><h2 id="license"><a class="markdownIt-Anchor" href="#license"></a> license</h2><h3 id="mit"><a class="markdownIt-Anchor" href="#mit"></a> MIT</h3><p>完整代码可以在 <a href="https://github.com/odinGitGmail/odinGG-NetCoreTools">GitHub</a></p><p><a href="/2024/0709/459a.html">VsCode插件开发</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;span id=&quot;more&quot;&gt;&lt;/span&gt;
&lt;h1 id=&quot;netcoretools-for-vscode&quot;&gt;&lt;a class=&quot;markdownIt-Anchor&quot; href=&quot;#netcoretools-for-vscode&quot;&gt;&lt;/a&gt; NetCoreTools For </summary>
      
    
    
    
    <category term="VsCode-plugin" scheme="https://odinsam.com/categories/VsCode-plugin/"/>
    
    
    <category term="odinGG-NetCoreTools" scheme="https://odinsam.com/tags/odinGG-NetCoreTools/"/>
    
    <category term="VsCode-plugin" scheme="https://odinsam.com/tags/VsCode-plugin/"/>
    
  </entry>
  
  <entry>
    <title>VsCode插件开发 - odinGG-vsce-sundry</title>
    <link href="https://odinsam.com/2024/0709/a885.html"/>
    <id>https://odinsam.com/2024/0709/a885.html</id>
    <published>2024-07-08T22:27:00.000Z</published>
    <updated>2025-11-23T03:10:55.020Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p><a href="/articles/a885.html">VsCode插件开发 - odinGG-vsce-sundry</a></p></blockquote><span id="more"></span><p># odinGG-vsce-sundry For Vscode</p><p><img src="https://img.shields.io/badge/version-2.0.0-brightgreen.svg" alt="" /> <img src="https://img.shields.io/github/issues/odinsam/odin-vsce-sundry" alt="" /> <img src="https://img.shields.io/github/forks/odinsam/odin-vsce-sundry" alt="" /> <img src="https://img.shields.io/github/stars/odinsam/odin-vsce-sundry" alt="" /> <img src="https://img.shields.io/badge/platform-typeScript-brightgreen.svg" alt="" /> <img src="https://img.shields.io/github/license/odinsam/odin-vsce-sundry" alt="" /> <a href="https://odinsam.com"><img src="https://img.shields.io/badge/Blog-odinsam.com-blue.svg" alt="" /></a></p><p><strong>简介:</strong></p><h3 id="v400-添加自定义-icon"><a class="markdownIt-Anchor" href="#v400-添加自定义-icon"></a> v4.0.0 添加自定义 icon</h3><h3 id="v31-新增快速获取当前文件的默认命名空间"><a class="markdownIt-Anchor" href="#v31-新增快速获取当前文件的默认命名空间"></a> v3.1 新增快速获取当前文件的默认命名空间</h3><h3 id="v3-新增-dbmodel-的生成功能"><a class="markdownIt-Anchor" href="#v3-新增-dbmodel-的生成功能"></a> v3 新增 dbModel 的生成功能</h3><ol><li><p>3.0 版本只支持 mysql 数据库</p></li><li><p>在电脑中新建 template 文件夹，在文件夹内新建 DbModel 文件夹</p></li><li><p>在上一步创建的文件夹中 创建对应文件 DbModelTemplate.cs</p></li><li><p>具体文件的内容可以自定义，插件保留 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi><mi>s</mi><mi>p</mi><mi>a</mi><mi>c</mi><mi>e</mi></mrow><annotation encoding="application/x-tex">namespace</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.43056em;"></span><span class="strut bottom" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="base textstyle uncramped"><span class="mord mathit">n</span><span class="mord mathit">a</span><span class="mord mathit">m</span><span class="mord mathit">e</span><span class="mord mathit">s</span><span class="mord mathit">p</span><span class="mord mathit">a</span><span class="mord mathit">c</span><span class="mord mathit">e</span></span></span></span>、<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>t</mi><mi>b</mi><mi>N</mi><mi>a</mi><mi>m</mi><mi>e</mi></mrow><annotation encoding="application/x-tex">tbName</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.69444em;"></span><span class="strut bottom" style="height:0.69444em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord mathit">t</span><span class="mord mathit">b</span><span class="mord mathit" style="margin-right:0.10903em;">N</span><span class="mord mathit">a</span><span class="mord mathit">m</span><span class="mord mathit">e</span></span></span></span>、<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>c</mi><mi>l</mi><mi>a</mi><mi>s</mi><mi>s</mi><mi>N</mi><mi>a</mi><mi>m</mi><mi>e</mi></mrow><annotation encoding="application/x-tex">className</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.69444em;"></span><span class="strut bottom" style="height:0.69444em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord mathit">c</span><span class="mord mathit" style="margin-right:0.01968em;">l</span><span class="mord mathit">a</span><span class="mord mathit">s</span><span class="mord mathit">s</span><span class="mord mathit" style="margin-right:0.10903em;">N</span><span class="mord mathit">a</span><span class="mord mathit">m</span><span class="mord mathit">e</span></span></span></span>、<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>m</mi><mi>o</mi><mi>d</mi><mi>e</mi><mi>l</mi><mi>P</mi><mi>r</mi><mi>o</mi><mi>p</mi><mi>s</mi></mrow><annotation encoding="application/x-tex">modelProps</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.69444em;"></span><span class="strut bottom" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="base textstyle uncramped"><span class="mord mathit">m</span><span class="mord mathit">o</span><span class="mord mathit">d</span><span class="mord mathit">e</span><span class="mord mathit" style="margin-right:0.01968em;">l</span><span class="mord mathit" style="margin-right:0.13889em;">P</span><span class="mord mathit" style="margin-right:0.02778em;">r</span><span class="mord mathit">o</span><span class="mord mathit">p</span><span class="mord mathit">s</span></span></span></span> 三个占位符,具体文件内容样例如下:</p></li></ol><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> System.ComponentModel.DataAnnotations;</span><br><span class="line"><span class="keyword">using</span> System.ComponentModel.DataAnnotations.Schema;</span><br><span class="line"><span class="keyword">namespace</span> $<span class="title">namespace</span>$</span><br><span class="line">&#123;</span><br><span class="line">    [<span class="meta">Table(<span class="string">&quot;$tbName$&quot;</span>)</span>]</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">class</span> $<span class="title">className</span>$ : <span class="title">BizEntityBase</span></span><br><span class="line">    &#123;</span><br><span class="line">        $modelProps$</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol start="5"><li>插件 配置如下：</li></ol><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//数据库配置</span></span><br><span class="line"><span class="attr">&quot;sundry.generateFile.DbConnectionSetting&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;dbType&quot;</span><span class="punctuation">:</span> <span class="string">&quot;mySql&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;host&quot;</span><span class="punctuation">:</span> <span class="string">&quot;x.x.x.x&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;port&quot;</span><span class="punctuation">:</span> <span class="number">3306</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;userName&quot;</span><span class="punctuation">:</span> <span class="string">&quot;root&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;pwd&quot;</span><span class="punctuation">:</span> <span class="string">&quot;password&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;dataBase&quot;</span><span class="punctuation">:</span> <span class="string">&quot;databaseName&quot;</span></span><br><span class="line"><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line"><span class="comment">// 数据库表名分隔符</span></span><br><span class="line"><span class="attr">&quot;sundry.generateFile.dbModel.splitChars&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="string">&quot;_&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="string">&quot;-&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="string">&quot;.&quot;</span></span><br><span class="line"><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"><span class="comment">// 生成模型 前缀 后缀 设置</span></span><br><span class="line"><span class="attr">&quot;sundry.generateFile.dbModel.prefixSuffixString&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="comment">// 数据库 表名 前缀</span></span><br><span class="line">    <span class="attr">&quot;prefix&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">        <span class="string">&quot;tb_&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="comment">// c#模型 命名 前缀</span></span><br><span class="line">    <span class="attr">&quot;addPrefix&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="comment">// 数据库 表名 后缀</span></span><br><span class="line">    <span class="attr">&quot;suffix&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="comment">// c#模型 命名 后缀</span></span><br><span class="line">    <span class="attr">&quot;addSuffix&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="comment">// 是否保留 数据库 表名 前缀</span></span><br><span class="line">    <span class="attr">&quot;isKeepPrefix&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line">    <span class="comment">// 是否保留 数据库 表名 后缀</span></span><br><span class="line">    <span class="attr">&quot;isKeepSuffix&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="v2-新增模板文件功能-使用模板文件自动生成文件使用说明"><a class="markdownIt-Anchor" href="#v2-新增模板文件功能-使用模板文件自动生成文件使用说明"></a> v2 新增模板文件功能 - 使用模板文件，自动生成文件，使用说明：</h3><ol><li><p>在电脑中新建 template 文件夹，在文件夹内新建 Controller IApiService ApiService IAppService AppService 文件夹</p></li><li><p>在上一步创建的文件夹中 创建对应文件 ControllerTemplate.cs IApiServiceTemplate.cs ApiServiceTemplate.cs IAppServiceTemplate.cs AppServiceTemplate.cs</p></li><li><p>具体文件的内容可以自定义，插件保留 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi><mi>a</mi><mi>m</mi><mi>e</mi><mi>s</mi><mi>p</mi><mi>a</mi><mi>c</mi><mi>e</mi></mrow><annotation encoding="application/x-tex">namespace</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.43056em;"></span><span class="strut bottom" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="base textstyle uncramped"><span class="mord mathit">n</span><span class="mord mathit">a</span><span class="mord mathit">m</span><span class="mord mathit">e</span><span class="mord mathit">s</span><span class="mord mathit">p</span><span class="mord mathit">a</span><span class="mord mathit">c</span><span class="mord mathit">e</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>c</mi><mi>l</mi><mi>a</mi><mi>s</mi><mi>s</mi><mi>N</mi><mi>a</mi><mi>m</mi><mi>e</mi></mrow><annotation encoding="application/x-tex">className</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="strut" style="height:0.69444em;"></span><span class="strut bottom" style="height:0.69444em;vertical-align:0em;"></span><span class="base textstyle uncramped"><span class="mord mathit">c</span><span class="mord mathit" style="margin-right:0.01968em;">l</span><span class="mord mathit">a</span><span class="mord mathit">s</span><span class="mord mathit">s</span><span class="mord mathit" style="margin-right:0.10903em;">N</span><span class="mord mathit">a</span><span class="mord mathit">m</span><span class="mord mathit">e</span></span></span></span> 两个占位符,具体文件内容样例如下:</p></li></ol><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">namespace</span> $<span class="title">namespace</span>$</span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">interface</span> $<span class="title">className</span>$ : <span class="title">INalongApiService</span></span><br><span class="line">    &#123;</span><br><span class="line">        $username$</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol start="4"><li>插件 配置如下：</li></ol><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;sundry.generateFile.TemplateFiles&quot;</span><span class="punctuation">:</span> <span class="string">&quot;/xxx/xxx/TemplateFiles&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;sundry.generateFile.TemplatePlaceHold&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">&quot;$username$&quot;</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">    <span class="attr">&quot;sundry.generateFile.TemplatePlaceHoldValue&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">&quot;odinsam&quot;</span><span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="v1-驼峰大小写转换"><a class="markdownIt-Anchor" href="#v1-驼峰大小写转换"></a> v1 驼峰大小写转换</h3><p>配置中默认以 空格 - ， 作为分隔符。可以配置</p><p>复制需要转换的句子或者词组，右键 选择菜单 驼峰大小写转换 或者 快捷键</p><p>大驼峰 cmd(ctrl)+t cmd(ctrl)+b</p><p>小驼峰 cmd(ctrl)+t cmd(ctrl)+s</p><p>配置如下:</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;sundry.transCamel&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">&quot; &quot;</span><span class="punctuation">,</span> <span class="string">&quot;-&quot;</span><span class="punctuation">,</span> <span class="string">&quot;,&quot;</span><span class="punctuation">,</span> <span class="string">&quot;.&quot;</span><span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h2 id="license"><a class="markdownIt-Anchor" href="#license"></a> license</h2><h3 id="mit"><a class="markdownIt-Anchor" href="#mit"></a> MIT</h3><p>完整代码可以在 <a href="https://github.com/odinGitGmail/odinGG-vsce-sundry">GitHub</a></p><p><a href="/2024/0709/459a.html">VsCode插件开发</a></p>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;/articles/a885.html&quot;&gt;VsCode插件开发 - odinGG-vsce-sundry&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="VsCode-plugin" scheme="https://odinsam.com/categories/VsCode-plugin/"/>
    
    
    <category term="VsCode-plugin" scheme="https://odinsam.com/tags/VsCode-plugin/"/>
    
    <category term="odinGG-vsce-sundry" scheme="https://odinsam.com/tags/odinGG-vsce-sundry/"/>
    
  </entry>
  
  <entry>
    <title>VsCode插件开发 - odinGG-git-commit-plugin</title>
    <link href="https://odinsam.com/2024/0709/1253.html"/>
    <id>https://odinsam.com/2024/0709/1253.html</id>
    <published>2024-07-08T22:21:00.000Z</published>
    <updated>2025-11-23T03:11:07.019Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p><a href="/articles/1253.html">VsCode插件开发 - odinGG-git-commit-plugin</a></p></blockquote><span id="more"></span><h1 id="git-commit-plugin-for-vscode"><a class="markdownIt-Anchor" href="#git-commit-plugin-for-vscode"></a> Git-commit-plugin For Vscode</h1><p><img src="https://img.shields.io/visual-studio-marketplace/v/redjue.git-commit-plugin" alt="Visual Studio Marketplace Version" /> <img src="https://img.shields.io/visual-studio-marketplace/d/redjue.git-commit-plugin" alt="Visual Studio Marketplace Downloads" /> <img src="https://img.shields.io/visual-studio-marketplace/i/redjue.git-commit-plugin" alt="Visual Studio Marketplace Installs" /> <img src="https://img.shields.io/visual-studio-marketplace/stars/redjue.git-commit-plugin" alt="Visual Studio Marketplace Rating (Stars)" /> <img src="https://img.shields.io/visual-studio-marketplace/r/redjue.git-commit-plugin" alt="Visual Studio Marketplace Rating" /> <img src="https://img.shields.io/github/contributors/RedJue/git-commit-plugin" alt="GitHub contributors" /> <img src="https://img.shields.io/github/last-commit/RedJue/git-commit-plugin" alt="GitHub last commit" /> <img src="https://img.shields.io/github/license/RedJue/git-commit-plugin?color=green" alt="GitHub" /></p><h3 id="install-above-vscode-version-1420-and-the-git-plugin-needs-to-be-installed"><a class="markdownIt-Anchor" href="#install-above-vscode-version-1420-and-the-git-plugin-needs-to-be-installed"></a> Install above vscode (version &gt;=1.42.0) and The git plugin needs to be installed.</h3><h3 id="follow-the-angular-team-commit-specificationlike-the-following"><a class="markdownIt-Anchor" href="#follow-the-angular-team-commit-specificationlike-the-following"></a> Follow the <a href="https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#-git-commit-guidelines">Angular Team Commit Specification</a>,like the following:</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&lt;type&gt;(&lt;scope&gt;): &lt;subject&gt;</span><br><span class="line">&lt;BLANK LINE&gt;</span><br><span class="line">&lt;body&gt;</span><br><span class="line">&lt;BLANK LINE&gt;</span><br><span class="line">&lt;footer&gt;</span><br></pre></td></tr></table></figure><h3 id="type"><a class="markdownIt-Anchor" href="#type"></a> Type</h3><p>Must be one of the following:</p><ul><li><strong>feat</strong>: A new feature</li><li><strong>fix</strong>: A bug fix</li><li><strong>docs</strong>: Documentation only changes</li><li><strong>style</strong>: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)</li><li><strong>refactor</strong>: A code change that neither fixes a bug nor adds a feature</li><li><strong>perf</strong>: A code change that improves performance</li><li><strong>test</strong>: Adding missing or correcting existing tests</li><li><strong>chore</strong>: Changes to the build process or auxiliary tools and libraries such as documentation generation</li></ul><h3 id="scope"><a class="markdownIt-Anchor" href="#scope"></a> Scope</h3><p>The scope could be anything specifying place of the commit change. For example <code>$location</code>, <code>$browser</code>, <code>$compile</code>, <code>$rootScope</code>, <code>ngHref</code>, <code>ngClick</code>, <code>ngView</code>, etc…</p><p>You can use <code>*</code> when the change affects more than a single scope.</p><h3 id="subject"><a class="markdownIt-Anchor" href="#subject"></a> Subject</h3><p>The subject contains succinct description of the change:</p><ul><li>use the imperative, present tense: “change” not “changed” nor “changes”</li><li>don’t capitalize first letter</li><li>no dot (.) at the end</li></ul><h3 id="body"><a class="markdownIt-Anchor" href="#body"></a> Body</h3><p>Just as in the <strong>subject</strong>, use the imperative, present tense: “change” not “changed” nor “changes”. The body should include the motivation for the change and contrast this with previous behavior.</p><h3 id="footer"><a class="markdownIt-Anchor" href="#footer"></a> Footer</h3><p>The footer should contain any information about <strong>Breaking Changes</strong> and is also the place to <a href="https://help.github.com/articles/closing-issues-via-commit-messages/">reference GitHub issues that this commit closes</a>.</p><p><strong>Breaking Changes</strong> should start with the word <code>BREAKING CHANGE:</code> with a space or two newlines. The rest of the commit message is then used for this.</p><p>A detailed explanation can be found in this <a href="https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit#">document</a>.</p><h2 id="quick-start"><a class="markdownIt-Anchor" href="#quick-start"></a> Quick start</h2><ul><li><p><strong>Step1</strong> Install the plugin</p></li><li><p><strong>Step2</strong> Use the command shortcut <code>showGitCommit</code> to open the command window or Click the icon on the git plugin navigation bar</p><p><img src="./assets/open.gif" alt="open" /></p></li><li><p><strong>Step3</strong> Enter the commit information, which automatically generates a commit message that conforms to the specification</p><p><img src="./assets/edit.gif" alt="edit" /></p></li></ul><h2 id="settings-options"><a class="markdownIt-Anchor" href="#settings-options"></a> Settings Options</h2><ul><li><code>GitCommitPlugin.ShowEmoji</code>: whether to show emoji, default <code>true</code>.</li></ul><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;GitCommitPlugin.ShowEmoji&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br></pre></td></tr></table></figure><ul><li><code>GitCommitPlugin.CustomCommitType</code>: customize the commit type, default <code>null</code>.</li></ul><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;GitCommitPlugin.CustomCommitType&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="string">&quot;customTypeName&quot;</span></span><br><span class="line"><span class="punctuation">]</span> or <span class="punctuation">[</span></span><br><span class="line">   <span class="punctuation">&#123;</span></span><br><span class="line">       <span class="attr">&quot;label&quot;</span><span class="punctuation">:</span> <span class="string">&quot;customTypeName&quot;</span><span class="punctuation">,</span></span><br><span class="line">       <span class="attr">&quot;detail&quot;</span><span class="punctuation">:</span> <span class="string">&quot;customTypeDetail&quot;</span></span><br><span class="line">   <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">]</span></span><br></pre></td></tr></table></figure><ul><li><code>GitCommitPlugin.MaxSubjectWords</code>: customize the maximum number of words on the subject, default <code>20</code>.</li></ul><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;GitCommitPlugin.MaxSubjectWords&quot;</span><span class="punctuation">:</span> <span class="number">20</span></span><br></pre></td></tr></table></figure><ul><li><code>GitCommitPlugin.Template</code>: customize the git commit template.</li></ul><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;GitCommitPlugin.Templates&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;templateName&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Angular&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;templateContent&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&lt;icon&gt;&lt;space&gt;&lt;type&gt;(&lt;scope&gt;):&lt;space&gt;&lt;subject&gt;&lt;enter&gt;&lt;body&gt;&lt;enter&gt;&lt;footer&gt;&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="punctuation">&#123;</span></span><br><span class="line">        <span class="attr">&quot;templateName&quot;</span><span class="punctuation">:</span> <span class="string">&quot;git-cz&quot;</span><span class="punctuation">,</span></span><br><span class="line">        <span class="attr">&quot;templateContent&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&lt;type&gt;(&lt;scope&gt;):&lt;space&gt;&lt;icon&gt;&lt;space&gt;&lt;subject&gt;&lt;enter&gt;&lt;body&gt;&lt;enter&gt;&lt;footer&gt;&quot;</span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">]</span></span><br></pre></td></tr></table></figure><h2 id="license"><a class="markdownIt-Anchor" href="#license"></a> license</h2><h3 id="mit"><a class="markdownIt-Anchor" href="#mit"></a> MIT</h3><p>完整代码可以在 <a href="https://github.com/odinGitGmail/odinGG-git-commit-plugin">GitHub</a></p><p><a href="/2024/0709/459a.html">VsCode插件开发</a></p>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;/articles/1253.html&quot;&gt;VsCode插件开发 - odinGG-git-commit-plugin&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="VsCode-plugin" scheme="https://odinsam.com/categories/VsCode-plugin/"/>
    
    
    <category term="VsCode-plugin" scheme="https://odinsam.com/tags/VsCode-plugin/"/>
    
    <category term="git-commit-plugin" scheme="https://odinsam.com/tags/git-commit-plugin/"/>
    
  </entry>
  
  <entry>
    <title>VsCode插件开发</title>
    <link href="https://odinsam.com/2024/0709/459a.html"/>
    <id>https://odinsam.com/2024/0709/459a.html</id>
    <published>2024-07-08T22:18:00.000Z</published>
    <updated>2025-11-23T03:14:45.915Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p><a href="/articles/459a.html">VsCode插件开发</a></p></blockquote><span id="more"></span><h3 id="vscode插件开发-odin-debugwindows"><a class="markdownIt-Anchor" href="#vscode插件开发-odin-debugwindows"></a> <a href="/2025/1123/9107.html">VsCode插件开发 - odin-DebugWindows</a></h3><h3 id="vscode插件开发-odingg-git-commit-plugin"><a class="markdownIt-Anchor" href="#vscode插件开发-odingg-git-commit-plugin"></a> <a href="/2024/0709/1253.html">VsCode插件开发 - odinGG-git-commit-plugin</a></h3><h3 id="vscode插件开发-odingg-vsce-sundry"><a class="markdownIt-Anchor" href="#vscode插件开发-odingg-vsce-sundry"></a> <a href="/2024/0709/a885.html">VsCode插件开发 - odinGG-vsce-sundry</a></h3><h3 id="vscode插件开发-odingg-netcoretools"><a class="markdownIt-Anchor" href="#vscode插件开发-odingg-netcoretools"></a> <a href="/2024/0709/b112.html">VsCode插件开发 - odinGG-NetCoreTools</a></h3>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;/articles/459a.html&quot;&gt;VsCode插件开发&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="VsCode-plugin" scheme="https://odinsam.com/categories/VsCode-plugin/"/>
    
    
    <category term="VsCode-plugin" scheme="https://odinsam.com/tags/VsCode-plugin/"/>
    
  </entry>
  
  <entry>
    <title>Error解决方案汇总 - Vue</title>
    <link href="https://odinsam.com/2024/0709/45c6.html"/>
    <id>https://odinsam.com/2024/0709/45c6.html</id>
    <published>2024-07-08T22:11:00.000Z</published>
    <updated>2024-07-24T01:21:44.886Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p><a href="/articles/45c6.html">Error解决方案汇总 - Vue</a></p></blockquote><span id="more"></span><h3 id="1-cannot-assign-to-read-only-property-exports-of-object-object"><a class="markdownIt-Anchor" href="#1-cannot-assign-to-read-only-property-exports-of-object-object"></a> 1. Cannot assign to read only property ‘exports’ of object ‘# &lt;Object&gt;’</h3><h4 id="原因"><a class="markdownIt-Anchor" href="#原因"></a> 原因：</h4><pre><code>webpack 2中不允许混用import和module.exports</code></pre><h4 id="解决方案"><a class="markdownIt-Anchor" href="#解决方案"></a> 解决方案</h4><pre><code>1. npm install --save-dev @babel/plugin-transform-modules-commonjs</code></pre><ol start="2"><li>增加配置 babel.config.js</li></ol>   <figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line"> plugins<span class="punctuation">:</span> <span class="punctuation">[</span>&#x27;@babel/plugin-transform-modules-commonjs&#x27;<span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h3 id="error解决方案汇总"><a class="markdownIt-Anchor" href="#error解决方案汇总"></a> <a href="/articles/d7fa.html">Error解决方案汇总</a></h3>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;/articles/45c6.html&quot;&gt;Error解决方案汇总 - Vue&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="Error" scheme="https://odinsam.com/categories/Error/"/>
    
    <category term="Vue" scheme="https://odinsam.com/categories/Error/Vue/"/>
    
    
    <category term="vue" scheme="https://odinsam.com/tags/vue/"/>
    
    <category term="error" scheme="https://odinsam.com/tags/error/"/>
    
    <category term="babel" scheme="https://odinsam.com/tags/babel/"/>
    
  </entry>
  
  <entry>
    <title>Error解决方案汇总</title>
    <link href="https://odinsam.com/2024/0709/d7fa.html"/>
    <id>https://odinsam.com/2024/0709/d7fa.html</id>
    <published>2024-07-08T22:09:00.000Z</published>
    <updated>2024-07-24T01:21:44.886Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p><a href="/articles/d7fa.html">Error解决方案汇总</a></p></blockquote><span id="more"></span><h3 id="error解决方案汇总-vue"><a class="markdownIt-Anchor" href="#error解决方案汇总-vue"></a> <a href="/articles/45c6.html">Error解决方案汇总 - Vue</a></h3>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;/articles/d7fa.html&quot;&gt;Error解决方案汇总&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="Error" scheme="https://odinsam.com/categories/Error/"/>
    
    
    <category term="error" scheme="https://odinsam.com/tags/error/"/>
    
  </entry>
  
</feed>
