2010-03-05 2 views
6

Wie übergibt man eine Liste von Dingen für die 'in' Klausel in Nhibernate HQL?Parametrisierung einer HQL IN-Klausel mit HqlBasedQuery?

z.B.

// 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); 

Jetzt wird dies nicht funktionieren, so viel wie ich es wünschte! Bin ich wirklich so etwas wie dies stecken tun:

// 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); 

Das ist nur hässlich und ich habe versucht, es so nicht hässlich und so kurz wie möglich zu machen. Wenn jemand eine gute Möglichkeit hat, dies zu tun, lass es mich wissen.

Auch ich sehe Jeff fragte ähnliche Fragen dazu, wie man dies auf SQL: Parameterize an SQL IN clause Das ist im Grunde die gleiche Frage, ich möchte nur wissen, wie es aus HQL zu tun. Deshalb mache ich die Titel so ähnlich.

+0

ICriteria ist gut dafür geeignet. siehe Restrictions.In() – dotjoe

Antwort

8

Verwenden Sie 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

Danke! Genau das habe ich gesucht. –

+0

+1 das ist der richtige Weg und es funktioniert wie erwartet. – Jaguar

+0

Sie haben einen defekten Link –