Учитывая класс A, связанный с другим классом B в отношении «один ко многим», как вы можете создать запрос NHibernate (используя Criteria API - нет HQL), чтобы найти все объекты A, у которых «нет» ни одного из связанные объекты B? Конкретные подробности следуют, но я хотел сначала задать вопрос.
У меня есть два класса моделей: Образец и Диагностика образца . Образец имеет свойство Diagnoses , которое является ISet . SampleDiagnosis имеет свойство Владелец , которое ссылается на образец. Это простые отношения один ко многим.
Соответствующий раздел моего образца файла сопоставления NHibernate выглядит следующим образом:
<set name="Diagnoses" table="sample_diagnoses" cascade="all-delete-orphan" inverse="true">
<key column="sample_id" />
<one-to-many class="SampleDiagnosis" />
</set>
Соответствующий фрагмент файла сопоставления SampleDiagnosis выглядит следующим образом:
<many-to-one name="Owner" class="Sample" column="sample_id" />
Я пытаюсь создать запрос NHibernate ICriteria, который будет соответствовать образцам, у которых нет элементов в списке Diagnoses . Вот код, который я использую для создания моего тестового запроса:
var dc = DetachedCriteria.For<Sample>();
var subcriteria = dc.CreateCriteria("Diagnoses").SetProjection(Projections.RowCount());
dc.Add(Subqueries.Eq(0, subcriteria));
На мой взгляд, SQL, сгенерированный для этого, будет выглядеть примерно так:
SELECT * FROM samples WHERE (select count(*) from sample_diagnoses where sample_diagnoses.sample_id = samples.sample_id) = 0
Однако, когда я выполняю GetExecutableCriteria () и List () с результатами, мой код вылетает. Жесткий. Никаких исключений не выдается, но что бы ни происходило при выполнении кода (будь то NUnit или w3p.exe), наступает ужасная смерть. Я пробовал на нескольких машинах, все с тем же результатом. У меня такое чувство, что мне не хватает чего-то важного в том, как подзапросы работают с наборами в NHibernate.