0

我正在尝试为 MultiQuery 中的 Query 设置参数:

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() 方法设置命名参数,以便示例按预期工作?

感谢您的回复!

4

2 回答 2

2

也许不是太干净,但你有没有想过为参数使用唯一的 id?

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);
}
于 2011-10-21T12:31:48.390 回答
2

您需要考虑多查询实际在做什么。

在幕后,您最终会得到一个对数据库的查询,如下所示:

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/%' ...)
于 2011-10-21T13:09:59.897 回答