4

メンバーを持つクラス Mod があります。

ICollection<Event> EventList

クラス Event には次のメンバーがあります。

public virtual EventType Type { get; set; }

クラス EvenType には次のメンバーがあります。

   public virtual int Id

NHibernate Criteria を使用して、ID が 1 または 2 の Mod 内のすべてのイベントのリストを取得したいと考えています。これは私がしました:

var subCriteria = DetachedCriteria.For<Mod>()
    .Add(Restrictions.In("Event.Type", new int[] {1, 2 })
    );
criteria.Add(Subqueries.Exists(subCriteria));

しかし、プロジェクションのない基準でサブクエリを使用できないというランタイム エラーが発生します。

わかりましたが、投影に何を入れればよいかわかりません。プロジェクションの実行方法の例を見つけることができますが、目的を実際に説明するものは何もありません。さまざまなことを試しましたが、すべて実行時エラーが発生します。

メッセージ : 値を null にすることはできません。パラメーター名: キー ソース: mscorlib ヘルプ リンク: ParamName: キー

これが機能する場合はさらに追加するため、サブクエリを使用する必要があります。

プロジェクションで何をすべきか提案してもらえますか?

4

1 に答える 1

7

ここに文書化されているように:16.4。関連付けは次のように行うことができます:

IQueryOver<Mod, Event> query = session
  .QueryOver<Mod>()
  .JoinQueryOver<Event>(mod => mod.EventList)
  .WhereRestrictionOn(evnt => evnt.Type.Id).IsIn(new object[] { 1, 2});

var result = query.List<Mod>();

編集: 純粋な基準 API:

var criteria = session.CreateCriteria<Mod>();
var sub = criteria.CreateCriteria("EventList", JoinType.LeftOuterJoin);
    sub.Add(new InExpression("Type", new object[] { 1, 2 }));

var result = criteria.List<Mod>();

独立した基準を使用します。この場合、インスタンスへのEventTypeプロパティModIdまたは参照が必要Modです。サブクエリでは、有効な Mod.ID のリストを返す必要があります

var sub = DetachedCriteria
 .For<Event>()
 .Add(Restrictions.In("Type", new int[] {1, 2 })) // WHERE
 .SetProjection(Projections.Property("ModId")); // Mod.ID the SELECT clause

var criteria = session.CreateCriteria<Mod>();
criteria.Add(Subqueries.PropertyIn("ID", sub)); // Mod.ID in (select
var result = criteria.List<Mod>();
于 2012-12-20T14:39:32.920 に答える