Подзапросы с QueryOver - PullRequest
2 голосов
/ 13 июня 2011

У меня проблема с использованием подзапроса с 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);

У меня есть таблица для Person, и у человека есть несколько адресов.

Таким образом, идентификатор человека, имя, тип

и адрес будут иметь идентификатор человека и город и т. Д.

Поэтому вы хотите найти человека по имени и типу, а также по городу, который находится в таблице адресов

1 Ответ

6 голосов
/ 17 июня 2011

Попробуйте что-то вроде этого:

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

Вам необходимо использовать псевдонимы QueryOver. Таким образом, вы можете ссылаться на элемент 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%' )
...