NHibernate-从映射存储过程返回输出参数

NHibernate-从映射存储过程返回输出参数,nhibernate,stored-procedures,nhibernate-mapping,Nhibernate,Stored Procedures,Nhibernate Mapping,我有一个通过NHibernate映射的存储过程。存储过程同时返回一个结果集和一个输出参数,基本上是结果集本身后面的总记录数。大概是这样的: CREATE PROCEDURE [dbo].[mySproc] ( @StartRecord INT = 1, @EndRecord INT = 10, @TotalRecords INT OUTPUT ) AS BEGIN SET NOCOUNT ON

我有一个通过NHibernate映射的存储过程。存储过程同时返回一个结果集和一个输出参数,基本上是结果集本身后面的总记录数。大概是这样的:

CREATE PROCEDURE [dbo].[mySproc]
(
    @StartRecord            INT = 1,
    @EndRecord              INT = 10,
    @TotalRecords       INT OUTPUT
)
AS
BEGIN
    SET NOCOUNT ON

    // Do a count
    SELECT @TotalRecords = COUNT(DISTINCT x.Id)
    FROM Blah ...snip

    // Perform a query with paging
    SELECT
        x.Id,
        x.Column1
    FROM ...some really complex query that uses paging
END
我通过存储过程实现分页,因此需要获取记录的总数。查询非常复杂,跨多个表进行连接,可能速度非常慢,因此需要通过直接编写T-SQL进行谨慎、微调和优化

我的问题是无法在存储过程(@TotalRecords)中获取输出参数。我已将此存储过程映射为:

<class name="MyLibrary.SomeClass, MyLibrary">

    <id name="Id" type="Int32" />
    <property name="Column1" type="String" length="50" not-null="false" />

</class>

<sql-query name="mySproc">
    <return class="MyLibrary.SomeClass, MyLibrary">
        <return-property name="Id" column="Id"/>
        <return-property name="Column1" column="Column1"/>
    </return>

    EXEC mySproc
        @StartRecord = :startRecord,
        @EndRecord = :endRecord,
        @TotalRecords = 0

</sql-query>

执行mySproc
@StartRecord=:StartRecord,
@EndRecord=:EndRecord,
@TotalRecords=0
我可以得到这样的结果集:

IList<SomeClass> records = Session.GetNamedQuery("mySproc")
    .SetParameter("startRecord", 1, NHibernateUtil.Int32)
    .SetParameter("endRecord", 20, NHibernateUtil.Int32)
    .List<SomeClass>();
IList records=Session.GetNamedQuery(“mySproc”)
.SetParameter(“startRecord”,1,NHibernateUtil.Int32)
.SetParameter(“endRecord”,20,NHibernateUtil.Int32)
.List();

但是如何获取@TotalRecords输出参数?

似乎无法直接完成:


天哪,这太糟糕了!我想我可以将其拆分为两个存储过程,或者只在LINQ/HQL代码中进行计数。尽管在一个存储过程中将计数和查询保持在一起的好处是,如果WHERE子句更改,您知道要同时更改计数和查询的计数和查询。@matheiu其中一个链接已断开。您可能希望编辑您的答案以包含一些重要信息,否则可能会有人这样做