我們可以使用下面的程式碼將 Entity Framework Core 實際執行的 SQL 語法顯示出來:
而在大型系統中一個 API 很可能會執行很多次 SQL 語法,而每個 SQL 語法又都超級長(每個欄位都會被列出來),要在這茫茫的 SQL 語法大海中尋找指定的指令真的很痛苦,而使用 Query Tags 可能可以減輕一點痛苦。
Query Tags 的用途就是替 SQL 語法加上註解,例如有以下程式碼,使用 TagWith 加上標籤:
Log 輸出範例:
沒錯...差不多就這樣。
不過還有一個很好用的功能: TagWithCallSite
一樣是剛剛的查詢條件,這次使用 TagWithCallSite:
Log 輸出範例:
這時候就可以看到這個 SQL 語法是在哪個檔案中執行的了!(會指向 TagWithCallSite 所在的行數)
參考資料:
Microsoft.Learn - Query tags
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
{
options.UseSqlServer(connectionString);
// 顯示 SQL 語法
options.LogTo(Console.WriteLine, LogLevel.Information);
});
而在大型系統中一個 API 很可能會執行很多次 SQL 語法,而每個 SQL 語法又都超級長(每個欄位都會被列出來),要在這茫茫的 SQL 語法大海中尋找指定的指令真的很痛苦,而使用 Query Tags 可能可以減輕一點痛苦。
Query Tags 的用途就是替 SQL 語法加上註解,例如有以下程式碼,使用 TagWith 加上標籤:
var result = _dbContext.Users
.TagWith("取得全部使用者")
.ToList();
Log 輸出範例:
info: 2024/7/14 23:59:57.942 RelationalEventId.CommandExecuted[20101] (Microsoft.EntityFrameworkCore.Database.Command)
Executed DbCommand (11ms) [Parameters=[@__filterDto_Type_0='?' (DbType = Int32)], CommandType='Text', CommandTimeout='30']
-- 取得全部使用者
SELECT [u].[Id], [u].[DisplayName], [u].[Email], [u].[PasswordHash]
FROM [Users] AS [u]
沒錯...差不多就這樣。
不過還有一個很好用的功能: TagWithCallSite
一樣是剛剛的查詢條件,這次使用 TagWithCallSite:
var result = _dbContext.Users
.TagWith("取得全部使用者")
.TagWithCallSite()
.ToList();
Log 輸出範例:
info: 2024/7/14 23:59:57.942 RelationalEventId.CommandExecuted[20101] (Microsoft.EntityFrameworkCore.Database.Command)
Executed DbCommand (11ms) [Parameters=[@__filterDto_Type_0='?' (DbType = Int32)], CommandType='Text', CommandTimeout='30']
-- 取得全部使用者
-- File: C:\Users\ruyut\Documents\RiderProjects\2023\work\my-project\my-project\Services\Users\UserService.cs:166
SELECT [u].[Id], [u].[DisplayName], [u].[Email], [u].[PasswordHash]
FROM [Users] AS [u]
這時候就可以看到這個 SQL 語法是在哪個檔案中執行的了!(會指向 TagWithCallSite 所在的行數)
參考資料:
Microsoft.Learn - Query tags
感謝分享~
回覆刪除