当参数之一是列表时,如何将参数传递给 NHibernate 中的存储过程?

Posted

技术标签:

【中文标题】当参数之一是列表时,如何将参数传递给 NHibernate 中的存储过程?【英文标题】:How do I pass parameters to a stored procedure in NHibernate when one of the parameters is a list? 【发布时间】:2011-10-22 12:34:02 【问题描述】:

我在 NHibernate 中有一个按如下方式映射的存储过程:

 <sql-query name="HistoricSearch">
     <return class="ResultItem">
     </return>
     exec dbo.SelectHistoricResultItem :StartDate, :EndDate, :ListA, :ListB, :ListC
 </sql-query>

如果每个搜索选项列表都包含一个参数,则以下代码可以正常工作:

 IQuery query = session.GetNamedQuery("HistoricSearch");
            query.SetDateTime("StartDate", fromDate);
            query.SetDateTime("EndDate", toDate);
            query.SetParameterList("ListA", searchOptionA);
            query.SetParameterList("ListB", searchOptionB);
            query.SetParameterList("ListC", searchOptionC);
            List<ResultItem> resultItems = (List<ResultItem>)query.List<ResultItem>();
            return resultItems;

但如果一个列表包含多个值,我会收到以下错误:

 Procedure or function SelectHistoricResultItem has too many arguments specified

根据SetParameterList()方法的描述,它应该“绑定多个值到一个命名的查询参数”。我认为问题出在映射文件中:

 exec dbo.SelectHistoricResultItem :StartDate, :EndDate, :ListA, :ListB, :ListC

但我不知道如何构造它以允许多个参数。谁能告诉我这是怎么做到的?

谢谢

【问题讨论】:

【参考方案1】:

好的,经过一些实验,我发现这个方法对我有用。

            query.SetParameter("ListA", string.Join(", ", searchOptionA));
            query.SetParameter("ListB", string.Join(", ", searchOptionB));
            query.SetParameter("ListC", string.Join(", ", searchOptionC));

【讨论】:

以上是关于当参数之一是列表时,如何将参数传递给 NHibernate 中的存储过程?的主要内容,如果未能解决你的问题,请参考以下文章

如何将值参数传递给 Bootstrap 中的 modal.show() 函数

当我们将数组作为参数传递给其他函数时,数组的值如何变化? [复制]

尝试将参数传递给点击手势的方法

Delphi:如何将列表作为参数传递给SQL查询?

如何将向量作为参数传递给另一个向量?

SelectedIndexChanged 未将参数传递给 Web 部件连接