Question

Cette question semble venir un peu et je l'ai encore vu une bonne réponse. J'ai deux classes sans clé étrangère et aucune relation réelle autre qu'un champ commun, dans ce cas, « Titre ».

Ceci est vaguement basé sur un exemple que je serais récemment tiré d'une application héritée, je ne suis pas autorisé à modifier le schéma ajoutant simplement une sorte de clé étrangère n'est pas une option. Tout ce que je suis à la recherche est une requête qui fournirait toutes les conditions préalables à un cours avec un titre donné:

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

Je ne suis pas à la recherche d'une cartographie comme join (), hasMany (), etc, car ils ont tous besoin apparemment une relation définie. Je cherche à joindre deux tables basées sur des colonnes arbitraires sans correspondance.

Une question similaire posée ici un certain temps semble indiquer qu'il est possible à l'aide createAlias ??() mais je n'ai pas trouvé de bons exemples.

   <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>

est ce que je suis venu avec, mais il ne semble pas fonctionner. Toutes les suggestions?

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

Ceci est assez facile à faire avec LinqToSql, peut-il être fait peut-être avec le fournisseur Linq pour NHibernate? Les exemples que j'ai vu semblent indiquer que le fournisseur se résume essentiellement une requête faite à tout ce que la magie ICriteria / ICriterion est utilisé par NH - il ne semble pas être possible, mais s'il vous plaît me corriger si je me trompe

.
Était-ce utile?

La solution

Une façon serait de créer un critère détaché et effectuer une existe par une sous requête.

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

générerait l'instruction SQL suivante where: -

WHERE exists (SELECT title as y0_
                   FROM   Course this_0_
                   WHERE  this_0_.Title = this_.Title)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top