2011-12-18 4 views
1

Класс Person имеет ассоциацию по классу Identity (один к одному) FirstName и LastName являются свойством класса Person, а Sex и BirthDate являются свойством класса Identity.Как AliasJoin в QueryOver для этого образца

У меня есть SQL запрос в качестве следующих примеров:

select FirstName,LastName,Identity.Sex,Identity.BirthDate from Person_Person as Person 
inner join Person_Identity as Identity on Person.Id = Identity.Person_id_fk 
WHERE FirstName like '%jack%' and LastName like '%smit%' 

Я преобразовать его в QueyOver.

var q = SessionInstance.QueryOver<Person>(); 

if (!String.IsNullOrEmpty(searchPersonDto.FirstName)) //necessary 
    q = q.Where(p => p.FirstName.IsLike(searchPersonDto.FirstName, MatchMode.Anywhere)); 

if (!String.IsNullOrEmpty(searchPersonDto.LastName)) //necessary 
    q = q.Where(p => p.LastName.IsLike(searchPersonDto.LastName, MatchMode.Anywhere)); 

Person aliasPerson = null; 
q = q.SelectList(list => list 
    .Select(p => p.Id).WithAlias(() => aliasPerson.Id) 
    .Select(p => p.FirstName).WithAlias(() => aliasPerson.FirstName) 
    .Select(p => p.LastName).WithAlias(() => aliasPerson.LastName) 
    .Select(p => p.Identity.Sex).WithAlias(() => aliasPerson.Identity.Sex) 
    .Select(p => p.Identity.BirthDate).WithAlias(() => aliasPerson.Identity.BirthDate)) 
    .TransformUsing(Transformers.AliasToBean<Person>()); 

q.List<Person>(); 

Но присоединяйтесь к этому запросу не правильно. Он делает исключение этим сообщением: could not resolve property: Identity.Sex of: Domain.Entities.Person

Как я должен присоединиться к личности от лица?

Обновлено: Добавить аналогичный Linq запрос

var q = SessionInstance.Query<Person>() 
     .Where(p => p.FirstName == searchPersonDto.FirstName) 
     .Select(p => new Person(p.Id) 
     {    
      FirstName = p.FirstName, 
      LastName = p.LastName, 
      Identity = new Identity() 
      { 
       Sex = p.PersonIdentity.Sex, 
       BirthDate = p.Identity.BirthDate 
      } 
     }).ToList<Person>(); 

Мне нужно запрос на QueryOver похож на вышеупомянутый вопрос по Linq.

+0

Глядя на ваш запрос, вам вообще не нужен какой-либо псевдоним ... – Phill

+0

@ Мне нужно написать псевдоним для 'q.List () 'вместо' q.List () ' – Ehsan

+0

no you do not. .List() уже возвращает вам тип IList Phill

ответ

2

Update2: не очень, но здесь идет

var results = q 
    .JoinAlias(p => p.Identity,() => identityAlias) 
    .SelectList(list => list 
     .Select(p => p.Id) 
     .Select(p => p.FirstName) 
     .Select(p => p.LastName) 
     .Select(p => identityAlias.Sex) 
     .Select(p => identityAlias.BirthDate) 
    .List<object[]>() 
    .Select(values => new Person((int)values[0]) 
    {    
     FirstName = (string)values[1], 
     LastName = (string)values[2], 
     Identity = new Identity() 
     { 
      Sex = (string)values[3], 
      BirthDate = (DateTime)values[4], 
     } 
    }) 
    .ToList<Person>(); 

Обновление: от ваших комментариев я бы сказал, это то, что вам нужно.

код для заполнения PersonDto

PersonDTO aliasDTO = null; 
q = q 
    .JoinAlias(p => p.Identity,() => identityAlias) 
    .SelectList(list => list 
     .Select(p => p.Id).WithAlias(() => aliasDTO.Id) 
     .Select(p => p.FirstName).WithAlias(() => aliasDTO.FirstName) 
     .Select(p => p.LastName).WithAlias(() => aliasDTO.LastName) 
     .Select(p => identityAlias.Sex).WithAlias(() => aliasDTO.Sex) 
     .Select(p => identityAlias.BirthDate).WithAlias(() => aliasDTO.BirthDate)) 
    .TransformUsing(Transformers.AliasToBean<PersonDTO>()) 
    .List<PersonDTO>(); 

Orginal Ответ:

q.JoinAlias(p => p.Identity,() => identityAlias) 

// and later 

.Select(p => identityAlias.Sex) 

Update: в коде отправил AliasToBeanTransformer не нужен вообще

var q = SessionInstance.QueryOver<Person>(); 

if (!String.IsNullOrEmpty(searchPersonDto.FirstName)) //necessary 
    q = q.Where(p => p.FirstName.IsLike(searchPersonDto.FirstName, MatchMode.Anywhere)); 

if (!String.IsNullOrEmpty(searchPersonDto.LastName)) //necessary 
    q = q.Where(p => p.LastName.IsLike(searchPersonDto.LastName, MatchMode.Anywhere)); 

var results = q.Fetch(p => p.Identity).Eager 
    .List<Person>(); 
+0

Я добавил ваш код. У вашего изменения есть исключение по этому сообщению: 'Не удалось найти сеттер для свойства« Секс »в классе« Domain.Entities.Person'. Это исключение выбрано в этой строке кода: 'q.Select (p => identityAlias.Sex) .WithAlias ​​(() => aliasPerson.PersonIdentity.Sex);' – Ehsan

+0

Проблема все еще существует. 'p.Identity.Sex' и' p.Identity.BirthDate' имеют такую ​​же ошибку времени выполнения: 'не удалось разрешить свойство: ...'. Я хочу точно что-то подобное в высоком запросе Sql. – Ehsan

+0

жаль, что я забыл joinalias в добавленном коде – Firo