Left Join Linq example

So the Left Join is the same concept as a SQL Left Join. The left join will join all items from the left side and any on the right side where there is no match, it will be a null.

A basic example

In this example, we are going to perform a left join with two lists.

Method syntax

The syntax is very similar to the GroupJoin. The magical extra bit you will need is the DefaultIfEmpty(). This is the part which figures out if there is no match, use the default, which will be generally null.

Live example: https://dotnetfiddle.net/ga7Tkb

var people = new[]
    {
        new { Name = "Vernon", Gender = "Male", CountryCode = "GB" },
        new { Name = "Carrie", Gender = "Female", CountryCode = "CA" },
        new { Name = "Joanna", Gender = "Female", CountryCode = "US" },
        new { Name = "Thomas", Gender = "Male", CountryCode = "ES" },
        new { Name = "James", Gender = "Male", CountryCode = "GB" },
        new { Name = "Elly", Gender = "Female", CountryCode = "US" }
    };

var countries = new[]
    {
        new {CountryName = "United Kingdom", Code = "GB"},
        new {CountryName = "United States", Code = "US"},
        new {CountryName = "Canada", Code = "CA"},
        new {CountryName = "France", Code = "FR"},
        new {CountryName = "Spain", Code = "ES"}
    };

var q = countries.GroupJoin(people,
                            arg => arg.Code,
                            arg => arg.CountryCode,
                            (c, p) => new {Country = c, People = p})
                 .SelectMany(arg => arg.People.DefaultIfEmpty(),
                             (c, p) => new {Country = c, People = p});

// output
//United Kingdom - Vernon
//United Kingdom - James
//United States - Joanna
//United States - Elly
//Canada - Carrie
//France - NULL
//Spain - Thomas

Query syntax

Here, to perform a left join, we carry out the join, then we use the groupby query syntax, into g. Then we specify from pg in g.DefaultIfEmpty(). This is the crucial part where if there are no matches, just use null.

Live example: https://dotnetfiddle.net/wFqYTJ

var people = new[]
    {
        new { Name = "Vernon", Gender = "Male", CountryCode = "GB" },
        new { Name = "Carrie", Gender = "Female", CountryCode = "CA" },
        new { Name = "Joanna", Gender = "Female", CountryCode = "US" },
        new { Name = "Thomas", Gender = "Male", CountryCode = "ES" },
        new { Name = "James", Gender = "Male", CountryCode = "GB" },
        new { Name = "Elly", Gender = "Female", CountryCode = "US" }
    };

var countries = new[]
    {
        new {CountryName = "United Kingdom", Code = "GB"},
        new {CountryName = "United States", Code = "US"},
        new {CountryName = "Canada", Code = "CA"},
        new {CountryName = "France", Code = "FR"},
        new {CountryName = "Spain", Code = "ES"}
    };


var q = from c in countries
        join p in people
            on c.Code equals p.CountryCode 
        into g
        from pg in g.DefaultIfEmpty()
        select new {Country = c, People = pg};

// output
//United Kingdom - Vernon
//United Kingdom - James
//United States - Joanna
//United States - Elly
//Canada - Carrie
//France - NULL
//Spain - Thomas