EF4 SPROC复杂类型映射 - ROW_NUMBER()问题

时间:2010-12-13 00:16:16

标签: tsql stored-procedures entity-framework-4 row-number complextype

我一直在使用EF4 /存储过程/复杂类型一段时间,但我之前没有看过这个问题。

我有一个存储过程,它返回一堆字段,映射到复杂类型的集合。在我引入这个额外的领域之前,一切正常。

它使用来自T-SQL的ROW_NUMBER(用于排名结果):

SELECT ... 
       ROW_NUMBER() OVER (ORDER BY [Field1], [Field2]) AS [SearchRank],
       ...
FROM   @ResultSet

在我的复杂类型中,我将此设置为不可空的Int32 ,并且我也使用POCO,因此我将其作为POCO上的常规int

但是当我尝试执行查询时,我收到此错误:

  

System.InvalidOperationException:The   'SearchRank'属性   'RankedLocationSearchResult'不能   设置为'Int64'值。你必须   将此属性设置为非null值   类型'Int32'。

我只是不明白。我没有说过这个属性/字段是Int64。我的属性类型为'Int32'的非空值。

现在,我确定问题出在ROW_NUMBER()上。

因为如果我将T-SQL更改为1 AS [SearchRank](硬编码,用于测试),它可以正常工作。

这几乎就像EF看到ROW_NUMBER()返回Int64。

为什么呢?我们是否必须将其转换为32位整数?

有人有这个问题吗?

3 个答案:

答案 0 :(得分:3)

因此,在阅读MSDN documentation for ROW_NUMBER()之后,该函数的返回类型为 bigint

所以我必须将复杂类型更改为 Int64 ,并将我的POCO属性更改为 long

然后它有效。

答案 1 :(得分:1)

我正在使用ROW_NUMBER()用法的视图来生成唯一ID。

在我的情况下,即使我将复杂类型更改为Int64而将POCO属性更改为long,它也无效。

我必须从我的视图中删除ROW_NUMBER()用法。我最终合并了我视图中使用的表并创建了一个表。它就是这样的。

答案 2 :(得分:0)

我在查询本身中将ROW_NUMBER()返回值转换为INT,如下所示:

SELECT ... 
       CAST(ROW_NUMBER() OVER (ORDER BY [Field1], [Field2]) AS INT) AS [SearchRank],
   ...
FROM   @ResultSet