2009-04-06 37 views
40

Tôi có một lớp Câu hỏi có thuộc tính Danh sách công khai có thể chứa một số Câu trả lời.câu hỏi LINQ: truy vấn các bộ sưu tập lồng nhau

Tôi có kho lưu trữ câu hỏi có trách nhiệm đọc câu hỏi và câu trả lời của câu hỏi từ tệp xml.

Vì vậy, tôi có một bộ sưu tập Câu hỏi (Danh sách) với mỗi đối tượng Câu hỏi có một bộ sưu tập các câu trả lời và tôi muốn truy vấn tập hợp các câu hỏi trả lời này (tức là bằng tên của nó) bằng cách sử dụng LINQ. Tôi không biết làm thế nào để làm điều này đúng cách.

Tôi có thể làm điều đó với một foreach nhưng tôi muốn biết liệu có một cách tinh khiết Linq kể từ khi tôi đang học nó.

+0

Bạn đang tìm kiếm một câu trả lời liên quan đến một câu hỏi hoặc câu trả lời cụ thể có thể liên quan đến bất kỳ câu hỏi nào? –

Trả lời

69

Để tìm câu trả lời.

questions.SelectMany(q => q.Answers).Where(a => a.Name == "SomeName") 

Để tìm câu hỏi về câu trả lời.

questions.Where(q => q.Answers.Any(a => a.Name == "SomeName")) 

Trong thực tế, bạn sẽ nhận được bộ sưu tập các câu trả lời hoặc câu hỏi và bạn sẽ phải sử dụng First(), FirstOrDefault(), Single() hoặc SingleOrDefault() tùy thuộc vào nhu cầu của bạn để có được một câu trả lời hoặc câu hỏi cụ thể.

+2

Tôi mong đợi các câu hỏi sẽ được giữ lại, vì vậy một cái gì đó giống như: ... SelectMany (q => q.Answers.Select (a => new {A = a, Q = q}). Ở đâu (qa = > qa.A.Name == "SomeName") sẽ phù hợp hơn – Richard

+0

Bạn luôn có thể quay lại câu hỏi bằng answer.Question - không cần phải giới thiệu một loại ẩn danh. –

+0

@danbruc: Không có bất động sản nào được liệt kê trong Q – Richard

32
from question in Questions 
from answer in question.Answers 
where answer.Name == something 
select question // or select answer 
+0

Đây là những gì tôi đang tìm kiếm. –

7

Sử dụng SelectMany và First/FirstOrDefault (nếu bạn đang cần một giá trị)

List<Questions> questions = //initialization; 
var someAnswer = questions.SelectMany(q=>q.Answers) 
          .First(a=>a.Name =="MyName"); 
7

Có vẻ như bạn có thể sử dụng một cái gì đó như thế này:

var query = from q in questions 
      from a in q.Answers 
      where a.Name == "Answer Name" 
      select a; 
Các vấn đề liên quan