2011-12-18 20 views
1

Person類具有Identity類的關聯(一對一)FirstName和LastName是Person類的屬性Sex和BirthDate是Identity類的屬性。Alias在此示例的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

我應該如何加入身份認證?

更新時間:通過QueryOver類似於上面的查詢由LINQ的添加類似的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>(); 

我需要一個查詢。

+0

看你的查詢AliasToBeanTransformer,你根本不需要任何別名的東西... – Phill

+0

@Phill我需要別名爲'q.List ()'而不是'q.List ()' – Ehsan

+0

不,你沒有,.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>(); 

原單答:

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

// and later 

.Select(p => identityAlias.Sex) 

更新:在代碼發佈是不是需要在所有

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'類中找不到屬性'性別'的setter。這個代碼行中拋出了這個異常:'q.Select(p => identityAlias.Sex).WithAlias(()=> aliasPerson.PersonIdentity.Sex);' – Ehsan

+0

問題依然存在。 'p.Identity.Sex'和'p.Identity.BirthDate'具有相同的運行時錯誤:'無法解析屬性:...'。我希望在高Sql查詢中有類似的東西。 – Ehsan

+0

抱歉,我忘記了附加代碼中的連詞 – Firo