title: How does DefaultIfEmpty() imply left outer join?
body: <p>How does this:</p>
  
  <pre><code>from c in Contacts
  join a in Addresses
  on c.Address_ID equals a.Address_ID
  into Temp
  from d in Temp.DefaultIfEmpty()
  where c.First_Name.ToUpper().Contains("Pin".ToUpper())
  select new { id = c.Contact_ID, value = (c.First_Name??"") + " " + (c.Last_Name??"") + " " + (c.Company_Name??""), FirstName = c.First_Name, LastName = c.Last_Name, AddressFull = d.Address_Full, Phone = c.Phone, Email = c.Email, CompanyName = c.Company_Name }
  </code></pre>
  
  <p>translate to this (using LinqPad)?</p>
  
  <pre><code>SELECT [t0].[Contact_ID] AS [id], ((((COALESCE([t0].[First_Name],@p1)) + @p2) + (COALESCE([t0].[Last_Name],@p3))) + @p4) + (COALESCE([t0].[Company_Name],@p5)) AS [value], [t0].[First_Name] AS [FirstName], [t0].[Last_Name] AS [LastName], [t1].[Address_Full] AS [AddressFull], [t0].[Phone], [t0].[Email], [t0].[Company_Name] AS [CompanyName]
  FROM [Contact] AS [t0]
  LEFT OUTER JOIN [Address] AS [t1] ON [t0].[Address_ID] = ([t1].[Address_ID])
  WHERE UPPER([t0].[First_Name]) LIKE @p0
  </code></pre>
  
  <p>It seems that <code>Temp.DefaultIfEmpty()</code> == <code>LEFT OUTER JOIN</code></p>
  
  <p>What's the reasoning behind this syntax?  Can someone please eloquently explain why?</p>