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 \ Controllers \ AJAXController.cs Строка: 35

(Строка 35 - это предложение выбора)

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

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

to

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

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


person KTF    schedule 29.04.2011    source источник
comment
Анонимный объект вообще не использует отражение. Он определяет тип во время компиляции на основе возвращаемого типа ClientDataID.   -  person vcsjones    schedule 29.04.2011
comment
@vcsjones: Тем более, что это сбивает с толку: P Но спасибо, что поправили меня по этому поводу.   -  person KTF    schedule 29.04.2011


Ответы (3)


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

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

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

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

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

(Джотт)

person Ryan    schedule 18.03.2013
comment
Но каково решение, Райан - person Mohit; 25.09.2014
comment
Я добавил к своему ответу предложение, объясняющее, как решить проблему. - person Ryan; 25.09.2014
comment
Это мне помогло. У меня была хранимая процедура, которая возвращала среднее значение за секунды. Поэтому, когда я поместил хранимую процедуру в DBML, она автоматически сгенерировалась как long?, однако в хранимой процедуре, где у меня нет данных для усреднения, я просто сделал SELECT 0, чтобы вернуть 0 (ноль). Теперь это означало, что хранимая процедура отправляла int? обратно вызывающему коду, когда не было данных для усреднения, и, следовательно, она давала мне InvalidCastException. Иногда это работало, отправляя long?, а иногда отправляя int?. - person Andrei Bazanov; 17.02.2017

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

CAST (TotalCount AS INT)TotalCount
person Ghadir Farzaneh    schedule 03.02.2016

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

person Mark Cidade    schedule 29.04.2011
comment
Это было одно из первых, что я проверил. Я должен буду проверить это снова завтра, но я почти уверен, что установил для него значение bigint. - person KTF; 29.04.2011
comment
Да, конечно - в свойствах этого поля в EDMX у меня это как Int64 ... какие-нибудь другие идеи? - person KTF; 02.05.2011
comment
Не совсем. Лучше всего спросить на странице social.msdn.microsoft.com/Forums / en-NZ / adodotnetentityframework - person Mark Cidade; 03.05.2011