0

わかりましたので、これの良い例を見つけることができないので、切り離された基準の使用方法をよりよく理解することができます (最初にそれを使用したいと仮定します)。

私は2つのテーブルを持っています。Placement と PlacementSupervisor

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

私がやろうとしているのは、スーパーバイザー ID の値が渡される場合、そのスーパーバイザー ID で配置を制限したいということです。

試しました:

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));
                }

エラーが表示されるだけです: 一致する基準情報プロバイダーが見つかりませんでした: (sup.supervisorId = 5 and sup.supervisorTypeId = U)

まず、supervisorTypeId は文字列です。第二に、私がやろうとしていることを達成する方法がわからないので、プロジェクション、プロパティエイリアス、サブクエリオプションのさまざまな組み合わせを試してみました..別のテーブルに参加する方法がわからないため/entity FK キーが 2 番目のテーブルにある場合。

誰かが私を正しい方向に向けることができますか?データの観点からはとても簡単なことのように思えますが、明らかな何かが欠けていることを願っています!!

4

2 に答える 2

1

これは役立つかもしれません。これは、Fabio Maulo による基準 API の概要です。

通常、セッションですぐに使用したくない場合は 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 列名ではなく、プロパティ名を使用していることを確認してください。
于 2011-02-25T08:39:22.963 に答える
0

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

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

Supervisors は Placement モデル クラスのプロパティです。

Expressions は、Restrictions によって半推奨されていることにも注意してください。

于 2011-02-27T23:20:15.220 に答える