【问题标题】:How to set parameters on a Query in MultiQuery ? "The named parameter code was used in more than one query."如何在 MultiQuery 中的查询上设置参数? “命名参数代码用于多个查询。”
【发布时间】:2011-10-21 11:51:48
【问题描述】:

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

感谢回复!

【问题讨论】:

    标签: c# nhibernate parameters multi-query


    【解决方案1】:

    也许不是太干净,但你有没有想过为参数使用唯一的 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);
    }
    

    【讨论】:

    • 这是我的想法,但我很好奇解决错误的其他推荐解决方案:“或使用多查询 SetParameter() 方法设置命名参数”。
    【解决方案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/%' ...)
    

    【讨论】:

    • 是的,查询部分是多余的,但它们给了我根据需要分组的结果。最后,我不得不改用单个查询并从结果中获取分组结果。
    猜你喜欢
    • 2017-07-26
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2022-08-12
    • 1970-01-01
    相关资源
    最近更新 更多