Как установить параметры для запроса в MultiQuery?«Код именованного параметра использовался в нескольких запросах». - PullRequest
0 голосов
/ 21 октября 2011

Я пытаюсь установить параметр для запроса внутри 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 ]

2 голосов
/ 21 октября 2011

Вы должны рассмотреть, что на самом деле делает мультизапрос.

За кулисами вы получите один запрос к базе данных, который выглядит следующим образом:

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/%' ...)
2 голосов
/ 21 октября 2011

Может быть, не слишком чистый, но вы думаете использовать уникальный идентификатор для параметра?

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);
}
...