Использование SQLProjection на связанной сущности с NHibernate

Я пытаюсь понять, как выполнить следующее, используя API критериев.

У меня есть 3 связанных объекта, например Арендатор, Здание и Владелец, если Арендатор имеет Собственность Здания, а Здание имеет Собственность Владельца. Владелец имеет свойства Имя и Фамилия.

Я хочу получить все арендаторы и полное имя владельцев

то есть SQL будет

select o.FirstName + ' ' + o.LastName as OwnerName, t.Name from Tenant t inner join Building b on t.BuildingId = b.BuildingId inner join [Owner] o on b.OwnerId = o.OwnerId

Когда я создаю запрос для клиента с помощью Criteria API, могу ли я добавить проекцию, которая даст мне объединенное имя владельца? (Я не обнаружил, как добавить SQLProjection для чего-либо, кроме корневого объекта)

Спасибо.


person Stuart L    schedule 25.11.2010    source источник


Ответы (3)


Добавьте к каждому критерию ICriteria (каждому объекту) псевдоним. Тогда в проекции можно использовать обозначения:

*alias.property*

Конкатенацию вы должны выполнить в своем объекте DTO.

person dariol    schedule 25.11.2010
comment
Спасибо, в настоящее время я делаю что-то подобное, однако я хочу узнать, можно ли сгенерировать SQL, как указано выше, с помощью Criteria API. - person Stuart L; 26.11.2010

В моем объекте View / DTO (как бы вы его ни называли) я бы добавил дополнительное свойство, подобное этому:

public MyDTO
{
    public string FirstName
    {
       get;
       private set;
    }

    public string LastName
    {
        get;
        private set;
    }

    public string Name
    {
        get
        {
            return String.Format ("{0} {1}", FirstName, LastName);
        } 
    }
}
person Frederik Gheysels    schedule 25.11.2010
comment
Я стараюсь избегать подобных «вычисляемых» свойств в своих DTO, потому что клиентский код не знает, что это свойство не может быть запрошено. Думаю, лучше использовать что-то вроде string fullName = NameFormatter.Format (firstName, lastName, NameFormat.FirstNameSpaceLastName). - person David; 26.11.2010

К сожалению, я не использую ICriteria API, поэтому не могу вам конкретно с этим помочь. Однако я уверен, что с Linq to NHibernate вы сможете сделать что-то вроде этого:

var tenantsAndOwners = session.Linq<Tenant>().Select(tenant => new { TenantName = tenant.Name, OwnerFullName = tenant.Building.Owner.FirstName + " " + tenant.Building.Owner.LastName });

Это вернет анонимный тип с двумя свойствами TenantName и OwnerFullName. Анонимный тип будет существовать только в текущей области видимости, то есть не может быть передан в качестве возвращаемого типа метода.

Боюсь, что этот код не протестирован, так как я слишком занят, сжимая свой кофе и дрожа, но я почти уверен, что что-то вроде этого сработает. И Linq to NHibernate абсолютно потрясающий.

person David    schedule 26.11.2010