2013-04-05 30 views
8

Tôi có hai thực thể. Một là "Học sinh" trong khi một học sinh khác là "Môn học".Trình khai báo thành viên kiểu vô danh không hợp lệ trong LINQ

Các chi tiết của hai thực thể là một cái gì đó như:

students { id, name} 

subjects { studentID, subjectName, passed} 

nơi "thông qua" là kiểu boolean.

Bây giờ tôi muốn truy vấn tên học sinh và đếm các chủ đề mà ông có thể vượt qua với sau:

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

Nhưng tôi nhận được msg lỗi: không hợp lệ vô danh loại thành viên declarator. Các thành viên kiểu ẩn danh phải được khai báo bằng cách gán thành viên, tên đơn giản hoặc quyền truy cập thành viên.

Tôi không biết cách giải quyết. Có ai giúp tôi không? nhờ

+1

Bạn đang thiếu một ')', nhưng quan trọng hơn, bạn cần * tên * thuộc tính , như thông báo lỗi đề xuất. 'Count = s.subjects.dotdotdot ...' –

+0

Tôi hiểu rồi, cảm ơn rất nhiều. –

Trả lời

10

Bạn phải thêm vô danh loại thuộc tính tên:

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

Bạn có thể bỏ qua chúng chỉ khi sử dụng phân viên. Trình biên dịch sẽ lấy tên từ thành viên đó. Đó là lý do tại sao s.name có thể được áp dụng mà không chỉ định tên thuộc tính. Count() là một biểu thức, vì vậy bạn phải chỉ định cách đặt tên thuộc tính.

Nguồn: Anonymous Types (C# Programming Guide)

Nếu bạn không chỉ định tên thành viên trong các loại vô danh, trình biên dịch mang đến cho các thành viên loại vô danh cùng tên với tài sản là sử dụng để khởi tạo chúng. Bạn phải cung cấp một tên cho một tài sản mà đang được khởi tạo với một biểu (...)

14

Điều này có nghĩa rằng bạn cần phải đặt tên thuộc tính loại vô danh của bạn mà không thể được suy ra

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

Thông thường, tên thuộc tính đủ tốt, tuy nhiên bạn đang sử dụng phương pháp Đếm, để thuộc tính không có tên vốn có

Các vấn đề liên quan