我有一个复制数据和进行修改的服务。其中一个功能就是直接复制数据库中的删除和插入,这很好并且很容易使用Entity完成,不幸的是,较大的查询变得非常慢,所以我希望只需将其作为原始SQL查询运行。
现在采用foreach循环的形式,并根据通过
提供的内容构建查询即
if(deletes.Count() > 0)
{
// Build up delete string
StringBuilder sqlCommand = new StringBuilder("DELETE FROM RandomTable WHERE ");
List<string> rows = new List<string>();
foreach(var item in query)
{
rows.Add(string.Format("(Key1 = '{0}' AND Key2 = '{1}' AND Key3 = '{2}' AND Key4 = '{3}' AND Key5 = '{4}')",
item.Key1, item.Key2, item.Key3, item.Key4, item.Key5));
}
sqlCommand.Append(string.Join(" OR ", rows));
sqlCommand.Append(";");
runyoubadthing(sqlCommand);
}
(请注意,我正在剥离引号和垃圾,但这个例子不需要)现在我知道它们需要参数化(但是上面的服务只是在数据库之间进行协商,因此技术上不需要它,但我仍然喜欢遵循良好的做法。)
我的问题是:我如何在正确的参数化查询中执行上述操作,它可以作为单个查询运行,而不是作为数千个单个删除运行,这将花费更多的时间?
附注:使用单个自动递增ID,这整个考验将大约好1000倍,不幸的是,这不是我的数据库,现在我必须处理多达10个主键噩梦以查找唯一数据
答案 0 :(得分:1)
您可以尝试这样的事情:
var Command = new SQLCommand {
CommandText = "DELETE FROM RandomTable WHERE ",
Connection = yourConnection
};
var count = 0;
foreach(var item in query)
{
Command.CommandText += Command.CommandText.EndsWith("WHERE ")? "": "OR ";
Command.CommandText += $"(Key1 = '@{count}0' AND Key2 = '@{count}1' AND Key3 = '@{count}2' AND Key4 = '@{count}3' AND Key5 = '@{count}4')";
Command.Parameters.Add($"@{count}0", [YourDBType]).Value = item.Key1;
Command.Parameters.Add($"@{count}1", [YourDBType]).Value = item.Key2;
Command.Parameters.Add($"@{count}2", [YourDBType]).Value = item.Key3;
Command.Parameters.Add($"@{count}3", [YourDBType]).Value = item.Key4;
Command.Parameters.Add($"@{count}4", [YourDBType]).Value = item.Key5;
count++;
}
Command.Prepare();
//Execute Command
除了为每个项目执行删除命令之外,我认为没有更好的方法来解决这个问题。