Pregunta

Esta pregunta parece surgir un poco y aún no he visto una buena respuesta. Tengo dos clases sin clave extranjera y sin una relación real que no sea un campo común, en este caso "Título".

Esto se basa libremente en un ejemplo que recientemente extraí de una aplicación heredada, no estoy permitido modificar el esquema, por lo que simplemente agregar una clave extranjera no es una opción. Todo lo que estoy buscando es una consulta que proporcione todos los requisitos previos para un curso con un título determinado:

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

No estoy buscando un mapeo como Join (), Hasmany (), etc., ya que aparentemente todos requieren una relación definida. Estoy buscando unir dos tablas basadas en columnas arbitrarias sin mapeo.

Una pregunta similar preguntado aquí Hace un tiempo parece indicar que es posible usar createalias () pero no he encontrado buenos ejemplos.

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

Esto es lo que se me ocurrió, pero no parece funcionar. ¿Alguna sugerencia?

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

Esto es bastante fácil de hacer con Linqtosql, ¿se puede hacer posiblemente con el proveedor de LINQ para nHibernate? Los ejemplos que he visto parecen indicar que el proveedor básicamente hierve una consulta realizada a cualquier Icriteria/Icriterion Magic que use NH; no parece ser posible, pero corrígeme si estoy equivocado.

¿Fue útil?

Solución

Una forma sería crear un criterio separado y realizar una existe a través de una subceles.

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

Esto generaría la siguiente cláusula SQL Where:-

WHERE exists (SELECT title as y0_
                   FROM   Course this_0_
                   WHERE  this_0_.Title = this_.Title)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top