Параметризация предложения HQL IN с использованием HqlBasedQuery? - PullRequest
6 голосов
/ 05 марта 2010

Как передать список предложений in в Hh Nhibernate?

, например

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

Так вот, это не сработает, как бы мне хотелось! Я действительно застрял, делая что-то вроде этого:

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

Это просто уродливо, и я попытался сделать его не таким уродливым и коротким, как я могу. Если у кого-то есть хороший способ сделать это, пожалуйста, дайте мне знать.

Также я вижу, что Джефф задавал похожие вопросы о том, как это сделать в SQL: Параметризация предложения SQL IN Это в основном тот же вопрос, я просто хочу знать, как это сделать из HQL. Вот почему я делаю названия такими похожими.

1 Ответ

8 голосов
/ 07 марта 2010

Использование SetParameterList().

Фрагмент кода от 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();
...