# Rider/DataGrip 可以用一下了吧
# Rider 常用快捷鍵
| 按鍵 | 用途 | 備註 |
| -------- | -------- | -------- |
| Shift * 2 / <br/> Ctrl + T | 全域的搜尋 | 最常使用 |
| Alt + Enter / <br/> Ctrl + . | 小燈泡快捷鍵 | 重構 & 抽方法 & 刪除無用using 等等等 <br/><br/> 有時候會因為中文輸入法<br/>導致 `Ctrl + .` 跟 `。` 重疊故改用 Alt + Enter |
| F2 / <br/> Ctrl + R , R | 改名 | 能用工具改就不要手動改 |
| F12 | 進入方法 | |
| Ctrl + F12 | 進入實作 | |
| Shift + F12 | 列出有誰使用 (Reference) | |
| ~~Ctrl + N~~ | 新增檔案|2025/11 此功能消失|
| Ctrl + Shift + A | 新增檔案| (改)|
| Alt + 1 | 方案總管 | |
| Alt + Shift + = <br/> (Ctrl + W) |以選到的目標開始往外作選擇 | (Keymap:Extend Selection) |
| Alt + Shift + . | 框起來的相同內容往下一個選 | |
| Alt + Shift + , | 框起來的相同內容往上一個選 | |
| Alt + Shift + ; | 選框起來的所有內容 | Keymap: Select All Occurrences |
| Alt + \ | 選擇(列出)成員 | 有時候 Implement/Interface 太多會用 |
| Alt + Home | 進入方法 Interface | |
| Ctrl + Space | 彈出建議 | 但也是會有輸入法要調整的問題<br/>可以改用 Ctrl + J |
| Ctrl + Shift + Space | 彈出可輸入的成員 | |
| Shift + Enter | 同一頁開分頁 | 常誤觸講一下 |
| Ctrl + K, K | 加入Bookmarks | 曾經追程式追到迷路的時候有用 |
| = 搜尋 = | |
| F3 | 下一個 | |
| Shift + F3 | 上一個 | |
| Ctrl + H | 替換文字 | |
---
# Settings
## Inlay Hints

有時候 AutoMapper 提示灰字太長,已經影響閱讀的時候可以關掉。

## 自己的調整
> Settings > Keymap > 使用 Visual Studio
想確認快捷鍵到底設定成甚麼功能時可用
`Find Actions by Shortcut` 搜尋

```
(我不常使用單行程式上下移動,自己改成方法的上下移動)
- Move line up
- [-] Alt + Up
- Move line down
- [-] Alt + Down
- Next Method
- [+] Alt + Down
- Previoud Method
- [+] Alt + Up
(釘選大頭針)
- Main Menu > Windows > Editor Tab > Pin Active Tab
- [+] Alt + P
```
# 小燈泡 Alt + Enter (Ctrl + .)
可以示範一下,開發時的習慣操作。
```
- Ctrl + N > 建 Interface , IUser
- Task<IEnumerable<UserDataModel>> GetUser();
- Alt + Enter > 建立 UserDataModel
- prop 宣告欄位
- Alt + Enter > 搬移檔案 Move to > UserDataModel.cs
- Interface.GetUser ///加註解
- Interface > Alt + Enter > Create derived type 產生 class User
- Alt + Enter > 搬移檔案 Move to > User.cs
- User.cs > Alt + Enter > Implement missing member
- User.GetUser > Alt + Enter > Copy documentation from base
- Interface > Ctrl + Shift + R > 加入 string name > ctrl + N > string email
```
## Ctrl + Shift + R (出發點為重構時)
Change Signature 改變簽章
用於新增 or 更新 傳入參數時可以同時調整 Implement & Interface

---
# EndPoint
**⚠ 注意 目前 EndPoint 會自動去除 Action 的 Async**

## 頁簽說明
1. HttpClient
1.1 `Submit Request` 直接觸發
1.2 `Open In Editor` 獨立檔案編輯(注意這個不存在於專案中,會存在於 Scratches and Consoles 內)
2. OpenAPI
`POST` `Parameter(ex:CategoryParameter)` 欄位是看不到的,
需要依靠匯入 OpenAPI 格式才可以做到。
3. Documentation
可用來複製API說明
4. Examples
---
## 匯入現有的 OpenAPI Url
> 後來想想其實跟直接開每一台主機 swagger 一樣,
> 知道可以這樣做即可,效益沒有很大


