Подзапросы NHibernate ICriteria со свойствами ISet <T>: это правильно? - PullRequest
1 голос
/ 03 августа 2009

Учитывая класс 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.

Ответы [ 2 ]

1 голос
/ 03 августа 2009

Оказывается, я искал Expression.IsEmpty ("Diagnoses") .

1 голос
/ 03 августа 2009

Это будет SO намного проще через HQL - просто говори :)

Вы пытались использовать size? Что-то вроде:

var dc = DetachedCriteria.For<Sample>();
dc.Add(Expression.sizeEq("Diagnoses", 0) );
...