簡體   English   中英

如何在Entity Framework Core中參數化串聯字符串查詢

[英]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屬性來確保對參數進行正確處理:

https://docs.microsoft.com/en-us/dotnet/api/system.data.sqlclient.sqlcommand.parameters?view=netframework-4.7.2#System_Data_SqlClient_SqlCommand_Parameters

更新:在EF Core中使用該特定構造函數時,將插值字符串隱式視為SQL命令,並對插值進行了清理。

但是,在這種情況下,您將需要使用@參數表示法構建字符串,然后使用SqlCommand替換參數以確保對它們進行過濾,因為您不能將查詢表示為單個模板文字。

另外,如果確實需要連接大量字符串,則+ =是一種非常低效的連接方式,應改用StringBuilder來提高速度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM