[英]Delete multiple rows in PostgreSQL with Entity Framework using WHERE IN clause
我有一個 postgresql 數據庫,我想要做的是在盡可能少的查詢中從表中刪除一堆行。 所以循環不是一個好的選擇。 我正在為 postgres 驅動程序使用 NPGSQL。
我有下面的代碼,但它不起作用。
string[] namesToDelete = PromosReplies.
PromosRepliesLoaded.GroupBy(pr => pr.Name).
Select(r=>r.Key).ToArray();
long[] repliesIdsToDelete = context.PromosReplies.
Where(pr => namesToDelete.Contains(pr.Name)).
Select(r => r.Idx).ToArray();
if (repliesIdsToDelete.Length > 0)
{
foreach (var name in namesToDelete)
{
context.Database.ExecuteSqlCommand("DELETE FROM messages WHERE name = {0}", name);
}
string idToDelete = String.Join(",", repliesIdsToDelete);
int result = context.Database.ExecuteSqlCommand(
"DELETE FROM message_translations WHERE idx IN ({0})",
repliesIdsToDelete);
嘗試執行最后一個查詢時出現“錯誤:22P02:整數輸入語法無效:”錯誤。 有沒有辦法克服這個問題? 如果是,可以使用第一個刪除語句完成類似的操作,我必須使用字符串?
更新我不使用 EF,但這里是使用數組作為 Npgsql 參數的方法:
var cmd = NpgsqlCommand();
cmd.CommandText = "select * from test where id = any(@list)";
cmd.Connection = "**************************";
cmd.Parameters.Add("list", NpgsqlDbType.Array | NpgsqlDbType.Integer);
cmd.Connection.Open();
var r = cmd.ExecuteReader();
所以我想在 EF 中它會是這樣的:
var par = new NpgsqlParameter("list", NpgsqlDbType.Array | NpgsqlDbType.Text);
var par.Value = namesToDelete;
int result1 = context.Database.ExecuteSqlCommand(
"DELETE FROM messages WHERE name = any(@list)",
par
);
老我根本不喜歡這個,因為它可能導致 SQL 注入:
int result1 = context.Database.ExecuteSqlCommand(
String.Format(
"DELETE FROM messages WHERE name in ({0})",
String.Join(",", namesToDelete.Select(x => "'" + x + "'"))
)
);
int result2 = context.Database.ExecuteSqlCommand(
String.Format(
"DELETE FROM message_translations WHERE idx in ({0})",
String.Join(",", repliesIdsToDelete)
)
);
我不是 EntityFramework 的專家,但我認為當您使用context.Database.ExecuteSqlCommand(command, str)
, str 用作參數,因此您的命令變為DELETE FROM message_translations WHERE idx in ('1, 2, 3, 4')
(注意單引號, '1, 2, 3, 4'
實際上是服務器端的字符串)。
如果您的數據庫是 SQL 服務器,您可以使用表值參數,也許可以將數組作為參數傳遞給 PostgreSQL,稍后再試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.