Pregunta

Dada una clase A relacionada con otra clase B en una relación de uno a muchos, ¿cómo puede crear una consulta NHibernate (utilizando la API Criteria - sin HQL) para encontrar todos los objetos A que '' no tienen ninguno ''? de los objetos relacionados B? Siguen detalles, pero primero quería hacer la pregunta.

Tengo dos clases de modelos, Sample y SampleDiagnosis . Sample tiene una propiedad Diagnoses que es un ISet < SampleDiagnosis > ;. SampleDiagnosis tiene una propiedad Propietario que enlaza con la muestra. Es una relación simple de uno a muchos.

La sección relevante de mi archivo de mapeo NHibernate de muestra se ve así:

<set name="Diagnoses" table="sample_diagnoses" cascade="all-delete-orphan" inverse="true">
  <key column="sample_id" />
  <one-to-many class="SampleDiagnosis" />
</set>

La parte relevante del archivo de mapeo de SampleDiagnosis se ve así:

<many-to-one name="Owner" class="Sample" column="sample_id" />

Estoy intentando crear una consulta de Criterios de NHibernate que coincida con las Muestras que no tienen ningún elemento en su lista de Diagnósticos . Aquí está el código que estoy usando para construir mi consulta de prueba:

var dc = DetachedCriteria.For<Sample>();

var subcriteria = dc.CreateCriteria("Diagnoses").SetProjection(Projections.RowCount());

dc.Add(Subqueries.Eq(0, subcriteria));

En mi opinión, el SQL generado para esto se parecería a lo siguiente:

SELECT * FROM samples WHERE (select count(*) from sample_diagnoses where sample_diagnoses.sample_id = samples.sample_id) = 0

Sin embargo, cuando realmente hago un GetExecutableCriteria () y List () con los resultados, mi código se bloquea. Difícil. No se lanzan excepciones, pero lo que sea que esté ejecutando el código (ya sea NUnit o w3p.exe) muere de una muerte horrible. Lo he probado en varias máquinas, todas con el mismo resultado. Tengo la sensación de que me falta algo crucial sobre cómo funcionan las subconsultas con conjuntos en NHibernate.

¿Fue útil?

Solución 2

Resulta que lo que estaba buscando era Expression.IsEmpty (" Diagnoses ") .

Otros consejos

Esto sería SO mucho más fácil a través de HQL - solo digo :)

¿Intentaste usar size ? Algo así como:

var dc = DetachedCriteria.For<Sample>();
dc.Add(Expression.sizeEq("Diagnoses", 0) );
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top