我有需要定期清除我的一些數據庫表。清除包括刪除所有沒有子女的父母。當前的實現使用存儲過程來完成此任務。我想要的是消除存儲過程,並通過NHibernate Linq查詢實現刪除操作。例如。我需要一個刪除所有沒有項目的發票的查詢。如何通過NHibernate LINQ有效地刪除所有沒有孩子的父實體?
0
A
回答
1
使用QueryOver
,您可以找出要刪除的所有類型爲Invoice
的所有持久對象。但正如Rippo所說,這將會觸發幾個刪除查詢。您可以修改這一點並創建發票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();
該代碼看起來很混亂,但它應該更有效率。
2
除非你想向你的數據庫發出大量的刪除查詢,否則使用Linq或QueryOver的簡短答案是不行的,除非你先編寫一個ID列表,然後在子查詢中使用它。一次刪除可能會很麻煩ORM
大多數解決方案使用存儲過程或嵌入式命名查詢(SQL或HQL)。
相關問題
- 1. 如何在SQL中刪除所有沒有孩子的父母?
- 2. NSManagedObjectContext子/父 - 孩子沒有刪除registeredObjects
- 3. 逐步通過所有的孩子,並刪除所有樣式
- 4. JPA如何刪除沒有刪除孩子的父母?
- 5. NHibernate Group通過沒有N + 1查詢的父實體?
- 6. Linq - 如何讓所有的孩子
- 7. Nhibernate刪除父模型的孩子 - MVC3
- 8. 祖先 - 如何讓所有父母沒有孩子?
- 9. 從QVBoxLayout刪除所有的孩子
- 10. CRM Linq找到所有有0個孩子的父母
- 11. 更好的Linq查詢過濾沒有孩子的父列表
- 12. 如何刪除所有JPA實體?
- 13. 是否有可能刪除與他們所有的孩子使用NHibernate的根實體的集合
- 14. 通過php刪除xml節點和所有孩子
- 15. 刪除父元素和所有的孩子
- 16. Fancytree:刪除沒有孩子的節點
- 17. 實體框架代碼首先刪除實體沒有父
- 18. 刪除孩子沒有工作
- 19. 如何刪除包含所有子項的實體
- 20. Linq-to-SQL最佳實踐:刪除的實體沒有真正被刪除
- 21. 如何使用Hibernate刪除父項時刪除所有子行?
- 22. 如何刪除父記錄時刪除所有子記錄?
- 23. 如何有效地刪除文檔庫中的所有文件?
- 24. 我可以配置Fluent NHibernate將刪除的父級的所有子實體移動到新的父級?
- 25. SQLite觸發器EXPR刪除父時,沒有孩子
- 26. 刪除某個孩子(或某些孩子)以外的所有孩子
- 27. 刪除Entity Framework中的所有實體
- 28. 在SQL中,如何選擇所有有孩子的父母?
- 29. Linq To Sql:檢索沒有附加子項的父實體
- 30. NHibernate問題從具有子選擇的實體中刪除
目前我使用這個結構: 使用(VAR TX = Session.BeginTransaction()){ VAR = notNeeded Session.Query() 。凡(M => m.Items.Any()!) ; foreach(Invoice invoice in notNeeded) { Session.Delete(invoice); } tx.Commit(); }但它效率很低 –
zszep
你嘗試過'CreateSQLQuery()'嗎? – mridula
我已編輯答案。 – mridula