2013-04-05 97 views
8

我有兩個實體。一個是「學生」,而另一個是「主題」。LINQ中的匿名類型成員聲明器無效

兩個實體的細節是這樣的:

students { id, name} 

subjects { studentID, subjectName, passed} 

其中,「通過」是布爾類型的。

現在我要查詢的學生姓名和科目的計算,他可以通過與如下:

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

但我收到錯誤消息:無效的匿名類型成員聲明。匿名類型成員必須聲明爲成員分配,簡單名稱或成員訪問權限。

我知道如何解決它。有人會幫助我嗎? 感謝

+1

您錯過了關閉''',但更重要的是,您需要*名稱*屬性,如錯誤消息所示。 'Count = s.subjects.dotdotdot ...' – 2013-04-05 18:33:15

+0

我明白了,非常感謝大家。 – 2013-04-05 18:37:40

回答

10

您必須添加匿名類型的屬性名稱:

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

使用成員分配,只有當你可以跳過它們。編譯器將採用該成員的名稱。這就是爲什麼s.name可以在沒有指定屬性名稱的情況下應用。 Count()是一個表達式,所以你必須指定屬性應該如何命名。

來源:Anonymous Types (C# Programming Guide)

如果你沒有在匿名類型指定成員名稱,編譯器 給人的匿名類型成員相同的名稱屬性是 用來初始化它們。 您必須爲 正在與表達(...)初始化屬性提供一個名稱

14

這意味着你需要命名不能推斷出你的匿名類型的屬性

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

通常,屬性名稱已足夠好,但是您使用的是Count方法,因此該屬性沒有固有名稱

相關問題