2010-08-24 18 views
5

que tiene este problema: cuando trato de poner en práctica la búsqueda compleja de Ayende encontrado en: http://ayende.com/Blog/archive/2006/12/07/ComplexSearchingQueryingWithNHibernate.aspx con el gráfico de objetos: Persona: M: 1 Dirección: M: 1 Calle: M: 1 Lugar: M: 1 País Aparece el siguiente error: NHibernate.QueryException: No se pueden usar las subconsultas en un criterio sin una proyección. estoy haciendo esto:consulta Complejo con 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é estoy haciendo mal? Por favor ayuda

Respuesta

9

Al igual que el mensaje de error - necesita establecer una proyección para cualquier subconsulta.

Su variable addressQuery, un DetachedCriteria, se utiliza como subconsulta, pero no tiene una proyección. La parte pertinente de la consulta, cuando se convierte a SQL, se vería así:

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

... que es SQL válida porque no hay columnas (a.k.a proyecciones) se han especificado en la cláusula select.

Use SetProjection para especificar las columnas.

+0

¿Hay alguna manera de ver el SQL generado a partir de los criterios sin ejecutar los criterios? – Luka

+0

@Luka jaja, hice la misma pregunta justo hoy :) http://stackoverflow.com/questions/3562839/nhibernate-retrieve-sql-to-be-executed-as-a-string No lo creo . – cbp

+0

lol, sé que es posible con interceptores pero no quiero ejecutar los criterios. – Luka

Cuestiones relacionadas