2013-04-05 13 views
8

Mam dwie jednostki. Jeden to "Uczniowie", a drugi to "Przedmioty".Nieprawidłowy anonimowy deklarator typu elementu w LINQ

Szczegóły tych dwóch podmiotów jest coś takiego:

students { id, name} 

subjects { studentID, subjectName, passed} 

gdzie „przeszedł” jest logiczną typu.

Teraz chcę zapytać nazwisko studenta i liczyć z zastrzeżeniem, że może przejść ze następująco:

var result = from s in db.students 
select new {s.name, s.subjects.Count(i => i.passed.Equals(true)}; 

ale pojawia się błąd msg: Nieprawidłowy anonimowego użytkownika typ declarator. Anonimowi członkowie typu muszą być zadeklarowani z przydziałem członków, prostą nazwą lub dostępem do członków.

Nie wiedziałem, jak go rozwiązać. Czy ktoś mógłby mi pomóc? dzięki

+1

Brakuje zamknięcia ')', ale co ważniejsze, musisz * nazwać * właściwość , jak sugeruje komunikat o błędzie. 'Count = s.subjects.dotdotdot ...' –

+0

Mam to, bardzo dziękuję wszystkim. –

Odpowiedz

10

Trzeba dodać anonimowych Właściwości typu nazwy:

var result = from s in db.students 
      select new { 
       s.name, 
       count = s.subjects.Count(i => i.passed.Equals(true) 
      }; 

Można pominąć je tylko przy użyciu przypisania użytkownika. Kompilator przyjmie nazwę od tego członka. Z tego powodu można zastosować s.name bez podawania nazwy właściwości. Count() jest wyrażeniem, więc trzeba określić, w jaki sposób należy nadać mu nazwę.

Źródło: Anonymous Types (C# Programming Guide)

Jeśli nie podasz nazwy członków w anonimowym typu, kompilator daje anonimowych użytkowników wpisać samą nazwę jak nieruchomości będącej stosować je zainicjować. Musisz podać nazwę dla nieruchomości, które jest inicjowane z wyrazem (...)

14

Oznacza to, że trzeba wymienić właściwości Twojego typ anonimowy, że nie można wywieść

select new 
{ 
    s.name, 
    Count=s.subjects.Count(i => i.passed.Equals(true)) 
}; 

Zwykle nazwa właściwości jest wystarczająco dobra, jednak używasz metody Count, więc właściwość nie ma właściwej nazwy

Powiązane problemy