LINQ бросает недопустимое исключение лита на bigint

У меня есть запрос LINQ, который выглядит примерно так:

var clintLst = (from clntDt in ent.ClientDatas
                where clntDt.CompanyName.Substring(0,searchWord.Length).Equals(searchWord, StringComparison.CurrentCultureIgnoreCase)
                orderby clntDt.CompanyName
                select new { ClientDataID = clntDt.ClientDataID,
                    CompanyName = clntDt.CompanyName, 
                    ContactName = (clntDt.ContactFirstName + " " + clntDt.ContactLastName),
                    CompanyLocation = clntDt.Location.LocationCity.CityName + ", " + clntDt.Location.LocationState.StateCode
                } ).Distinct().Take(10);

Однако это бросает следующее исключение:

Указанный литой из материализованного Тип "System.Int32" Недопустимый тип "System.Int64". [..] Сведения об исключении: System.InvalidOperationException: указанный литой из материализованного Тип "System.Int32" Недопустимый тип "System.Int64".

Исходный файл: C:\TempPersonalCode\TransportTracking\TransportTracking\TransportTracking\Контроллеры\AJAXController.cs Линия: 35

(строка 35 является предложением select)

Я смущен, потому что если изменение:

select new { ClientDataID = clntDt.ClientDataID,
    CompanyName = clntDt.CompanyName, 

к

select new { ClientDataID = (Int32)clntDt.ClientDataID,
    CompanyName = clntDt.CompanyName, 

тогда он отлично работает. Разве анонимный объект не должен использовать отражение, чтобы определить его тип? если да, то почему он решает, что это "Int32", а не длинный? В EDMX у меня это как Int64.

Ответ 1

Фраза "материализованное значение" относится к значению, полученному из хранилища данных.

Что, вероятно, происходит в том, что база данных имеет этот столбец, настроенный как int, но в вашем файле EDMX это a long (или Int64).

Приведение (Int32), которое вы ставите на передний план (возможно), переводится в хранилище данных (в SQL Server это означает что-то вроде CAST([columnName] AS int), и, следовательно, Entity Framework теперь ожидает получить int вместо long.

Без трансляции он ожидает long, но получает int.

Решение состоит в том, чтобы либо изменить файл EDMX, либо изменить столбец, чтобы тип данных в файле EDMX соответствовал типу данных в базе данных.

(jhott)

Ответ 2

В моей хранимой процедуре я возвращал row number и rowcount, я отбрасывал ее на int и теперь работает правильно.

CAST (TotalCount AS INT)TotalCount

Ответ 3

Исключение, похоже, выбрано из Entity Framework. У вас может быть столбец, установленный как int вместо bigint в файле SSDL.