我需要定期清除我的一些数据库表。清除包括删除所有没有孩子的父母。当前实现使用存储过程来完成此任务。我想要的是消除存储过程并通过 NHibernate Linq 查询实现删除操作。例如,我需要一个删除所有没有项目的发票的查询。
问问题
135 次
2 回答
2
除非您想向您的数据库触发大量删除查询,否则使用 Linq 或 QueryOver 的简短答案是不能的,除非您首先编写一个 ID 列表,然后在子查询中使用它。一枪删除在任何情况下都可能很麻烦ORM
大多数解决方案使用存储过程或嵌入式命名查询(SQL 或 HQL)。
于 2013-04-15T10:59:15.030 回答
1
使用 a QueryOver
,您可以找出您希望删除的所有类型的持久对象。Invoice
但正如 Rippo 所说,这将触发几个 Delete 查询。您可以稍微修改一下并创建一个发票 ID 数组。然后创建一个 SqlQuery 使用 . 一次删除所有记录YourSession.CreateSQLQuery
。
var invoicesToDelete = YourSession.QueryOver<Invoice>().Where(invoice => invoice.items == null).List();
var invoiceIds = new List<int>();
foreach(var invoice in invoicesToDelete)
{
invoiceIds.Add(invoice.Id);
}
string queryString = "delete from invoice where id in(";
foreach(var id in invoiceIds)
{
queryString = queryString + id + ",";
}
queryString = queryString.TrimEnd(',');
queryString = queryString + ")";
ISQLQuery query = YourSession.CreateSQLQuery(queryString);
queryString.UniqueResult();
YourSession.Transaction.Commit();
代码看起来很乱,但应该更有效率。
于 2013-04-15T11:36:07.283 回答