عبارت Join – انجام یک عمل Left Outer Join

با استفاده از عبارت join شما می‌توانید یک اتصال از نوع left outer join انجام دهید. همانند عمل inner join این نوع اتصال نیز یک خروجی مسطح بر می‌گرداند. عمل inner join عنصری که معادلی در منبع داده‌ی دیگر نداشته باشد را حذف می‌کند. به عنوان مثال اگر یک مؤلف کتابی ننوشته باشد، در نتیجه‌ی عبارت پرس و جو نمایش داده نمی‌شود. در عمل left outer join عناصری که در منبع داده‌ی دیگر معادلی نداشته باشند باز هم در نتیجه پرس و جو قرار می می‌گیرند. این عمل با استفاده از متد DefaultIfEmpty امکان پذیر است.
join-clause-left-outer-1001
در زیر مثالی را مشاهده می‌کنید، که از عمل left outer join استفاده می‌کند:

   1: Author[] authors = new Author[]                                                        
   2: {                                                                                      
   3:     new Author() { AuthorId = 1, Name = "John Smith" },                                
   4:     new Author() { AuthorId = 2, Name = "Harry Gold" },                                
   5:     new Author() { AuthorId = 3, Name = "Ronald Schwimmer" },                          
   6:     new Author() { AuthorId = 4, Name = "Jerry Mawler" }                               
   7: };                                                                                    
   8:                                                                                        
   9: Book[] books = new Book[]                                                              
  10: {                                                                                      
  11:     new Book() { AuthorId = 1, Title = "Little Blue Riding Hood" },                    
  12:     new Book() { AuthorId = 3, Title = "The Three Little Piggy Banks" },               
  13:     new Book() { AuthorId = 1, Title = "Snow Black" },                                 
  14:     new Book() { AuthorId = 2, Title = "My Rubber Duckie" },                           
  15:     new Book() { AuthorId = 2, Title = "He Who Doesn't Know His Name" },               
  16:     new Book() { AuthorId = 1, Title = "Hanzel and Brittle" }                          
  17: };                                                                                     
  18:                                                                                        
  19: var result = from a in authors                                                          
  20:              join b in books on a.AuthorId equals b.AuthorId into booksByAuthors        
  21:              from x in booksByAuthors.DefaultIfEmpty(new Book {AuthorId=0,Title="None"})
  22:              select new { Author = a.Name, x.Title };                                   
  23:                                                                                        
  24: Console.WriteLine("{0, -20} {1}", "Author", "Book");                                   
  25: foreach (var r in result)                                                              
  26: {                                                                                      
  27:     Console.WriteLine("{0, -20} {1}", r.Author, r.Title);                              
  28: }

برای انجام یک عمل left outer join با استفاده از عبارت join، ابتدا لازم است که دو منبع داده را با استفاده از group join متصل نمایید. سپس بر روی نتیجه‌ی حاصل یک پرس و جوی دیگر را انجام دهید. با استفاده از متد DefaultIfEmpty برای گروهی که عنصری ندارد یک مقدار پیشفرض مشخص می‌کنیم. دو خط ابتدای عبارت پرس و جوی موجود در خطوط 19 تا 22 با استفاده از عمل group join تمامی مؤلف‌ها و کتاب‌هایی که خاصیت AuthorId آن‌ها دارای مقدار برابری است را با هم ترکیب می‌کند. خط بعدی پرس و جوی دیگری برای روی نتیجه‌ی اولین پرس وجو به عنوان منبع داده انجام می‌دهد (عمل ترکیب را انجام می‌دهد). با استفاده از DefaultIfEmpty یک مقدار پیشفرض را برای گروهی که هیچ عنصری ندارد مشخص می‌کنیم. متد DefaultIfEmpty یک آرگومان که نوعی برابر هر کدام از اعضای گروه را دارد می‌پذیرد. از آنجایی که هر گروه در عبارت پرس و جوی ما دارای نوعی برابر Book می‌باشد بنابراین یک نمونه از کلاس Book را ساخته و به خاصیت‌های آن مقدار پیشفرضی را می‌دهیم.
بر اساس منبع داده‌های موجودر Jerry Mawler با شماره برابر 4 هیچ کتابی در منبع داده‌ی books ندارد. اگر از عمل inner join استفاده کنید این مؤلف در نتیجه پرس و جو قرار نمی‌گیرد. واما از آنجاییکه ما از عمل left outer join استفاده کرده‌ایم این مؤلف در نتیجه‌ی پرس و جو قرار می‌گیرد. و مقدار پیشفرضی را که تعیین نموده‌اید به عنوان کتاب او نمایش داده می‌شود.