LINQ выбрасывает недопустимое исключение приведения на bigint - PullRequest
11 голосов
/ 29 апреля 2011

У меня есть запрос 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);

Однако он выдает следующее исключение:

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

Исходный файл: C: \ TempPersonalCode \ TransportTracking\ TransportTracking \ TransportTracking \ Controllers \ AJAXController.cs Строка: 35

(строка 35 - это предложение select)

Я в замешательстве, потому что при изменении:

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

до

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

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

Ответы [ 3 ]

18 голосов
/ 18 марта 2013

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

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

Закладка (Int32), которую вы помещаете на передний план, (вероятно) переводится в хранилище данных (в SQL Server это означает что-то вроде * 1009).* и, следовательно, Entity Framework теперь ожидает, что получит int вместо long.

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

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

(jhott)

1 голос
/ 03 февраля 2016

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

CAST (TotalCount AS INT)TotalCount
0 голосов
/ 29 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...