Комплексные запросы с помощью NHibernate - PullRequest
5 голосов
/ 24 августа 2010

У меня есть такая проблема: Когда я пытаюсь реализовать сложный поиск Айенде, найденный по адресу: http://ayende.com/Blog/archive/2006/12/07/ComplexSearchingQueryingWithNHibernate.aspx с графом объектов: Персона: М: 1 Адрес: М: 1 Улица: М: 1 Место: М: 1Страна Я получаю следующую ошибку: NHibernate.QueryException: Невозможно использовать подзапросы по критериям без проекции.Я делаю это:

public List<Person> Find() 
{ 
    DetachedCriteria query = DetachedCriteria.For<Person>(); 
    AddAddressQuery(query); 
    return personRepository.Find(query);
} 

private void AddAddressQuery(DetachedCriteria query) 
{ 
     DetachedCriteria addressQuery = null; 
     if (!String.IsNullOrEmpty(SearchParams.HouseNumer)) 
     { 
         addresaQuery = DetachedCriteria.For<Address>(); 
         addresaQuery.Add(Restrictions.Eq("HouseNumer", 
SearchParams.HouseNumer)); 
     } 
     this.AddStreetQuery(ref addressQuery); 
     if (addressQuery != null) 
     { 
         query.CreateCriteria("Address1", 
"address1").Add(Subqueries.Exists(addressQuery)); 
     } 
} 

private void AddStreetQuery(ref DetachedCriteria query) 
{ 
    DetachedCriteria streetQuery = null; 
    if (this.SearchParams.StreetId.HasValue) 
    { 
        streetQuery = DetachedCriteria.For<Street>(); 
        streetQuery .Add( Restrictions.Eq("Id", 
this.SearchParams.StreetId.Value)); 
    } 
    if (streetQuery != null) 
    { 
        query = query ?? Query.CreateCriteria("Address1"); 
        query.CreateCriteria("Street", 
"street").Add(Subqueries.Exists(streetQuery )); 
    } 
} 

Что я делаю не так?Пожалуйста, помогите

1 Ответ

9 голосов
/ 25 августа 2010

Так же, как сообщение об ошибке - вам нужно установить проекцию для любых подзапросов.

Ваша переменная addressQuery, DetachedCriteria, используется в качестве подзапроса, но у нее нет проекции. Соответствующая часть запроса при преобразовании в SQL будет выглядеть следующим образом:

... EXISTS(SELECT FROM Address WHERE HouseNumber = @HouseNumber)

... что является недопустимым SQL, поскольку в предложении select не указаны столбцы (проекции a.k.a).

Используйте SetProjection для указания столбцов.

...