Использование SQLProjection для связанной сущности с NHibernate - PullRequest
1 голос
/ 25 ноября 2010

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

У меня есть 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 для чего-либо, кроме корневого объекта)

Спасибо.

Ответы [ 3 ]

1 голос
/ 25 ноября 2010

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

*alias.property*

Конкатенация, которую вы должны выполнить внутри вашего объекта DTO.

0 голосов
/ 26 ноября 2010

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

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

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

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

0 голосов
/ 25 ноября 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);
        } 
    }
}
...