208Microsoft Visual Studio 2010: A Beginner’s Guide

The select many and join clauses are synonymous with SQL inner joins because there must be a foreign key in a child table that matches a parent in the parent table before any records for the parent will be returned. To address the issue of needing to get parents that don’t have children, you must perform a left outer join. To perform the equivalent of a SQL left outer join in LINQ, you must use a standard operator called DefaultIfEmpty. The following query gets a record for all customers, regardless of whether they have orders or not:

C#:

var myShop = new MyShopDataContext();

var customers =

from cust in myShop.Customers join ord in myShop.Orders

on cust.CustomerID equals ord.CustomerID into customerOrders

from custOrd in customerOrders.DefaultIfEmpty() select new

{

Name = cust.Name,

Date = custOrd == null ?

new DateTime(1800, 1, 1) : custOrd.OrderDate

};

foreach (var custOrd in customers)

{

Console.WriteLine(

"Name: " + custOrd.Name +

"Date: " + custOrd.Date);

}

VB:

Dim myShop As New MyShopDataContext

Dim customers =

From cust In myShop.Customers Group Join ord In myShop.Orders

On cust.CustomerID Equals ord.CustomerID Into customersOrders = Group

From custOrd In customersOrders.DefaultIfEmpty() Select New With

{

.Name = cust.Name,

.Date = IIf(custOrd Is Nothing,

New DateTime(1800, 1, 1), custOrd.OrderDate)

}

Page 231
Image 231
Microsoft 9GD00001 manual Microsoft Visual Studio 2010 a Beginner’s Guide