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.