0

我已经使用 EF4/存储过程/复杂类型有一段时间了,但我以前没有见过这个问题。

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

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

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

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

但是当我尝试执行查询时,我得到了这个错误:

System.InvalidOperationException:“RankedLocationSearchResult”上的“SearchRank”属性无法设置为“Int64”值。您必须将此属性设置为“Int32”类型的非空值。

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

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

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

这几乎就像 EF 认为ROW_NUMBER()返回 Int64 一样。

为什么?我们是否必须将其转换为 32 位整数或其他内容?

有人有这个问题吗?

4

3 回答 3

3

因此,在阅读ROW_NUMBER() 的 MSDN 文档后,发现此函数的返回类型是bigint

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

然后它工作。

于 2010-12-13T00:21:33.677 回答
1

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

就我而言,即使我将复杂类型更改为Int64并将 POCO 属性更改为long,它也不起作用。

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

于 2012-10-29T09:02:54.843 回答
0

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

SELECT ... 
       CAST(ROW_NUMBER() OVER (ORDER BY [Field1], [Field2]) AS INT) AS [SearchRank],
   ...
FROM   @ResultSet
于 2013-02-01T16:34:01.710 回答