c# - SQL Server:删除具有多个条件的多行
问题描述
我试图从 SQL Server 表中删除多行,匹配多个条件。
假设下表:
在我的 C# 代码中,我有一个包含以下值的对象的列表。假设这个列表大小合适。
{Name = 'Bob', Address = '1600 Pennsylvania Avenue, Washington DC'},
{Name = 'Maria', Address = '21B Baker St, London, England.'}
删除这些值的最干净的方法是什么?我宁愿不对列表中的每条记录运行一个查询。
通常我会做这样的事情,但在这种情况下,它会清空我的整个表(这不是我想要的)。
DELETE FROM MyTable
WHERE Name IN ('Bob', 'Maria')
AND Address IN ('1600 Pennsylvania Avenue, Washington DC', '21B Baker St, London, England.')
这行得通,但它不是我认为具有适当大小的列表的“干净”的东西
DELETE FROM MyTable
WHERE
(Name = 'Bob' AND Address = '1600 Pennsylvania Avenue, Washington DC') OR
(Name = 'Maria' AND Address = '21B Baker St, London, England.')
我在我的 C# 应用程序中使用 Dapper,因此 Dapper 片段和原始 SQL 都可以帮助我。作为一个干净的 SQL 的傻瓜,我真的很好奇它有多干净。
非常感谢!
解决方案
这里有几件事需要考虑。当您部署 SQL 字符串的另一个变体时,您不仅会生成新字符串(应用程序中的分配),还会生成 SQL 服务器上的查询计划。每个排列都有自己的计划和缓存。这在小范围内可能并不重要,但值得牢记。
通常最干净的方式是最简单的。要做少量的项目,保持简单通常意味着循环。Dapper 接受IEnumerable
参数中的 an ,当它找到一个可枚举时,它将使用不同的参数n
时间执行相同的命令。虽然这是到服务器的往返,对于大量的数字来说不是很好,但它非常干净。这是它的样子,假设:
public class Foo
{
public string Name { get; set; }
public string Address { get; set; }
}
然后你会像这样删除多个:
var toDelete = new List<Foo>() {
new Foo { Name = "Bob", Address = "1600 Pennsylvania Avenue, Washington DC" },
new Foo { Name = "Maria", Address = "21B Baker St, London, England." }
};
conn.Execute(@"Delete From MyTable Where Name = @Name And Address = @Address", toDelete);
推荐阅读
- coldfusion - Coldfusion 会话丢失
- scala - spray.can.Http$ConnectionException:在 spray.can.client.HttpHostConnectionSlot.reportDisconnection 中止(HttpHostConnectionSlot.scala:228)
- javascript - 到达父容器底部时,滚动 iframe 中的长内容会短暂中断
- java - 用于表格布局的 android 中的 ID 没有增加
- android - 无法在 Dialogfragment 运行时更改视图
- azure - 仅查看一些基于 RBAC 的 ADLS 容器
- angular - 如何知道哪个孩子在Angular上使用@Output向父母发送事件
- node.js - 有没有一种本地方法可以将 MongoDB 结果作为对象而不是数组?
- javascript - 折叠后自动滚动
- scikit-learn - 导入 OneHotEncoder 但不可调用