Справка по проекции NHibernate - PullRequest
4 голосов
/ 21 мая 2009

У меня проблема с созданием проекции для моего объекта nhibernate detachedcriteria.

У меня есть класс Spa, который связан с таблицей Address.

Адрес имеет поле с именем Город, которое является строкой.

public class Spa : IAggregateRoot
{
       [BelongsTo("AddressID", Cascade = CascadeEnum.All)]
       public Address Address { get; set; }
}

Моя конечная цель - получить четкий список названий городов.

Если бы я мог получить все курорты с разными городами, я бы тоже был счастлив.

Все мои попытки были напрасны и не нашли полезных сообщений.

Пока я пробовал:

DetachedCriteria query = DetachedCriteria.For<Spa>()
                         .CreateAlias("Address", "A")

query.SetProjection(
         Projections.Distinct(Projections.ProjectionList()
         .Add(Projections.Alias(Projections.Property("Address"), "A"))));

var Spas = ActiveRecordMediator<Spa>.FindAll(query);

Я знаю, что вышеупомянутое неверно, просто пытаюсь найти где-то начать.

Любая помощь будет оценена. Также были бы полезны любые простые учебные пособия по проекциям, кажется, не могу найти что-нибудь прямое.

Я тоже пробовал, но получил ошибку приведения, просматривая это:

DetachedCriteria query = DetachedCriteria.For<Spa>() 
.CreateAlias("Address", "A")
.SetProjection(Projections.Distinct(Projections.Property("A.City"))); 

1 Ответ

2 голосов
/ 07 мая 2011

Мне кажется, на ваш вопрос есть две части.

1. Как должен выглядеть мой DetachedCriteria?

Если вы не выполняете никаких других агрегаций, GROUP BY должен предоставить те же результаты, что и DISTINCT. Этот запрос я бы использовал:

var query = DetachedCriteria.For<Spa>()
    .CreateAlias("Address", "A")
    .SetProjection(Projections.GroupProperty("A.City"));

2. Как мне выполнить это с замком ActiveRecord?

Я никогда не использовал ActiveRecord, но, основываясь на сигнатурах методов, я ожидал, что что-то подобное сработает

var cities = ActiveRecordMediator<string>.FindAll(query);

Если у вас есть доступ к сеансу NHibernate, вы также можете выполнить его следующим образом:

var cities = query.GetExecutableCriteria(session).List<string>();
...