2010-03-08 19 views
11

Im tratando de devolver una lista SimpleQuery que consulta una sola tabla y utiliza IN. puedo conseguir que esto funcione utilizandoNhibernate HQL donde consulta IN

return new List<Jobs>(
    ActiveRecordMediator<Jobs>.FindAll(Expression.In("ServiceId", ids)) 
); 

Sin embargo, esto es muy muy muy lento. Entonces, me gustaría hacer algo como esto

SimpleQuery<Job> query = 
    new SimpleQuery<Job>(@"from Job as j where ? in (j.ServiceId)", ids); 

return new List<Job>(query.Execute()); 

Sin embargo, no puedo hacer que SimpleQuery funcione. No puedo encontrar ninguna documentación que lo cubra y esperaba que alguien fuera pudiera ayudar.

Gracias

Respuesta

23

Eche un vistazo a la documentación NHibernate HQL here.

Supongo que, a partir de su código, busca una consulta HQL para devolver todos los trabajos donde está el job.ServiceID en una lista de identificadores.

Tal vez algo en la línea,

IQuery q = s.CreateQuery("from Job as j where j.ServiceId in (:serviceIds)"); 
q.SetParameterList("serviceIds", ids); 

Por cierto, ¿has oído hablar del proyecto NHibernate Lambda Extensions? A continuación se muestra un ejemplo de la consulta IN realizada utilizando la biblioteca mencionada. Puede ser algo interesante a considerar como una alternativa al uso de HQL.

DetachedCriteria after = 
    DetachedCriteria.For<Person>() 
     .Add(SqlExpression.In<Person>(p => p.Name, 
      new string[] { "name1", "name2", "name3" })); 
+0

Gracias por la respuesta. edité mi consulta basada en su respuesta SimpleQuery consulta = nueva SimpleQuery ( @ "de Job como j, donde j.SecondName = (: nombre) y en ServiceId (: serviceIds)"); query.SetParameter ("serviceIds", ids); query.SetParameter ("nombre", nombre); return new List (query.Execute()); El único problema ahora es la matriz int de ids que estoy ingresando. El campo en la base de datos es de tipo int, si uso IN en cualquiera de los campos de cadena funciona bien y si paso un único valor int funciona . ¿Cómo puedo pasar una matriz? Gracias – Gilbert

+2

Opps, llame al método incorrecto Pruebe usar q.SetParameterList en su lugar – Noel

+0

También esto podría ser útil para usted también http://www.nhforge.org/doc/nh/en/index.html#manipulatingdata-queryinterface – Noel

Cuestiones relacionadas