Как AliasJoin в QueryOver для этого образца - PullRequest
1 голос
/ 18 декабря 2011

Класс Person имеет связь по классу Identity (один-к-одному) FirstName и LastName являются свойством класса Person, а Sex и BirthDate являются свойством класса Identity.

У меня есть 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 .

1 Ответ

2 голосов
/ 19 декабря 2011

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>();

Оригинальный ответ:

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

// and later

.Select(p => identityAlias.Sex)

Обновление: в опубликованном коде 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>();
...