Domanda

Questa domanda sembra venire un po 'e ho ancora vedere una buona risposta. Ho due classi senza chiave esterna e nessun rapporto reale diverso da un campo comune, in questo caso "Title".

Questa è vagamente basato su un esempio che avevo recentemente tirato da un'applicazione legacy, non mi è permesso di modificare lo schema in modo semplice aggiunta di una chiave esterna non è un'opzione. Tutto quello che sto cercando è una query che avrebbe fornito tutti i presupposti per un corso con un determinato titolo:

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

Io non sto cercando una mappatura come Join (), hasMany (), ecc, dal momento che tutti apparentemente richiedono un rapporto definito. Sto cercando di unire due tabelle basate su colonne arbitrarie senza mappatura.

Una simile domanda chiesto qui un po 'indietro sembra indicare che è possibile utilizzare CREATEALIAS (), ma non ho trovato alcun esempio buoni.

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

Questo è quello che mi è venuta in mente, ma non sembra funzionare. Qualche suggerimento?

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

Questo è abbastanza facile da fare con LinqToSql, può eventualmente essere fatto con il provider LINQ per NHibernate? Gli esempi che ho visto sembrano indicare che il provider si riduce in sostanza una query fatto a qualsiasi magia ICriteria / ICriterion viene utilizzato da NH - non sembra essere possibile, ma per favore mi corregga se sbaglio

.
È stato utile?

Soluzione

Un modo potrebbe essere quello di creare un criterio staccate ed eseguire una esiste tramite una query sub.

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

Questo genera il seguente SQL clausola where: -

WHERE exists (SELECT title as y0_
                   FROM   Course this_0_
                   WHERE  this_0_.Title = this_.Title)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top