0

Ich habe mit EF4/Stored Procedures/Complex Typen seit einer Weile gearbeitet, aber ich habe dieses Problem nicht zuvor gesehen.EF4 SPROC Complex Type Mapping - Problem mit ROW_NUMBER()

Ich habe eine gespeicherte proc, die eine Reihe von Feldern zurückgibt, eine Sammlung von komplexen Typen zugeordnet. War alles in Ordnung, bis ich dieses zusätzliche Feld eingeführt habe.

Es ROW_NUMBER von T-SQL verwendet (in Ranking Ergebnisse verwendet):

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

In meinem komplexen Typ, ich habe diesen Satz als Nicht-Nullable-Int32, und ich bin auch POCO mit , so habe ich das als eine regelmäßige int auf dem POCO.

Aber wenn ich die Abfrage versuchen und auszuführen, erhalte ich diese Fehlermeldung:

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'.

ich es einfach nicht bekommen. Nirgendwo habe ich gesagt, dass diese Eigenschaft/dieses Feld Int64 ist. Und meine Eigenschaft ist ein Nicht-Null-Wert vom Typ 'Int32'.

Nun, bin ich sicher, das Problem ist mit ROW_NUMBER().

Weil, wenn ich das T-SQL zu nur 1 AS [SearchRank] (fester Code, zum Testen) ändere, funktioniert es gut.

Es ist fast so wie EF sieht ROW_NUMBER() als Rückkehr Int64.

Warum? Müssen wir das als eine 32-Bit-Ganzzahl oder etwas?

Wer hatte dieses Problem?

Antwort

3

Nach dem Lesen der MSDN documentation for ROW_NUMBER(), stellt sich heraus, der Rückgabetyp für diese Funktion ist bigint. So

ich hatte den Komplex Typ Int64 ändern und meine POCO-Eigenschaft auf lange.

Dann funktioniert es.

1

Ich verwendete eine Ansicht mit ROW_NUMBER() Verwendung für die eindeutige ID-Generierung.

In meinem Fall, auch wenn ich den komplexen Typ zu Int64 und die POCO-Eigenschaft zu long geändert hat, hat es nicht funktioniert.

Ich musste die ROW_NUMBER() Nutzung aus meiner Sicht entfernen. Schließlich habe ich die meiner Ansicht nach verwendeten Tabellen zusammengeführt und eine einzige Tabelle erstellt. Es hat so funktioniert.

0

I Casted die ROW_NUMBER() Rückgabewert in der Abfrage selbst auf INT wie folgt:

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