2011-02-25 7 views
0

これで良い例が見つかりませんので、分離基準の使い方をよく理解できます。最初は)。Nhibernate - 切り離された基準(nhibernate 2のasp.net mvc 1)で詰まっています。C#

私は2つのテーブルを持っています。 配置と配置スペシャリスト

私のPlacementSupervisorテーブルにはPlacement.PlacementIDに関連するPlacementIDのFKがありますが、nhibernateモデルクラスにはPlacementSupervisorがあります。プレースメント(プレースメントIDのプロパティを具体的に指定するのではなく、これが重要かどうかはわかりません)。

私がしようとしているのは、スーパーバイザーIDの値が渡された場合、そのスーパーバイザーIDでプレースメントを制限したいということです。

を試してみました。まず(sup.supervisorId = 5とsup.supervisorTypeId = U)

: はに一致基準情報提供者を見つけることができませんでした:ちょうど私のエラーを与える

ICriteria query = m_PlacementRepository.QueryAlias("p") 
.... 
    if (criteria.SupervisorId > 0 && !string.IsNullOrEmpty(criteria.SupervisorTypeId)) 
       { 

        DetachedCriteria entityQuery = DetachedCriteria.For<PlacementSupervisor>("sup") 
         .Add(Restrictions.And(
             Restrictions.Eq("sup.supervisorId", criteria.SupervisorId), 
             Restrictions.Eq("sup.supervisorTypeId", criteria.SupervisorTypeId) 
            )) 
        .SetProjection(Projections.ProjectionList() 
             .AddPropertyAlias("Placement.PlacementId", "PlacementId") 
             ); 
        query.Add(Subqueries.PropertyIn("p.PlacementId", entityQuery)); 
       } 

をsupervisorTypeIdは文字列です。 第2に、私がしようとしていることを達成する方法を理解していないので、投影法とプロパティエイリアスとサブクエリオプションのさまざまな組み合わせを試しています。私は別のものにどのように加わるべきなのか分かりませんFKキーが2番目のテーブルに置かれているときにテーブル/エンティティとなります。

誰かが私を正しい方向に向けることができますか?データの観点からすれば、私はちょうど何かを明らかにしていないことがうまくいけば、それは簡単なことだと思う!!一般

+0

DBモデル、オブジェクト、マッピングを表示できますか? – Sly

答えて

0

上記のコードを使用できるようになりました。

query.CreateCriteria("Supervisors") 
     .Add(Restrictions.Eq("SupervisorId", (int)criteria.SupervisorId)) 
     .Add(Restrictions.Eq("SupervisorType.SupervisorTypeId", criteria.SupervisorTypeId)); 

私のプレースメントモデルクラスのプロパティであるスーパーバイザは、

また、式は半制限されていることに注意してください。

1

This might help. It's a good overview of the criteria api by Fabio Maulo

あなたが本当に1を必要とするようにそれが聞こえないので、すぐに、セッションでそれを使用したくない場合は、DeteachedCriteriasを使用しています。

上記のリンク(セクション13.4に)(私はあなたの条件に合うように変更したもの)の例を示します:

IList placements = sess.CreateCriteria(typeof(Placement)) 
       .CreateAlias("PlacementSupervisor", "sup") 
       .Add(Expression.EqProperty("sup.supervisorId", criteria.SupervisorId")) 
       .Add(Expression.EqProperty("sup.supervisorTypeId", criteria.SupervisorTypeId)) 
       .List(); 

他のいくつかの注意事項:

  1. 私は心配しないだろうFKの。あなたが関係をマップしている限り、NHは結合の仕方を理解することができます。
  2. プロパティ名は大文字と小文字が区別されますので、「sup.SupervisorId」でも試してみると思います。
  3. dbカラム名ではなく、プロパティ名を使用していることを確認してください。
+0

これは素晴らしいことです - ありがとうございます:) – Jen

関連する問題