2010-08-24 21 views
5

Ich habe dieses Problem: Wenn ich versuche Ayende komplexe Suche zu finden umzusetzen: http://ayende.com/Blog/archive/2006/12/07/ComplexSearchingQueryingWithNHibernate.aspx mit dem Objektgraph: Person: M: 1 Adresse: M: 1 Straße: M: 1 Ort: M: 1 Land Ich bekomme den folgenden Fehler: NHibernate.QueryException: Kann Unterabfragen auf ein Kriterium ohne eine Projektion nicht verwenden. Ich tue dies:Komplexe Abfragen mit 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)); 
    } 
} 

Was mache ich falsch? Bitte helfen Sie

Antwort

9

Genau wie die Fehlermeldung - Sie müssen eine Projektion für alle Unterabfragen festlegen.

Ihre Variable addressQuery, eine DetachedCriteria, wird als Unterabfrage verwendet, hat jedoch keine Projektion. Der relevante Teil der Abfrage, wenn in SQL konvertiert, würde wie folgt aussehen:

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

..., die ungültige SQL ist, da keine Spalten (a.k.a Projektionen) haben in der select-Klausel angegeben wurden.

Verwenden Sie SetProjection, um die Spalten anzugeben.

+0

Gibt es eine Möglichkeit, die generierte SQL aus den Kriterien zu sehen, ohne die Kriterien auszuführen? – Luka

+0

@Luka haha, ich fragte die gleiche Frage gerade früher heute :) http://stackoverflow.com/questions/3562839/nhibernate-retrieve-sql-to-be-executed-as-a-string Ich glaube nicht . – cbp

+0

lol, ich weiß, dass es mit Interzeptoren möglich ist, aber ich möchte die Kriterien nicht ausführen. – Luka

Verwandte Themen