編輯:
這裏是我寫的,我認爲一個測試用例滿足您的使用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查詢。
來源
2010-10-20 01:59:48
Sam
我只是使用列表作爲數據源,所以這將是對象的LINQ,對吧?我對此很陌生。 – Caveatrob 2010-10-20 03:17:14
此外 - 當這條線上沒有學生博客條目時,studentBlogEntry上的炸彈爲空: 在blogBassEntry.Title中加入bAssignments等於bAssignment.AssignmentName – Caveatrob 2010-10-20 03:20:10
如果是對象的LINQ,那麼您需要檢查null studentBlogEntry實例在訪問其屬性之前,根據您的原始代碼 - 請參閱我的編輯 – Sam 2010-10-21 05:18:44