Ehsan
Ehsan

Reputation: 3491

How AliasJoin in QueryOver for this sample

The Person class has a association by Identity class (one-to-one) FirstName and LastName are a property of Person class also Sex and BirthDate are a property of Identity class.

I have a sql query as the following examples:

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%'

I convert it into 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>();

But join in this query is not correct. It throw a exceotion by this message : could not resolve property: Identity.Sex of: Domain.Entities.Person

How I should join Identity by Person?

Updated : Add the similar linq query

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

I need to a query by QueryOver similar to above query by Linq.

Upvotes: 1

Views: 729

Answers (1)

Firo
Firo

Reputation: 30813

Update2: not pretty but here goes

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

Update: from your comments i would say, this is what you need.

code to fill a 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 Answer:

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

// and later

.Select(p => identityAlias.Sex)

Update: in the code posted the AliasToBeanTransformer is not needed at all

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

Upvotes: 2

Related Questions