EF4 SPROC Отображение сложного типа - проблема с ROW_NUMBER () - PullRequest
0 голосов
/ 13 декабря 2010

Я уже некоторое время работаю с EF4 / Хранимыми процедурами / Сложными типами, но я раньше не сталкивался с этой проблемой.

У меня есть сохраненный процесс, который возвращает набор полей, сопоставленных с коллекцией сложных типов. Все работало нормально, пока я не ввел это дополнительное поле.

Используется ROW_NUMBER из T-SQL (используется в результатах ранжирования):

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

В моем сложном типе я установил не обнуляемый Int32 , и я также использую POCO, поэтому у меня это как обычный int в POCO.

Но когда я пытаюсь выполнить запрос, я получаю эту ошибку:

System.InvalidOperationException: Недвижимость "SearchRank" на «RankedLocationSearchResult» не удалось установить значение Int64. Вы должны установите для этого свойства ненулевое значение типа Int32.

Я просто не понимаю. Нигде я не говорил, что это свойство / поле Int64. И мое свойство является ненулевым значением типа Int32.

Теперь Я уверен, что проблема в ROW_NUMBER () .

Потому что, если я изменю этот T-SQL на 1 AS [SearchRank] (жесткий код, для тестирования), он будет работать нормально.

Это почти так же, как EF видит ROW_NUMBER() как возвращение Int64.

Почему? Должны ли мы приводить это как 32-разрядное целое число или что-то подобное?

У кого-нибудь была эта проблема?

Ответы [ 3 ]

3 голосов
/ 13 декабря 2010

Таким образом, после прочтения документации MSDN для ROW_NUMBER () выясняется, что для этой функции возвращается тип bigint .

Так что мне пришлось изменить комплексный тип на Int64 , а мое свойство POCO на long .

Тогда это работает.

1 голос
/ 29 октября 2012

Я использовал представление с использованием ROW_NUMBER() для генерации уникального идентификатора.

В моем случае, даже если я изменил сложный тип на Int64, а свойство POCO на long, он сделалне работает.

Мне пришлось убрать использование ROW_NUMBER() с моей точки зрения.Наконец, я объединил таблицы, используемые в моем представлении, и создал одну таблицу.Так получилось.

0 голосов
/ 01 февраля 2013

Я преобразовал возвращаемое значение ROW_NUMBER () в INT в самом запросе следующим образом:

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