2011-08-11 47 views
8

具有NHibernate的使用LINQ查詢這樣NHibernate的高效刪除使用LINQ Where條件

var q = from x in SomeIQueryable<SomeEntity> where x.A1 == a1 && x.B1 == b1 select x; 

的倉庫是否有解決方案如何得到這個WHERE過濾器,並運用它的「一次性銷燬」,這似乎只能通過HQL:

var cmd = string.Format("delete from SomeEntity where x.A1 = '{0}' and x.B1 = {1}", a1, b1); 
session.CreateQuery(cmd).ExecuteUpdate(); 

回答

6

NH LINQ提供程序和條件/ queryover API不支持條件刪除/更新。 HQL或原始SQL是唯一的選擇,除非你正在研究擴展NHibernate。

0
(from x in NHSession.Query<SomeEntity>() 
        where x.A1 == a1 && x.B1 == b1 
        select x).ForEach(y => { NHSession.Delete(y) }); 
     NHSession.Flush(); 
+1

請張貼一些解釋;只有代碼的答案不會說太多。 – rgettman

+0

這樣做的問題是,它會加載所有實體以刪除它們。 –

+0

這不是我們所說的高效 – Beatles1692

1

目前,從NH 4.0.1開始,這是不可能的。然而,在Jira有一個公開的問題(NH-3659,https://nhibernate.jira.com/browse/NH-3659)。有一個基於自定義攔截器和SQL替換的解決方案,其格式爲http://weblogs.asp.net/ricardoperes/strongly-typed-delete-with-nhibernate,但我正在研究一個乾淨的解決方案,並最終提交一個pull請求。

+0

我忘了說我正在研究NH-3659,但到目前爲止沒有任何東西可以顯示。在這篇文章中提到了一些替代方法:https://weblogs.asp.net/ricardoperes/deleting-entities-in-nhibernate(免責聲明:我自己的) –

+0

我已經提交了NH-3659的拉取請求 - 強類型化刪除。該鏈接可在https://nhibernate.jira.com/browse/NH-3659找到。 –

0

現在可以與NHibernate 5.0:

session.Query<SomeIQueryable>() 
      .Where(x => x.A1 == a1 && x.B1 == b1) 
      .Delete(); 

文檔:

// 
    // Summary: 
    //  Delete all entities selected by the specified query. The delete operation is 
    //  performed in the database without reading the entities out of it. 
    // 
    // Parameters: 
    // source: 
    //  The query matching the entities to delete. 
    // 
    // Type parameters: 
    // TSource: 
    //  The type of the elements of source. 
    // 
    // Returns: 
    //  The number of deleted entities. 
    public static int Delete<TSource>(this IQueryable<TSource> source);