Как установить параметры для запроса в MultiQuery? "Код названного параметра был использован в нескольких запросах".
Я пытаюсь установить параметр для запроса внутри MultiQuery:
var multiQuery = SessionHolder.Current.CreateMultiQuery();
foreach (string name in names)
{
var query = SessionHolder.Current
.CreateQuery("select c.Name, c.Surname " +
"from Person as p " +
"where p.Name = :name or " +
"p.Name like ':name/%'")
.SetParameter("name", name);
multiQuery = multiQuery.Add(query);
}
var multiQueryResult = multiQuery.List();
и получить это исключение:
QueryException was unhandled by user code
The named parameter code was used in more than one query. Either give unique names to your parameters, or use the multi query SetParameter() methods to set the named parameter
Как я могу использовать методы множественного запроса SetParameter() для установки именованного параметра, чтобы пример работал как задумано?
Спасибо за ответы!
2 ответа
Может быть, не слишком чистый, но вы думаете использовать уникальный идентификатор для параметра?
int i = 0;
foreach (string name in names)
{
string paramname = "name" + (++i).ToString();
var query = SessionHolder.Current
.CreateQuery("select c.Name, c.Surname " +
"from Person as p " +
"where p.Name = :" + paramname + " or " +
"p.Name like ':" + paramname + "/%'")
.SetParameter(paramname, name);
multiQuery = multiQuery.Add(query);
}
Вы должны рассмотреть, что на самом деле делает multiquery.
За кулисами вы закончите одним запросом к базе данных, который выглядит следующим образом:
select p.Name, p.Surname from Person as p where p.Name = :name or p.Name like ':name/%'
select p.Name, p.Surname from Person as p where p.Name = :name or p.Name like ':name/%'
select p.Name, p.Surname from Person as p where p.Name = :name or p.Name like ':name/%'
select p.Name, p.Surname from Person as p where p.Name = :name or p.Name like ':name/%'
select p.Name, p.Surname from Person as p where p.Name = :name or p.Name like ':name/%'
...
Возможно, вам не нужны одинаковые критерии в каждой части запроса, поскольку это не имеет особого смысла. Вы должны использовать уникальные имена, если это то, что вы хотите сделать.
Однако, глядя на ваш запрос, вы, вероятно, все равно захотите переписать его в один запрос с несколькими условиями.
Возможно, что-то с критериями больше похоже на:
p.Name in (:names) or (p.Name like ':name1/%' or p.Name like ':name2/%' ...)