2017-04-19 48 views
0

看起來像一個非常簡單的例子,但在我的頭上或計算器,我不能爲它找到合適的lambda表達式:(我感謝所有幫助。如何獲得使用LINQ Lambda表達式有許多正確的數據,以一對多的關係

案例看起來很簡單我有他們之間有兩個類和關係多對多

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 lambda表達式的文檔。

我想是這樣的:

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

但它返回空值(我想我知道爲什麼 - 第一個返回的學生不等於3)。

我希望結果包含所有在學生的列表中有Id = 3的文檔。 我在這裏搜索並需要幫助。預先感謝您的任何。

在SQL水平,我會去:

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

嘗試VAR的結果= listDocs.Where(d => d.Students.any(S => s.Id == 3)) .ToList(); – Ashiquzzaman

+0

是的,這正是需要的。謝謝Ashiquizzaman – Mikolaj

回答

1

你在你的例子做了什麼發現,具有第一StudentId: 3任何Document。最終沒有。

你想要做的是:

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

它將評估,以具有與Id: 3至少一個Student任何Document

+0

非常感謝。這正是我需要的。 Dziękiśliczne。 – Mikolaj

0

我認爲它看起來簡單,如果您使用以下語法

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

謝謝你的作品還,但是我真的不知道如何可以通過Lambda表達式來achived,並mwilczynski答案完全做的工作。感謝您的幫助! – Mikolaj

相關問題