匯入 自己 or外部 服務 /swagger/v1/swagger.json 後
就可以在 Rider 內直接看到 Swagger 頁面
---
## HTTP Client (.http)
有教學影片可以看一下
> https://plugins.jetbrains.com/plugin/13121-http-client
1. 右上角 `Examples` 有基本範例 & 這個功能的介紹。
2. 左上角 可以直接插入 基本 `GET` 、`POST`。
3. 更多功能可以參考: `Open Http Client Help`
4. View > Tool Windows > [Structure]
(https://www.jetbrains.com/help/rider/2024.3/Http_client_in__product__code_editor.html?Http_client_in__product__code_editor&keymap=Visual%20Studio%202022&utm_source=product&utm_medium=link&utm_campaign=RD&utm_content=2024.3#structure-tool-window) 可以看到 http 檔案內所有的方法。


### 1.基本使用
```
# 註解
### 取得會員相簿明細
GET {{HostAddress}}/api/ws/AI/Album/2/Pictures
Authorization: Bearer {{AuthToken}}
```
> 💡 小提醒:
如果公司內的服務是只支援 HTTP/1.1 預設情況下,
打API通常會出現錯誤訊,這個時候只要在最後明確指定就可以了。
範例:GET https://xxxx.com/api/xxx HTTP/1.1
---
### 2.變數宣告
```
# 變數宣告 :會替換此檔案內所有的變數
@id = 35052
### 取得社區
GET {{HostAddress}}/api/v1/Community/{{id}}
### 取得社區Id含名稱列表
POST {{HostAddress}}/api/v1/Community
Content-Type: application/json # 要標記 Content-Type: application/json 就可以加入 Body {}
{
"county": "台北市"
}
```
### 3.環境變數
加入檔案 http-client.env.json
> 注意事項:
> 2025/02
> 1. ws社區情境:正式 及 測試 環境要使用 `http://` ,不然會出現
> 錯誤訊息: `java.nio.channels.ClosedChannelException`
```
{
"local": {
"HostAddress": "https://localhost:44341"
},
"dev": {
"HostAddress": "http://ws-community-t.woody.tw"
},
"productioin": {
"HostAddress": "http://ws-community.woody.tw"
}
}
```
如果有 AuthToken 但不想被加入版控,使用 `Add Enviornment to Private File`
就會產生 http-client.private.env.json 。
Rider 自己的 Git 工具會排除這個檔案
但使用 Fork 就要自己加 `ignore`
---
### 4.與 Visual Studio 版本差異
#### 4.1 觸發 API "前" 要作的行為 `< {% %}`
情境:
1. 針對單一 API 想要自訂變數時使用
2. 使用 js 方法 UrlEncode 文字後填入變數
```
### 使用建商地址取得建商基本資料列表。
<{%
const address = "臺北市大安區市民大道3段178號8樓";
const encodedAddress = encodeURIComponent(address);
request.variables.set("address", encodedAddress)
%}
GET {{HostAddress}}/api/v1/Builder/GetCompanyBasicListByAddressAsync/{{address}}
```
---
#### 4.2 觸發 API "後" 要作的行為 `> {% %}`
撰寫簡易的測試案例
注意:是使用 js 來撰寫測試。
#### 目前常用的檢查
##### 1.ResponseStatus 確認
```
client.test("驗證回傳狀態必須為 200", function () {
client.assert(response.status === 200, "Response status is not 200");
});
```
##### 2. 回傳欄位 是否存在 ( != null)
```
client.test("response.body 欄位必須符合", function () {
client.assert(response.body.apiVersion != null, "缺少 apiVersion 欄位");
client.assert(response.body.method != null, "缺少 method 欄位");
client.assert(response.body.status != null, "缺少 status 欄位");
client.assert(response.body.id != null, "缺少 id 欄位");
client.assert(response.body.data != null, "缺少 data 欄位");
});
```
##### 3. 回傳欄位 必須是 Array
```
client.test("data 陣列必須存在且至少有一筆資料", function () {
client.assert(Array.isArray(response.body.data), "必須是陣列");
client.assert(response.body.data.length > 0, "陣列必須至少有一筆資料");
});
```
##### 4. 回傳欄位 不可以是{}
```
client.test("驗證回傳 data 必須不為 {}", function () {
client.assert(Object.keys(response.body.data).length > 0, "不可為空");
});
# 範例
{
"id": "00aeb5e8-1b4f-4e22-83b2-1af84957d10e",
"apiVersion": "1",
"method": "/api/v1/CommunityDetail/dictionary.POST",
"status": "Success",
"data": {}
}
```
---
# 好用套件(PlugIn)
| 名稱 | 用途 |
| -------- | -------- |
|[CognitiveComplexity](https://plugins.jetbrains.com/plugin/12024-cognitivecomplexity) | 顯示程式複雜度|
|[Translation](https://plugins.jetbrains.com/plugin/8579-translation)| 翻譯工具|
|[CodeGlance Pro](https://plugins.jetbrains.com/plugin/18824-codeglance-pro) | 習慣程式碼右邊有"地圖" |
|[Kilo Code](https://plugins.jetbrains.com/plugin/28350-kilo-code) | 目前(2025/10/23) 體感在 Rider 上最好用的 AI Agent。<br/> Cline 也有在關注,但因為目前不能開多個專案有Bug。 |
---
# DataGrip(Rider-Database)
> Rider 內可以使用 DataBase 但會綁定到一個 sln 的設定,
但開新專案設定就消失了,所以轉而使用 [DataGrip](https://www.jetbrains.com/datagrip)。
> 以下知識都來自 [教學影片](https://www.youtube.com/watch?v=U5SOD-eeK50&list=PLQ176FUIyIUaY35luxpLwwivq0Z4EPbqN) & 幾周的使用心得
```
- Woody@xxxxxx-DEV(Host)
- DBName
- dbo
- tables
- 資料表在這
```
1. `Services > Database` 頁簽中可以看到歷史查詢資料
2. `Ctrl + Enter` 可以執行被框起來的 SQL 語法
3. 優點:
* 建議文字出現的蠻快的
* 可以搭配 Copilot 一起使用
4. 在 * 號上 Alt + Enter 選擇 Expand Column list 可以把欄位展開
因為預設 SQL Script > Select All rows from Table 會是 Select * From xxx

5. Autoscroll from Editor 可以自動跳到那張表,跟 Rider 追檔案一樣

6. 習慣看到資料表 & 欄位的描述 所以開啟 Comments (但現在都要搭配 Ctrl+F5 重整才會顯示)

## Database Explorer
當資料來源越來越多時就會想要分組
可以在資料庫上使用 F6 ( Move To Folder...) 分類

## 快捷鍵
> Keymap 使用 Windows 預設
| 按鍵 | 用途 | 備註 |
| -------- | -------- | -------- |
| Ctrl + Enter | 執行查詢 | |
| Ctrl + Shift + Q | 開新查詢語法 | |
| Shift + F6 | 改名稱 | 預設是 `Project File` <br/>可以用來改 Alias Name <br/>注意 !!<br/>這是可以直接改到真實資料表明稱的(要非常注意自己選到什麼) |
| Ctrl + F6 | 編輯資料表 |
| Ctrl + W | 往外選擇(有點難解釋可以自己操作) Extend Selection
| Ctrl + / | 註解 |
| Ctrl + Alt + L | 格式化文件|
| Alt + Shift + B | 等同 Autoscroll from Editor | |
| Ctrl + Shift + U | 框起來的內容大小寫轉換 | |
| Ctrl + Q | 快速看欄位型態(描述) | Quick Documentation |
| Ctrl + F12 | 編輯模式可以選擇要看的欄位(按空白決定顯示隱藏) | |
| Ctrl + Shift + F12 | 收起所有工具視窗 | |
## 查詢區塊
### 查詢預設值
預設就算查詢 * 也會是1000,是可以自己調整預設值的,選要的筆數後點 `Set as Defaul` 就可切換。

### Update 欄位
直接調整欄位 後點擊  (或是 Ctrl + Enter)

## 執行計畫 (Explain Plain)
要觀察的語法右鍵 > Explain Plan
(也可以執行多個查詢,但看起來不像SSMS會顯示誰比較優,要用 Cost 觀察)

顯示關聯圖


1. Index 如果有使用到會列出命中的,也會有 🗝️ 提示。
2. Rows 查詢出來的筆數
3. cost 總成本(相對百分筆) <-目前可以執行index後,用來觀察這個數字有沒有改變。
4. 如果明顯缺少 Index 也會直接提供建議 ⚠️。
### Index
| 查詢動作 (Action) | 中文名稱 | 效能評估 | 說明與建議 |
| :--- | :--- | :--- | :--- |
| **Full Scan (Table Scan)** | 全表掃描 | 🔴 優先處理 | 效能最差。資料庫必須讀取每一行資料,通常是因為完全沒有可用索引。 |
| **Index Scan** | 索引掃描 | 🟡 成本較高 | 遍歷整個索引樹。通常發生在模糊查詢(如 `%abc`)或欄位型別不匹配時。 |
| **Full Index Scan** | 叢集索引掃描 | 🟡 成本較高 | 掃描整個叢集索引(即整張表的資料)。常發生在 `SELECT *` 且無特定篩選條件時。 |
| **Index Seek** | **索引尋找** | 🟢 效率極高 | **優化目標。** 利用 B-Tree 結構快速定位資料點,I/O 消耗最小,速度最快。 |
---
| 查詢動作 (Action) | 中文名稱 | 效能評估 | 說明與建議 |
| :--- | :--- | :--- | :--- |
|**Key Lookup**| | |沒有 Include 回表取其他欄位 |
---
#### 編輯 (Ctrl+F6)


1. Columns: `Where` & `Join` & `ORDER BY` 會使用到的欄位。
2. Include Columns:SELECT 中需要的列。
3. PreView:有任何異動都會在這邊產生相對應的語法。
> 核心概念:Columns 是找資料的鑰匙,Include Columns 是帶出來的額外資料。
#### SQL Generator ( Ctrl + Alt + G )
直接產生 相關 SQL 語法


---
## SQL Format
> 自己習慣 SELECT & 型態 是大寫 ,
欄位是第一個字大寫
預設 Format 完都是小寫,
這個介面都會閃爍畫面讓你知道要改動的是甚麼很方便。
Settings > Editor > Code Style > SQL > General

1. KeyWord (SELECT) - 全大寫
2. Identifiers (欄位名稱) - 第一個字大寫
3. Built-in types (型態) - 全大寫
4. Aliased (別名) - 全小寫
---
## 複製(匯出)資料
> 有時候會想要把資料 當作 Insert 資料 / 當作Where條件/甚至是Excel/CSV 等等
把結果選擇起來複製後,就會產生對應的語法

### 先選擇想要的格式

#### SQL Inserts
```
INSERT INTO Northwind.dbo.Categories (CategoryName, Description) VALUES (N'Beverages', N'Soft drinks, coffees, teas, beers, and ales');
INSERT INTO Northwind.dbo.Categories (CategoryName, Description) VALUES (N'Condiments', N'Sweet and savory sauces, relishes, spreads, and seasonings');
INSERT INTO Northwind.dbo.Categories (CategoryName, Description) VALUES (N'Confections', N'Desserts, candies, and sweet breads');
INSERT INTO Northwind.dbo.Categories (CategoryName, Description) VALUES (N'Dairy Products', N'Cheeses');
INSERT INTO Northwind.dbo.Categories (CategoryName, Description) VALUES (N'Grains/Cereals', N'Breads, crackers, pasta, and cereal');
INSERT INTO Northwind.dbo.Categories (CategoryName, Description) VALUES (N'Meat/Poultry', N'Prepared meats');
INSERT INTO Northwind.dbo.Categories (CategoryName, Description) VALUES (N'Produce', N'Dried fruit and bean curd');
INSERT INTO Northwind.dbo.Categories (CategoryName, Description) VALUES (N'Seafood', N'Seaweed and fish');
```
#### Where Clause
複製後會直接變成條件格式
```
CategoryName IN (N'Beverages', N'Condiments', N'Confections', N'Dairy Products', N'Grains/Cereals')
```
## 例外處理
先前舊版也不能執行 .sql 但因為不影響使用就不管它
但目前升級到 2025.3 後預設就不是 console 而是真實建立 .sql 檔案
參考:https://youtrack.jetbrains.com/issue/DBE-16116?_gl=1*je52kb*_gcl_au*NjkwOTI0NzM2LjE3NTc0NjkzMDU.*FPAU*NjkwOTI0NzM2LjE3NTc0NjkzMDU.*_ga*Njg0MDIxNDQ5LjE3MTM3NTQyMDE.*_ga_9J976DJZ68*czE3NjQ3MzA3NzckbzEzNSRnMSR0MTc2NDczMDg4MiRqNjAkbDAkaDA.&_cl=MTsxOzE7b3hxODBnYXhLeXhMMkhYeU9qN21EQ2F6RGlLWEl1OXVKZmZLRHYxTXpGZmhzSXRVdWNhRzQ0MnA3V2NGSThFWTs=
調整 `SQL` 增加 File Name `*.sql` 後,
就可以有提示字 & 執行查詢了

---
---
# 其它紀錄
## User Secrets
在指定的專案 右鍵 > Tools > .NET User Secrets
csproj 也會自動加入 `<UserSecretsId></UserSecretsId>`

## User Secrets File
> 目前僅 Visual Studio 可使用
> 持續關注
> https://youtrack.jetbrains.com/issue/IJPL-65391/Add-in-HTTP-Client-support-for-secrets-coming-from-secrets-vaults-Azure-Key-Vault-AWS-Secrets-Manager-GCP-Secret-Manager-
參考文章:
https://learn.microsoft.com/zh-tw/aspnet/core/test/http-files?view=aspnetcore-9.0#aspnet-core-user-secrets
```
{
"config": {
"AuthToken": "eyJhbGciOiJSUzI....."
}
}
```
### http-client.env.json
取得 secret 的固定寫法參考 "AuthToken"
```
{
"local": {
"HostAddress": "https://localhost:44338",
"AuthToken": {
"provider": "AspnetUserSecrets", //固定寫法
"secretName": "config:AuthToken" //
}
}
}
```