如何在“多查询”中设置查询参数?在多个查询中使用了命名参数代码

本文关键字:查询 参数 代码 设置 多查询 | 更新日期: 2023-09-27 18:11:50

我试图在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()方法来设置命名参数,使示例按预期工作?

谢谢你的回复!

如何在“多查询”中设置查询参数?在多个查询中使用了命名参数代码

也许不是太干净,但你认为使用唯一的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);
}

您需要考虑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/%' ...)