Entity Framework Core 查詢標籤 Query Tags 介紹

我們可以使用下面的程式碼將 Entity Framework Core 實際執行的 SQL 語法顯示出來:
    
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

留言

張貼留言

如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com