2013-04-15 59 views

回答

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

該代碼看起來很混亂,但它應該更有效率。

+0

目前我使用這個結構: 使用(VAR TX = Session.BeginTransaction()){ VAR = notNeeded Session.Query () 。凡(M => m.Items.Any()!) ; foreach(Invoice invoice in notNeeded) { Session.Delete(invoice); } tx.Commit(); }但它效率很低 – zszep

+0

你嘗試過'CreateSQLQuery()'嗎? – mridula

+0

我已編輯答案。 – mridula

2

除非你想向你的數據庫發出大量的刪除查詢,否則使用Linq或QueryOver的簡短答案是不行的,除非你先編寫一個ID列表,然後在子查詢中使用它。一次刪除可能會很麻煩ORM

大多數解決方案使用存儲過程或嵌入式命名查詢(SQL或HQL)。

相關問題