nhibernate sql查询结果不同于直接查询结果

nhibernate sql查询结果不同于直接查询结果,nhibernate,stored-procedures,sql,Nhibernate,Stored Procedures,Sql,更新:我已经回答了下面的问题,请看一眼,如果您有更好的方法,请告诉我 执行摘要: 当从SQLServerManagementStudio调用我的sqlserver函数时,我得到一个结果为{1,2,3}的列表。 当使用NHibernate从代码中调用该方法时,我得到以下列表{1,1,1}。('1'是整个结果行,而不是标量'1') 我也尝试过使用不同的数据集,得到了相同的行为。 说来话长: 我在SQLServer中有一个sql函数,名为GetHistory(itemId)。它返回一个包含结果的表

更新:我已经回答了下面的问题,请看一眼,如果您有更好的方法,请告诉我


执行摘要:
当从SQLServerManagementStudio调用我的sqlserver函数时,我得到一个结果为{1,2,3}的列表。 当使用NHibernate从代码中调用该方法时,我得到以下列表{1,1,1}。('1'是整个结果行,而不是标量'1') 我也尝试过使用不同的数据集,得到了相同的行为。

说来话长:
我在SQLServer中有一个sql函数,名为GetHistory(itemId)。它返回一个包含结果的表。 当我从SQLManagementStudio查询时,我会得到一个结果列表。我通过如下方式调用函数进行查询:

从GetHistory(10001)中选择*

在我给定的数据库中,这将导致3行。每行都有时间、类型和说明。
在NHibernate中,我特别为此创建了一个新实体,因为没有这样的有机表/实体。 所以我有一个映射:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
 namespace="myNamespace" assembly="myAssembly">
 <class name="HistoryEvent">
 <id name="id" type="long" access="field">
  <column name="Id"/>
  <generator class="native"/>
 </id>
 <property name="type" column="Type" type="short" access="field"/>
 <property name="time" column="Time" type="datetime" access="field"/>
 <property name="description" column="Description" type="string" access="field"/>
</class>

<sql-query name='GetHistory'>
    <return class='HistoryEvent, myAssembly' alias='historyEvent'/>
 <![CDATA[SELECT * FROM GetHistory(:id)]]>
</sql-query>
</hibernate-mapping>
最后,我从代码中调用此函数,如下所示:

IList result = s.GetNamedQuery("GetHistory").SetInt64("id", id).List();
使用调试器检查此列表时,我得到3个实体,它们是同一行的3倍。 我还尝试直接从NHibernate使用查询(使用sql查询),而不是通过DB函数,但得到了相同的结果。
我的直觉是我的映射有问题,或者NHibernate有问题:)

救命

好的,在我发布问题后不久,我就明白了。
我想写这样的东西对我真的很有帮助。这就是问题所在:
我使用的Id列不是唯一的。它是一个ID,只是不是查询的正确ID。为什么呢?因为我的查询返回来自三个不同表的三个查询的并集,并且返回的ID实际上是ItemId(与传递给函数的ID相同!)

因此,现在我必须有一个唯一的ID。我曾短暂地尝试使用NHibernate的复合ID标记而不是ID-但面对困难,我决定不在自动操作上浪费更多时间,并从查询中返回ID。

发现我无法将SELECT IDENTITY()用于。。。在带有表变量的函数中,我考虑了RAND一秒钟,最终使用ROW_NUMBER()OVER(按blah排序)生成了我的假ID。 目前,这项工作相当顺利,尽管这项代码不会赢得选美比赛。

PS:得到了关于生成ID的更好方法的建议吗?或者你曾经得到过为你工作的复合ID吗?让我知道…

生成ID的更好方法是SQL server中的NEWID()函数。它会生成一个可用于此场景的新GUID。
IList result = s.GetNamedQuery("GetHistory").SetInt64("id", id).List();