4

この質問は少し出てきたようですが、まだ良い答えが見つかりません。外部キーがなく、共通フィールド (この場合は「タイトル」) 以外の実際の関係がない 2 つのクラスがあります。

これは、私が最近レガシー アプリケーションから取得した例に大まかに基づいています。スキーマを変更することは許可されていないため、単に外部キーを追加することはできません。私が探しているのは、特定のタイトルのコースのすべての前提条件を提供するクエリだけです。

 select p.* from course c join prereq p on c.title = p.title

Join()、HasMany() などのようなマッピングは探していません。それらはすべて明らかに定義済みの関係を必要とするからです。マッピングなしで任意の列に基づいて 2 つのテーブルを結合しようとしています。

ここでしばらく前に尋ねられた同様の質問は、CreateAlias() を使用して可能であることを示しているようですが、良い例は見つかりませんでした。

   <class name="Course" table="course">
      <id name="id" column="id" type="long">
        <generator class="identity" />
      </id>
      <property name="Title" column="Title" type="String" />
    </class>

    <class name="Prereq" table="prereq">
      <id name="id" column="id" type="long">
        <generator class="identity" />
      </id>
      <property name="Title" column="Title" type="String" />
      <property name="PrereqTitle" column="PrereqTitle" type="String" />
    </class>

これは私が思いついたものですが、うまくいかないようです。助言がありますか?

        var results = session.CreateCriteria(typeof(Prereq)) 
            .CreateAlias("Course", "C")
            .CreateAlias("Prereq", "P")
            .Add( Expression.EqProperty("C.Title", "P.Title")) 
            .Add( Expression.Eq("C.Title", "Course With Prereq"))
            .List();

これは LinqToSql で簡単に実行できますが、NHibernate の Linq プロバイダーで実行できるでしょうか? 私が見た例は、プロバイダーが基本的に、NH によって使用される ICriteria/ICriterion マジックに対して実行されたクエリを沸騰させることを示しているようです。それは可能ではないようですが、間違っている場合は修正してください。

4

1 に答える 1

5

1 つの方法は、切り離された基準を作成し、サブクエリを介して存在を実行することです。

var dc = DetachedCriteria.For<Course>("c")
    .SetProjection(Projections.Property("c.Title"))
    .Add(Restrictions.EqProperty("c.Title", "p.Title"));

return Session.CreateCriteria<Prereq>("p")
    .Add(Subqueries.Exists(dc)).List<Prereq>();

これにより、次の sql where 句が生成されます。

WHERE exists (SELECT title as y0_
                   FROM   Course this_0_
                   WHERE  this_0_.Title = this_.Title)
于 2011-01-27T08:40:13.143 に答える