2011-09-09 11 views
3

ステータスを持つテーブルのすべての行を別のステータスで更新したいとしましょう。Nhibernateでリポジトリパターンを使用しています。私のリポジトリにIqueryable<T>というメソッドがあります。更新レコードNhibernateとIqueryable

どのように私はthat.Iのための更新プログラムを書いていないすべての要素を取得し、リストに変換し、それを更新します。実際には、私も行のリストを選択するNhibernateしたくない。 それは、私が提供する値を持つDBでupdate文だけを実行する必要があります。

ので、私はそれを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は、遅延された「選択」ステートメントです。更新はスカラー呼び出し、書き込み専用操作です。あなたが本当にアップデートをIQueryableから外したいのであれば、拡張メソッドを書くことができますが、セッションにアクセスしなければならず、可能な限りIQueryableを実行することもできます(表現ツリーを調べて、 – andy