Справка по проекции NHibernate

У меня проблема с созданием проекции для моего объекта 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"))); 

person CesarHerrera    schedule 21.05.2009    source источник
comment
Я также пробовал: DetachedCriteria query = DetachedCriteria.For ‹Spa› () .CreateAlias ​​(Address, A) .SetProjection (Projection.Distinct (Projection.Property (A.City))); но возникла ошибка: по крайней мере один элемент в исходном массиве не может быть приведен к типу целевого массива.   -  person CesarHerrera    schedule 21.05.2009


Ответы (1)


Мне кажется, ваш вопрос состоит из двух частей.

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

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

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

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

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

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

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

var cities = query.GetExecutableCriteria(session).List<string>();
person Daniel Schilling    schedule 07.05.2011