2009-01-12 10 views
5

Jestem trochę początkujący, jeśli chodzi o Linq do SQL, ale mam nadzieję, że możesz pomóc. Pisałem następujące LINQ to SQL oświadczenie z rozszerzeniem metody:Dlaczego otrzymuję komunikat "Niepoprawna obsada" podczas korzystania z Linq do SQL?

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

Gdzie CEDB jest DataContext, ClassEvents jest stół (do zajęć i imprez odbywają się w zakładzie) i ClassID jest unikalnym kluczem całkowitą.

To zapytanie działa poprawnie w LinqPadzie (bez programu Cedb). Po powrocie mówi, że typem powrotu jest "ClassEvent". W Intellisense w Visual studio mówi mi, że typem zwrotnym tego zapytania jest ClassEvent (utworzony w moim modelu danych). Jednak, gdy staram się umieścić wyniki w zmiennej:

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

następnie pojawia się błąd: InvalidCastException: Określony oddanych nie jest prawidłowy. To samo dzieje się, jeśli używam klasy "ClassEvent" zamiast var. Jestem nowy w tym, ale ten wydaje się raczej prawdziwym dunem, niż błędem. Czy istnieje coś o pojedynczej metodzie, której nie znam, która prowadzi do błędu? Każda pomoc będzie doceniona!

Odpowiedz

5

Slace - i inne zainteresowane strony. Przyczyną błędu "Nieprawidłowe odrzucenie Cast" była zmiana w podstawowym modelu danych. Pole smallinta zostało zmienione na bit. Tak więc, gdy system próbował odwzorować wyniki zapytania na strukturę danych "ClassEvent", pojawił się konflikt między modelem (który nie został zaktualizowany) a tabelą danych.

Niemniej jednak doceniam odpowiedź!

+0

Dzięki za odpowiedź, niestety oznacza to, że nie możemy używać Linq do SQL, aby rozmawiać z bazą danych który może mieć nieco inny schemat? – jpierson

1

Nie trzeba robić zarówno Wybierz i pojedyncze, w rzeczywistości nawet nie potrzebują gdzie można uciec (patrz http://msdn.microsoft.com/en-us/library/bb535118.aspx):

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

ja odradzam także używanie Single, chyba że masz 100% pewności, że Func<T, bool> zawsze zwróci wartość, tak jakby nie zwracała wartości, która spowoduje wygenerowanie wyjątku. Lepiej jest używać SingleOrDefault i wykonywać zerowanie przed interakcją z obiektem (http://msdn.microsoft.com/en-us/library/bb549274.aspx)

+0

Dziękujemy! Zacząłem pisać "i jeśli ktoś zna prostszy sposób ...", ponieważ pamiętam artykuł "10 mitów", który wyjaśnił coś podobnego. Chciałbym jednak zrozumieć, co się dzieje, a nie tylko przejść do skrótu. Na szczęście zrobiłeś jedno i drugie. Dzięki jeszcze raz. –

+0

Link do [10 MITów LINQ] (http://www.albahari.com/nutshell/10linqmyths.aspx) – Justin

Powiązane problemy