Использование подвыбора в объединении с использованием NHibernate - PullRequest
0 голосов
/ 16 декабря 2009

Я бы хотел написать следующий SQl в NHibernate - Detached Criteria, если это возможно.

select * from parent 
INNER JOIN child on parent.id=child.parentid 
INNER JOIN 
  (select ChildID, MAX(ChildDate) MaxChildDate from child group by ChildID) max
ON child.childid, child.ChildDate=max.MaxChildDate

Это дает мне последнего ребенка в каждой паре.

Я могу написать подзапрос в Critera, но не могу выполнить двойную связь ChildID и MaxDate.

Ответы [ 3 ]

1 голос
/ 14 февраля 2010

Спасибо, объединение не было таким простым, как в примере, и использовалось много таблиц - прекрасно, если бы это было сделано при установке на основе набора SQL, но было бы нелепое количество данных, возвращающихся для фильтрации в linq.

К сожалению, скорость должна была превзойти дизайн, поэтому я создал представление со сложным объединением и использовал его в качестве таблицы для словаря в основном объекте домена. Спасибо за вашу помощь, хотя.

Приветствия

Stu

0 голосов
/ 23 декабря 2009

Я бы создал свойство отсортированного списка на родителе (отсортированное по ChildDate), поэтому, когда вы получите последний (возможно с расширениями linq), вы получите то, что вам нужно. Нет необходимости создавать сложные объединения.

0 голосов
/ 17 декабря 2009

Не могу сказать, что на самом деле знаю способ выполнения того, что вы просите, NHibernate возвращает фактический объект, который вы запрашиваете, в этом случае он возвращает список / набор родительских объектов. К этому родительскому объекту будет присоединена коллекция дочерних объектов. Насколько мне известно, концепция связывания этих данных дважды и извлечения различной информации не работает в NHibernate.

Если вам требуется, чтобы это было доступно непосредственно в Parent, я бы предложил создать еще одну переменную в объекте Parent, в которой эти данные предварительно отфильтрованы через атрибут where в вашем файле Parent.hbm.xml. Если вы не хотите этого делать, я бы предложил использовать LINQ или что-то подобное для извлечения последнего объекта Child для каждого Parent в вашей коллекции.

Пример атрибута "where", который вы найдете в файле Parent.hbm.xml:

<set name="LatestChild" table="child" generic="true" inverse="true" where="*your sub-query here*">
  <key column="parent_id" />
  <one-to-many class="YourNameSpace.Model.Child,Model"/>
</set>

При этом будут возвращаться только дочерние объекты, которые соответствуют запросу where коллекции.

Вы можете найти документацию по этому здесь . Хотя это ссылка на Hibernate, а не NHibernate, в большинстве областей она практически идентична.

Удачи!

...