0

我需要定期清除我的一些数据库表。清除包括删除所有没有孩子的父母。当前实现使用存储过程来完成此任务。我想要的是消除存储过程并通过 NHibernate Linq 查询实现删除操作。例如,我需要一个删除所有没有项目的发票的查询。

4

2 回答 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 回答