2010-03-05 5 views
6

Comment passez-vous une liste de choses pour la clause 'in' dans Nhibernate HQL?Paramétrage d'une clause HQL IN à l'aide de HqlBasedQuery?

par exemple.

// data input from the user interface, not known at compile time 
object[] productIds = {1, 17, 36, ... }; 
string hqlQuery = @" 
       from Product as prod 
       where prod.Id in (?)"; 
HqlBasedQuery query = new HqlBasedQuery(typeof(Product), hqlQuery, productIds) 
ActiveRecordMediator.ExecuteQuery(query); 

Maintenant, cela ne va pas fonctionner, autant que je le souhaite! Suis-je vraiment coincé en train de faire quelque chose comme ceci:

// data input from the user interface, not known at compile time 
object[] productIds = {1, 17, 36, ... }; 
string hqlQuery = @" 
       from Product as prod 
       where prod.Id in ({0})"; 

// build string array of the right number of '?' characters 
string[] paramStringArray = new String('?', productIds.Length).ToCharArray().Select(item => item.ToString()).ToArray(); 
// join to make '?, ?, ?, ?, ?' 
string parameterString = string.Join(", ", paramStringArray); 
hqlQuery = string.Format(hqlQuery , parameterString); 

HqlBasedQuery query = new HqlBasedQuery(typeof(Product), hqlQuery, productIds) 
ActiveRecordMediator.ExecuteQuery(query); 

C'est juste laid et j'ai essayé de le rendre aussi laid et pas court que je peux. Si quelqu'un a un bon moyen d'accomplir cela, faites le moi savoir.

Aussi, je vois Jeff a posé des questions similaires sur la façon de faire cela sur SQL: Parameterize an SQL IN clause C'est fondamentalement la même question que je veux juste savoir comment le faire à partir de HQL. C'est pourquoi je rends les titres si similaires.

+0

ICriteria est bien adapté pour cela. voir Restrictions.In() – dotjoe

Répondre

8

Utilisez SetParameterList().

Code snippet from billsternberger.net:

ArrayList stateslist = new ArrayList(); 
stateslist.Add("TX"); 
stateslist.Add("VA"); 

string hql = String.Format("FROM Contact c where State in (:states)"); 
SimpleQuery<Contact> q = new SimpleQuery<Contact>(hql); 
q.SetParameterList("states", stateslist); 

Contact[] result = q.Execute(); 
+0

Merci! C'est exactement ce que je cherchais. –

+0

+1 c'est la bonne façon et cela fonctionne comme prévu. – Jaguar

+0

Vous avez un lien cassé –