2011-06-13 58 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%')