2010-10-20 160 views
1

我有一個學生類,名稱,具有學生名稱和條目標題的blogEntries類以及具有任務名稱的blogAssignments類。LINQ雙左連接

我想向所有學生和他們旁邊顯示他們創建的blogEntries,其標題與blogAssignments.assignmentName匹配。

我有以下LINQ查詢,但我無法揣摩出在blogAssignments加盟:

var results = 
       from person in HACCStudents 
       join bEntry in blogEntries on person.FullName equals bEntry.AuthorFullName 
       into studentBlogEntries 
       from studentBlogEntry in studentBlogEntries.DefaultIfEmpty() 
       orderby person.FullName 
       select new { PersonName = person.FullName, 
        BlogTitle=studentBlogEntry != null ?studentBlogEntry.Title : "" 


       }; 

回答

3

編輯:

這裏是我寫的,我認爲一個測試用例滿足您的使用LINQ to Objects的要求:

public class Person 
{ 
    public string FullName; 
} 

public class BlogEntry 
{ 
    public string AuthorFullName; 
    public string Title; 
} 

public class BlogAssignment 
{ 
    public string AssignmentName; 
} 

public void GetStudentsWithAssignments() 
{ 
    var students = new List 
    { 
     new Person { FullName = "Bob Doe" }, 
     new Person { FullName = "Steve Carrell" }, 
     new Person { FullName = "John West" }, 
     new Person { FullName = "Alice Croft" }, 
     new Person { FullName = "Al Bean" } 
    }; 

    var entries = new List 
    { 
     new BlogEntry { AuthorFullName = "Steve Carrell", Title = "100 ways to skin a cat" }, 
     new BlogEntry { AuthorFullName = "Steve Carrell", Title = "LINQ sux arze" }, 
     new BlogEntry { AuthorFullName = "John West", Title = "Salmon bake 2007" }, 
     new BlogEntry { AuthorFullName = "John West", Title = "Make my day" }, 
     new BlogEntry { AuthorFullName = "Al Bean", Title = "An inconvenient tooth" } 
    }; 

    var assignments = new List 
    { 
     new BlogAssignment { AssignmentName = "Salmon bake 2007" }, 
     new BlogAssignment { AssignmentName = "LINQ sux arze" }, 
     new BlogAssignment { AssignmentName = "Make my day" } 
    }; 

    var subquery = 
     from e in entries 
     join a in assignments on e.Title equals a.AssignmentName 
     select e; 

    var results = 
     from person in students 
     join entry in subquery on person.FullName equals entry.AuthorFullName into personEntries 
     from personEntry in personEntries.DefaultIfEmpty() 
     orderby person.FullName 
     select new 
     { 
      PersonName = person.FullName, 
      BlogTitle = personEntry == null ? "" : personEntry.Title 
     }; 
} 

更棘手的是你想顯示所有學生,但只有左連接博客與博客分配相匹配的條目,這是一個內部連接。

這就是爲什麼我添加了進行內連接的子查詢,然後在主查詢中使用join..into語法將連接添加到子查詢中,以獲得左外連接語義。

您可以一口氣做到這一切,但我發現通過將子查詢分解爲單獨的聲明更容易閱讀LINQ查詢。

+0

我只是使用列表作爲數據源,所以這將是對象的LINQ,對吧?我對此很陌生。 – Caveatrob 2010-10-20 03:17:14

+0

此外 - 當這條線上沒有學生博客條目時,studentBlogEntry上的炸彈爲空: 在blogBassEntry.Title中加入bAssignments等於bAssignment.AssignmentName – Caveatrob 2010-10-20 03:20:10

+0

如果是對象的LINQ,那麼您需要檢查null studentBlogEntry實例在訪問其屬性之前,根據您的原始代碼 - 請參閱我的編輯 – Sam 2010-10-21 05:18:44