2013-04-05 71 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方法,因此该属性没有固有名称