如何通过NHibernate LINQ有效删除所有没有子节点的父实体?

时间:2013-04-15 10:39:31

标签: nhibernate

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

2 个答案:

答案 0 :(得分:2)

除非你想向你的数据库发出大量的删除查询,否则使用Linq或QueryOver的简短回答你不能,除非你首先编写一个ID列表然后在子查询中使用它。在任何ORM

中,一次删除都会很麻烦

大多数解决方案使用存储过程或嵌入式命名查询(SQL或HQL)。

答案 1 :(得分:1)

使用QueryOver,您可以找到要删除的Invoice类型的所有持久对象。但正如Rippo所说,这将触发几个删除查询。您可以稍微修改一下并创建一个发票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();

代码看起来很乱,但它应该更有效。