Почему я получаю «Invalid Cast» при использовании Linq to SQL? - PullRequest
5 голосов
/ 12 января 2009

Я немного новичок, когда дело доходит до Linq для SQL, но я надеюсь, что вы можете помочь. Я написал следующий оператор Linq to SQL с методами расширения:

Cedb.ClassEvents.Where(c => c.ClassID == 1).Select(c => c).Single()

Где Cedb - это Datacontext, ClassEvents - это таблица (для классов и событий, проводимых на объекте), а ClassID - это уникальный целочисленный ключ.

Этот запрос отлично работает в LinqPad (без Cedb). Когда он возвращается, он говорит, что тип возвращаемого значения - «ClassEvent». В Intellisense в Visual studio он сообщает мне, что типом возврата этого запроса является ClassEvent (созданный в моей модели данных). Однако, когда я пытаюсь поместить результаты в переменную:

var classEvent = Cedc.ClassEvents.Where(c.ClassID == 1).Select(c => c).Single();

тогда я получаю сообщение об ошибке: InvalidCastException: указанное приведение недействительно. То же самое происходит, если я использую класс «ClassEvent» вместо var. Я новичок в этом, но этот кажется скорее настоящим хламом, чем ошибкой. Есть ли что-то в методе Single, что я не знаю, что приводит к ошибке? Любая помощь будет оценена!

Ответы [ 2 ]

5 голосов
/ 12 января 2009

Slace - и любые другие заинтересованные стороны. Причиной ошибки «Invalid Cast Exception» стало изменение базовой модели данных. Поле smallint было изменено на bit. Таким образом, когда система пыталась отобразить результаты запроса в структуру данных «ClassEvent», возник конфликт между моделью (которая не была обновлена) и таблицей данных.

Тем не менее, я ценю ответ!

1 голос
/ 12 января 2009

Вам не нужно делать и выбор, и сингл, на самом деле вам даже не нужно место, с которым вы можете уйти (см. http://msdn.microsoft.com/en-us/library/bb535118.aspx):

var classEvent = Cedc.ClassEvents.Single(c => c.ClassID == 1);

Я бы также рекомендовал не использовать Single, если вы не уверены на 100%, что Func<T, bool> всегда будет возвращать значение, как если бы оно не возвращало значение, вы получите исключение. Лучше использовать SingleOrDefault и выполнять нулевую проверку перед взаимодействием с объектом (http://msdn.microsoft.com/en-us/library/bb549274.aspx)

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