2010-03-08 6 views
11

En essayant de renvoyer une liste SimpleQuery qui interroge une seule table et utilise IN. Je peux obtenir ce travail en utilisantNhibernate HQL where requête IN

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

Cependant cela est vraiment vraiment vraiment lent. Donc, je voudrais faire quelque chose comme ça

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

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

Cependant je ne peux pas faire fonctionner SimpleQuery. Je ne peux pas trouver de documentation couvrant cela et j'espérais que quelqu'un là-bas serait en mesure d'aider.

Merci

Répondre

23

Jetez un oeil à la documentation NHibernate HQL here.

Je devine à partir de votre code, que vous êtes après une requête HQL pour retourner tous les travaux où le job.ServiceID dans une liste d'ID.

Peut-être que quelque chose le long des lignes,

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

BTW, avez-vous entendu parler du projet NHibernate Lambda Extensions? Vous trouverez ci-dessous un exemple de requête IN effectuée à l'aide de la bibliothèque mentionnée. Peut-être quelque chose d'intéressant à regarder comme une alternative à l'utilisation de HQL.

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

Merci pour la réponse. Je modifié ma requête en fonction de votre réponse SimpleQuery requête = new SimpleQuery ( @ "de Job que j où j.SecondName = (: nom) et dans ServiceId (: serviceIds)"); query.SetParameter ("serviceIds", ids); query.SetParameter ("nom", nom); return new Liste (query.Execute()); Le seul problème est maintenant le tableau int d'ids que je passe. Le champ dans la base de données est de type int, si j'utilise IN sur l'un des champs de chaîne il fonctionne bien et si je passe une valeur int simple ça marche . Comment puis-je passer un tableau? Merci – Gilbert

+2

Opps, mauvais appel de méthode Essayez d'utiliser q.SetParameterList à la place – Noel

+0

Aussi cela peut vous être utile aussi http://www.nhforge.org/doc/nh/en/index.html#manipulatingdata-queryinterface – Noel