Frage

Diese Frage scheint ein bisschen zu sehen und ich habe noch keine gute Antwort gesehen. Ich habe zwei Klassen ohne fremde Schlüssel und keine wirkliche Beziehung als ein gemeinsames Feld, in diesem Fall "Titel".

Dies basiert locker auf einem Beispiel, das ich kürzlich aus einer Legacy -Anwendung gezogen hatte. Ich darf das Schema nicht ändern, sodass einfach eine Fremdschlüssel hinzugefügt wird, ist keine Option. Alles, was ich suche, ist eine Frage, die alle Voraussetzungen für einen Kurs mit einem bestimmten Titel liefern würde:

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

Ich suche keine Kartierung wie Join (), Hasmany () usw., da sie alle anscheinend eine definierte Beziehung benötigen. Ich möchte zwei Tabellen anschließen, die auf willkürlichen Spalten ohne Zuordnung basieren.

Eine ähnliche Frage gefragt hier Vor einiger Zeit scheint es zu zeigen, dass es möglich ist, Createalias () zu verwenden, aber ich habe keine guten Beispiele gefunden.

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

Das habe ich mir ausgedacht, aber es scheint nicht zu funktionieren. Irgendwelche Vorschläge?

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

Dies ist leicht genug mit Linqtosql zu tun. Kann es möglicherweise mit dem LINQ -Anbieter für Nhibernate erfolgen? Die Beispiele, die ich gesehen habe, scheinen darauf hinzudeuten, dass der Anbieter im Grunde genommen eine Abfrage kocht, die von Icriteria/Icriiterion Magic von NH verwendet wird - es scheint nicht möglich zu sein, aber bitte korrigieren Sie mich, wenn ich mich irre.

War es hilfreich?

Lösung

Eine Möglichkeit wäre, ein distanziertes Kriterium zu erstellen und über eine Unterabfrage eine existierende Ausführung durchzuführen.

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

Dies würde die folgende SQL erzeugen, bei der Klausel:-

WHERE exists (SELECT title as y0_
                   FROM   Course this_0_
                   WHERE  this_0_.Title = this_.Title)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top