2011-06-13 85 views
2

我在使用子查詢和查詢轉移時遇到問題。使用QueryOver進行子查詢

這是我

 var address = QueryOver.Of<Address>() 
      .Where(x => x.City.IsLike("%" + city + "%")).Select(x => x.Person.Id); 

     var result = Session.QueryOver<Person>() 
      .Where(x => x.Type.IsLike(type + "%")) 
      .And(x => x.Name.IsLike("%" + name + "%")) 
      .WithSubquery.WhereExists(address); 

我有一個人一張桌子和一個人有多個addreses。

所以 人 ID,名稱,類型

和地址將有 PERSONID和城市等

所以想通過名稱來搜索一個人,作爲市這是在地址表類型,以及

回答

6

嘗試這樣:

Address address = null; 
Person person = null; 
var addressSubQuery = QueryOver.Of<Address>(() => address) 
    .Where(Restrictions.EqProperty(Projections.Property(() => address.Person.Id), Projections.Property(() => person.Id))) 
    .Where(() => address.City.IsLike("%" + city + "%")); 

    var result = Session.QueryOver<Person>(() => person) 
     .Where(x => x.Type.IsLike(type + "%")) 
     .And(x => x.Name.IsLike("%" + name + "%")) 
     .WithSubquery.WhereExists(addressSubQuery); 

您需要使用QueryO Ver的別名版本。這樣,您可以引用其他查詢中的Person元素,這些查詢最終將鏈接到主查詢中。

這是一樣的做類似下面

Select * from Person 
Where 
    Type like '%foo%' 
    and Name like '%bar%' 
    and exists (select Id from Address 
       where 
         Address.PersonId = Person.Id 
         and Address.City like '%bar%')