我一直在使用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位整数?
有人有这个问题吗?
答案 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