【问题标题】:EF4 SPROC Complex Type Mapping - Problem with ROW_NUMBER()EF4 SPROC 复杂类型映射 - ROW_NUMBER() 问题
【发布时间】:2010-12-13 00:16:16
【问题描述】:

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

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

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

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

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

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

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

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

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

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

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

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

有人遇到过这个问题吗?

【问题讨论】:

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


    【解决方案1】:

    所以在阅读了MSDN documentation for ROW_NUMBER() 之后,发现这个函数的返回类型是bigint

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

    然后就可以了。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-31
          • 2015-07-04
          • 2022-01-12
          • 1970-01-01
          相关资源
          最近更新 更多