4

この質問は少し上に出るようですが、私はまだ良い答えを見てきました。私は外来キーを持たない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の魔法を問わず、実行されたクエリを沸騰させることを示しているようです - 誤解があってもそれを修正してください。

答えて

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) 
関連する問題