この質問は少し上に出るようですが、私はまだ良い答えを見てきました。私は外来キーを持たない2つのクラスを持ち、共通のフィールド以外の実際の関係はありません。この場合は "タイトル"です。NHibernate CreateAlias - 任意の列の結合
これは、私が最近レガシーアプリケーションから取り出した例に基づいています。スキーマを変更することはできません。単純に外部キーを追加することはオプションではありません。私が探しているすべては、指定されたタイトルでコースのための前提条件をすべて提供するクエリです:
select p.* from course c join prereq p on c.title = p.title
I)は(参加のようなマッピングを探していないよ、などhasManyの()、以来、彼らは明らかに定義された関係を必要とします。私は、マッピングのない任意の列に基づいて2つのテーブルを結合しようとしています。
同様の質問asked here私は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の魔法を問わず、実行されたクエリを沸騰させることを示しているようです - 誤解があってもそれを修正してください。