2017-04-19 10 views
0

非常に単純なケースのように見えますが、私の頭やstackoverflowで適切なラムダ式を見つけることができません:(私はすべての助けに感謝します)LINQラムダ式を使用して適切なデータを取得する方法多対多関係

ケースはシンプルに見える、私はそれらの間の多くの多くの二つのクラスと関係を持っている

public class Student 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 

     public List<Document> Documents { get; set; } 
    } 

    public class Document 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 

     public List<Student> Students { get; set; } 
    } 

その後、私はいくつかの値を開始します。。

 Student st1 = new Student { Id = 1, Name = "Student 1" }; 
     Student st2 = new Student { Id = 2, Name = "Student 2" }; 
     Student st3 = new Student { Id = 3, Name = "Student 3" }; 

     List<Student> listStudent12 = new List<Student>(); 
     listStudent12.Add(st1); 
     listStudent12.Add(st2); 

     List<Student> listStudent23 = new List<Student>(); 
     listStudent23.Add(st2); 
     listStudent23.Add(st3); 


     Document doc1 = new Document { Id = 1, Name = "doc 1", Students = listStudent12 }; 
     Document doc2 = new Document { Id = 2, Name = "doc 2", Students = listStudent23 }; 

     List<Document> listDocs = new List<Document>(); 
     listDocs.Add(doc1); 
     listDocs.Add(doc2); 

今、私はリストを取得したいと思います「学生3」(id:3)に関連するlinqラムダ式を使用したドキュメントの使用。

私はこのように試してみました:

var result = listDocs.Where(d => d.Students.FirstOrDefault().Id == 3).ToList(); 

が、それは(私がなぜ知っていると思います - 最初に返さ生徒が3に等しくない)はnullを返します。

Id = 3の生徒の学生リストにあるすべての文書が結果に含まれていると思います。 私はここにこぞって助けが必要です。事前にありがとうございます。

は、SQLレベルでは、私は行くだろう:あなたはあなたの例でやった

SELECT Document.* from Document, DocumentStudent WHERE Document.Id = DocumentStudent.DocumentId AND DocumentStudent.StudentId = 3 
+0

試しVAR結果= listDocs.Whereを使用している場合、それは単純に見えるだろうと思い.ToList(); – Ashiquzzaman

+0

はい、これはまさに必要なものです。ありがとうございますAshiquizzaman – Mikolaj

答えて

1

Id: 3との最初のStudentを持つ任意のDocumentを見つけました。それは誰もなしで終わる。あなたが何をしたいか

は次のとおりです。

var result = listDocs.Where(doc => doc.Students.Any(st => st.Id == 3).ToList(); 

それはId: 3と、少なくとも1 Studentを持つ任意のDocumentと評価されます。

+0

ありがとうございます。これはまさに私が必要としていたものです。 Dziękiśliczne。 – Mikolaj

0

私は()D => d.Students.any(S => s.Idの== 3)あなたは、次の構文

var result = (from doc in listDocs 
       from student in doc.Students 
       where student.Id == 3 
       select doc).ToList(); 
+0

それもありがとうございます、しかし、私は本当にそれがラムダ式によってどのように達成されるのだろうかと思っていました。そして、mwilczynskiの答えは仕事を完璧にしました。助けてくれてありがとう! – Mikolaj

関連する問題