Entity Framework Core:FromSqlRaw 與 FromSqlInterpolated 的使用與差異
Entity Framework Core (EF Core) 是一個開源的、跨平台的資料庫存取技術,它可以讓開發者用 .NET 對資料庫進行操作,而不需要寫 SQL 語句。然而,有時候我們還是需要直接執行 SQL 查詢,這時候 EF Core 提供了 FromSqlRaw
和 FromSqlInterpolated
兩種方法。
這兩種方法的主要差異在於,FromSqlRaw
需要手動參數化查詢,而 FromSqlInterpolated
則會自動參數化查詢。如果不正確使用,可能會使應用程式暴露於 SQL 注入攻擊。
以下是一些使用這兩種方法的例子和解釋:
當執行原始 SQL 查詢時,Entity Framework Core 為我們提供了兩種擴充方法:
- FromSqlRaw
- FromSqlInterpolated
這兩種選項之間有些微的差異,如果不理解,可能會使應用程式暴露於 SQL 注入攻擊。
讓我們通過一些範例來理解這些差異。這邊執行一個帶有一個參數 - 專輯標題,這邊會帶去 SQL 查詢。
方法 #1:使用 FromSqlRaw
FromSqlRaw
方法需要手動參數化查詢。以下是一個例子:
|
|
這裡是生成的 SQL 查詢。它是參數化的,並且安全。
方法 #2:使用 FromSqlRaw 和插值語法
如果使用插值語法而不參數化查詢,則可能會受到 SQL 注入攻擊。以下是一個例子:
|
|
方法 #3:使用 FromSqlInterpolated
FromSqlInterpolated
方法會自動參數化查詢,並且支援插值語法。以下是一個例子:
|
|
生成的 SQL 查詢是參數化的。
在選擇使用 FromSqlRaw
或 FromSqlInterpolated
時,我們需要考慮到 SQL 注入攻擊的風險。如果我們可以確保查詢是安全的,則可以使用 FromSqlRaw
。否則,我們應該使用 FromSqlInterpolated
,因為它會自動參數化查詢,從而降低 SQL 注入攻擊的風險。
這邊看到這個 FromSqlInterpolated
方法真的很神奇。
動態欄位處理注意
FromSqlRaw
說起來還是有用的,我們做動態方法查詢 SQL,SQL 語句可能是動態的,我們可以用 FromSqlRaw
實現我們要的效果
FromSqlInterpolated
無法達成這個效果。
|
|
在這個例子中,我們首先定義了一個 SQL 查詢,然後檢查 propertyValue
是否為 null
。如果 propertyValue
不為 null
,則在 SQL 查詢的末尾加上 where
條件。最後,使用 FromSqlRaw
方法執行 SQL 查詢。
然而,FromSqlInterpolated
在這種情況下無法達成我們要的效果。FromSqlInterpolated
是用於執行參數化的 SQL 查詢,但是它無法處理動態的查詢條件。在 FromSqlInterpolated
中,所有的參數都必須在查詢中明確指定,而不能像 FromSqlRaw
那樣在執行時動態地添加查詢條件。
更多關於動態 SQL 查詢的資訊,可以參考Microsoft 官方文件