【问题标题】:How can I effectively delete all parent entities that have no children via NHibernate LINQ?如何通过 NHibernate LINQ 有效地删除所有没有子实体的父实体?
【发布时间】:2013-04-15 20:43:49
【问题描述】:

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

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    除非您想向您的数据库发送大量删除查询,否则您不能使用 Linq 或 QueryOver 进行简短回答,除非您首先编写一个 ID 列表,然后在子查询中使用它。在任何ORM 中,一次删除都可能很麻烦

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

    【讨论】:

      【解决方案2】:

      使用QueryOver,您可以找出您希望删除的所有Invoice 类型的持久对象。但正如 Rippo 所说,这将触发几个 Delete 查询。您可以稍微修改一下并创建一个发票 ID 数组。然后创建一个使用YourSession.CreateSQLQuery一次性删除所有记录的SqlQuery。

      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();
      

      代码看起来乱七八糟,但应该更有效率。

      【讨论】:

      • 目前我正在使用这个结构: using (var tx = Session.BeginTransaction()) { var notNeeded = Session.Query() .Where(m => !m.Items.Any ()); foreach (invoice invoice in notNeeded) { Session.Delete(invoice); } tx.Commit(); } 但效率很低
      • 我试一试,但由于通常需要删除数百张发票,我认为这种方法也效率不高。
      • 我认为这肯定比向数据库发送单个删除命令要快。
      猜你喜欢
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      • 2021-12-20
      • 2018-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多