2017-08-07 8 views
0

私はFluent NHibernateを使用していて、多くの更新をしようとしています。まず、次のようなコードがあります:Load for GetのようなQueryOverの方法はありますか?

using (ISession s = OpenSession()) 
    using (s.BeginTransaction()) 
    { 
     IList<SomeType> items s.QueryOver<SomeType>() 
      .Where(someCondition) 
      .List(); 
     items.ForEach(i => { 
      i.Foo = "bar"; 
      s.Update(i); 
     }); 
     s.Transaction.Commit(); 
    } 

しかし、問題は、すべての更新アイテムを更新する前に読み込む必要があるという点です。したがって、データベースは2回クエリされました。 SQLでは、1つのクエリで行うことができ、NHibernateの1つのクエリでこれを行う方法がいくつか存在すると思います。そして、実際にdbから項目をロードせず、代りにプロキシでしか動作せず、更新/削除を行うときにのみデータベースにヒットするLoadメソッドのdocが見つかりました。

存在しますか?NHibernateでは、アイテム自体はロードせず、ロードのようなプロキシをロードするいくつかのメソッドがありますか?

+0

申し訳ありませんが、NHはこの種のセットベースの操作には間違ったツールです。これを行う最も効率的な方法は、HQLまたは生のSQLを使用することです。それを言って、あなたは「ステートレスセッション」の使用を調査しましたか?それは効果的な妥協であるかもしれません。 –

+0

このコードを書く会社では、テキスト形式のクエリは使用しません。この場合のパフォーマンスは、SQLやHQLの書き込みにはあまり悪くありません。 IStatelessSessionは、ISessionインタフェースと似ていますので、それを助けません。 – Daniil

+0

@DavidOsborneとにかくお返事ありがとうございます。 – Daniil

答えて

0

大規模なデータを更新するには、ここで@DavidOsborneで述べたHQLまたは生のSQLを使用するのが最も良い方法です。

残念なことに、Loadメソッドとして怠惰に動作する他のメソッドが見つかりませんでした。

関連する問題