2011-09-09 126 views
3

讓我們說如果我想要更新具有某種狀態的表的所有行與另一個status.I正在使用Nhibernate存儲庫模式。我有一個方法在我的存儲庫中讓我Iqueryable<T>更新記錄Nhibernate和Iqueryable

那麼,我該如何編寫更新。我不想要所有的元素,轉換爲列表,然後更新它。事實上,我甚至不希望Nhibernate選擇我的行列表。 它只需要在數據庫中使用我提供的值單獨運行更新語句。

所以如何我可以我acheive的..

回答

2

NHibernate的支持這種類型的經由HQL批量更新。見http://www.nhforge.org/doc/nh/en/index.html#batch-direct。嘗試沿着這條線...

public class ThingRepository : Repository<Thing>, IThingRepository 
{ 
    public int UpdateStatus(ThingStatus oldStatus, ThingStatus newStatus) 
    { 
     var query = Session.CreateQuery("UPDATE Thing SET Status = :newStatus WHERE Status = :oldStatus") 
      .SetEnum("oldStatus", oldStatus) 
      .SetEnum("newStatus", newStatus); 

     return query.ExecuteUpdate(); 
    } 
} 
+0

是有道理的..但我需要有一個參考我在ThingRepository中的會議,我沒有。我只有在我的存儲庫 .... –

+2

嘿阿什利,這是正確的答案。我看到你想要更新IQueryable的內容,但是你錯過了關於什麼是SQL更新的觀點。 IQueryable是延遲的「select」語句。更新是一個標量調用,是一個只寫操作。如果你真的想從IQueryable中調用update,你可以編寫一個擴展方法,但你仍然需要訪問會話,並且可能也會執行IQueryable(除非你檢查了表達式樹,根本不是一件簡單的任務) – andy