0

mvc3でアプリケーションを開発中です。
2つのドロップダウンがあり、最初のドロップダウンで選択された値に基づいて2番目のドロップダウンが設定されます。 最初のドロップダウンはコースであり、選択されたコースに基づいて、2番目のドロップダウンでコースが利用可能な州が設定されます。

Foreg.ifコースは 'MCA'で、州はマハラシュトラ、ラージャスターンなどでなければなりません。 これは私が正常に動作しているajax関数を書いている。 しかし、問題は、一度に1つの状態しか取得できないので、一度に複数の状態をフェッチできないことです。MVC3でIcollectionを反復処理する方法nhibernate

HobbyHomeAdress表は、私はいくつかの他の方法でフェッチProvincialStateIDが含まれています

私は、州名を取得するために、次のコードを書かれています。 次に、その値をProvincialStateテーブルのProvincialStateIDの値と比較し、そのテーブルのデータを取得しますが、最後のレコードのみを返します。

public ICollection<ProvincialState> FetchStateByStateid(ICollection<HobbyHomeAddress> hobbyhomeaddresslist) 
    { 
     log.Debug("Start"); 
     ISession session = DataAccessLayerHelper.OpenWriterSession(); 
     ITransaction transaction = session.BeginTransaction(); 
     ICollection<ProvincialState> provincialstate = null; 
     try 
     { 
      foreach (var state in hobbyhomeaddresslist) 
      { 
       provincialstate = session.CreateCriteria(typeof(ProvincialState)) 
           .Add(Expression.Eq("ProvincialStateID", state.ProvincialState.ProvincialStateID)) 
           .List<ProvincialState>(); 
      } 
      transaction.Commit(); 

     } 
     catch (SessionException ex) 
     { 
      if (transaction != null && transaction.IsActive) 
       transaction.Rollback(); 

      log.Error(ex); 
      provincialstate = null; 
     } 
     finally 
     { 
      if (transaction != null) 
       transaction.Dispose(); 

      if (session != null && session.IsConnected) 
       session.Close(); 

      log.Debug("End"); 
     } 
     return provincialstate; 
    } 

答えて

1

hobbyhomeaddresslistの州ごとにprovincialstateコレクションを再作成しています。つまり、最後の1つのエントリを持つコレクションになります。代わりに、コレクションを前もって作成し、アイテムを取得した後でコレクションに追加するだけです。単一のクエリ論理和を使用して:

...

... 
    List<ProvincialState> provincialstate = new List<ProvincialState>(); 
    try 
    { 
     foreach (var state in hobbyhomeaddresslist) 
     { 

      var list = session.CreateCriteria(typeof(ProvincialState)) 
          .Add(Expression.Eq("ProvincialStateID",  state.ProvincialState.ProvincialStateID)) 
          .List<ProvincialState>(); 
      provincialstate.AddRange(list); 
     } 
     transaction.Commit(); 

    } 
    ... 

更新を切り取ります。あなたが生成されたSQLを見れば

IList<ProvincialState> provincialstate = null; 
    Disjunction dj = new Disjunction();  
    try 
    { 
     foreach (var state in hobbyhomeaddresslist) 
     { 
      dj.Add(Expression.Eq("ProvincialStateID",  state.ProvincialState.ProvincialStateID)); 
     } 
     provincialstate = session.CreateCriteria(typeof(ProvincialState)) 
         .Add(dj) 
         .List<ProvincialState>(); 

     transaction.Commit(); 

    } 

することは、あなたが今、単一のは、単一のwhere句にはいくつかのwhere句の代わりに、いくつかの選択を選択し表示されるはずです。

+0

thanx 4返信私は説明を理解しましたが、私は 'AddRange()'として何の機能も持っていません。 – user1274646

+0

これは、n + 1のクエリで問題が発生することを認識しています – Baz1nga

+0

@ user1274646:provincialstateの定義をICollection <>からList <>に変更しましたか? ICollectionにはAddRange、Listがありません。 ListはICollectionを実装しているので、ListをICollectionとして返すことができます。 –

関連する問題