[英]Entity Framework Core, execute raw SQL and parameterize table name
[英]How to parameterize concatenated string queries in Entity Framework Core
在Entity Framework Core中,我可以像這樣對SQL查詢進行參數化:
_context.Database.ExecuteSqlCommandAsync($"select * from table where id = {myid}");
其中SQL查詢字符串是FormattableString
。
我需要一次運行大約100行的SQL更新,當我使用Linq時,這將對數據庫進行100次調用,這時我可以很容易地使用SQL語句執行此操作,例如
UPDATE entity
SET column = CASE .....
在一個電話中。 但是我不確定如何對串聯字符串執行此操作。
例如:
string sqlQuery = "UPDATE entity SET column = CASE "
for(int i = 0; i < 10; i++){
sqlQuery += "WHEN column2 = i THEN i + 1 ";
}
sqlQuery += "WHERE id IN (1,2,3,4,5,6,7,8,9,10)";
await _context.Database.ExecuteSqlCommandAsync(sqlQuery);
如何清理或參數化此查詢? 任何幫助將不勝感激!
第一個示例是一種錯誤的參數化查詢方式,因為它使您無法進行SQL注入:C#中的內插字符串功能不是專門為SQL命令設置的; 它打算有多種用途,因此無法實現SQL清除。
您應該始終使用 SqlCommand
類及其Parameters
屬性來確保對參數進行正確處理:
更新:在EF Core中使用該特定構造函數時,將插值字符串隱式視為SQL命令,並對插值進行了清理。
但是,在這種情況下,您將需要使用@參數表示法構建字符串,然后使用SqlCommand
替換參數以確保對它們進行過濾,因為您不能將查詢表示為單個模板文字。
另外,如果確實需要連接大量字符串,則+ =是一種非常低效的連接方式,應改用StringBuilder
來提高速度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.