0

私はEF4/Stored Procedures/Complex Typesをしばらくは使用していましたが、この問題は以前は見たことがありません。EF4 SPROC複合型マッピング - ROW_NUMBER()の問題

私は複雑な型のコレクションにマップされた一連のフィールドを返すストアドプロシージャを持っています。私はこの余分なフィールドを導入するまで、すべてうまくいきました。

それは(順位結果に使用される)T-SQLからROW_NUMBERを使用しています:私の複合型で

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

を、私は非null許容のInt32としてこのセットを持っている、と私はまた、POCOのを使用しています、私はこれを普通のintとしてPOCOに持っています。

しかし、私は試してみて、クエリを実行すると、私はこのエラーを取得:

System.InvalidOperationException: The 'SearchRank' property on 'RankedLocationSearchResult' could not be set to a 'Int64' value. You must set this property to a non-null value of type 'Int32'.

私はそれを得ることはありません。どこにも私はこのプロパティ/フィールドがInt64だと言っています。そして、私のプロパティーで、タイプ 'Int32'以外の値ではありません。

今、私は問題がROW_NUMBER()であると確信しています。

T-SQLをちょうど1 AS [SearchRank](ハードコード、テスト用)に変更すると、正常に動作するためです。

EFは、Int64を返すとしてROW_NUMBER()とほぼ同じです。

なぜですか?これを32ビットの整数などにキャストする必要がありますか?

誰でもこの問題がありましたか?

答えて

3

MSDN documentation for ROW_NUMBER()を読んだ後、この関数の戻り値の型はbigintです。

だから私は、長いInt64型、そして私のPOCOプロパティに複合型を変更しなければなりませんでした。

これが機能します。

1

私は一意のID生成のためにROW_NUMBER()の使用法を使用していました。

私の場合、複素数型をInt64に変更し、POCOプロパティをlongに変更しても、動作しませんでした。

私はビューからROW_NUMBER()の使用法を削除する必要がありました。私は最終的に私のビューで使用されるテーブルをマージし、単一のテーブルを作成しました。それはそのように働いた。

0

私は次のようにクエリ自体にINTするROW_NUMBER()の戻り値をキャスト:

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