2010-08-24 12 views
5

J'ai ce problème: Lorsque je tente de mettre en œuvre une recherche complexe Ayende à l'adresse: http://ayende.com/Blog/archive/2006/12/07/ComplexSearchingQueryingWithNHibernate.aspx avec le graphe d'objet: Personne: M: 1 Adresse: M: 1 Rue: M: 1 Place: M: 1 Pays Je reçois l'erreur suivante: NHibernate.QueryException: Impossible d'utiliser sous-requêtes sur un critère sans projection. Je fais ceci:interrogation complexe avec NHibernate

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

Qu'est-ce que je fais mal? S'il vous plaît aider

Répondre

9

Tout comme le message d'erreur - vous devez définir une projection pour toutes les sous-requêtes.

Votre variable addressQuery, un DetachedCriteria, est utilisée comme sous-requête, mais elle n'a pas de projection. La partie pertinente de la requête, une fois converti en SQL, ressemblerait à ceci:

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

... qui est SQL invalide car aucune colonne (a.k.a projections) ont été spécifiées dans la clause select.

Utilisez SetProjection pour spécifier les colonnes.

+0

Existe-t-il un moyen de voir le SQL généré à partir des critères sans exécuter les critères? – Luka

+0

@Luka haha, j'ai posé la même question un peu plus tôt aujourd'hui :) http://stackoverflow.com/questions/3562839/nhibernate-retrieve-sql-to-be-executed-as-a-string Je ne pense pas . – cbp

+0

lol, je sais que c'est possible avec des intercepteurs mais je ne veux pas exécuter les critères. – Luka