Как запросить столбец внешнего ключа с помощью NHibernate без извлечения связанной сущности - PullRequest
4 голосов
/ 10 января 2012

Скажем, у меня есть два класса: Parent и Child.Parent имеет свойство Children, которое, конечно же, является коллекцией Child объектов.

Child не имеет свойства ParentId.У него есть свойство Parent.

Итак, мое отображение NHibernate для Child включает в себя:

<many-to-one name="Parent" class="Parent" column="ParentId" cascade="save-update" />

И мое отображение Parent включает:

<bag name="children" access="field" inverse="true" cascade="all-delete-orphan">
    <key column="ParentId" />
    <one-to-many class="Child" />
</bag>

Теперь вот что я хочу сделать: я хочу получить все Child объекты с определенным ParentId.Я знаю, что могу сначала получить Parent, а затем вернуть его Children свойство.Но что если я захочу запросить таблицу Child напрямую?

Если это будет сопоставленное свойство (например, Name), я мог бы использовать критерии NHibernate, но в этом случае ParentId не отображается.

Я пытался использовать что-то вроде:

criteria.Add(Restrictions.Eq("Parent.Id", 1));

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

Есть идеи?Что-то с проекциями и Restrictions.EqProperty?

Ответы [ 3 ]

6 голосов
/ 10 января 2012

Вы должны псевдоним путь ассоциации. Это вернет прокси для Parent, если предполагается, что используются ленивые загрузки. Вы можете получить доступ к свойству Id родителя, не вызывая загрузку.

return _session.CreateCriteria<Child>()
    .CreateAlias("Parent", "parent")
    .Add(Restrictions.Eq("parent.Id", parentId))
    .List<Child>();
5 голосов
/ 10 января 2012

Я сделал это, используя запрос.Вот пример:

Child foundChild = 
    session.QueryOver<Child>()
        .Where(x => x.Parent.Id == 1234).SingleOrDefault<Child>();
0 голосов
/ 10 января 2012

Я думаю, что это можно сделать с помощью следующих критериев:

criteria.Add(Restrictions.Eq("Parent", Session.Load<Parent>(1));
...