C-Sharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript | SQL | PHP | Angular | HTML
Part 1: We create 2 arrays. The goal of our joins will be to get elements from the first array based on the values in the second array.
Part 2: We call the Join method with lambdas. The lambdas join if the first value from ints1 is present in ints2 with 1 added.
LambdaPart 3: We use a query expression version. This performs the same joins as the extension method call.
Result: If ints1 contains an element of value 4, it is selected only if there is an element of value of 5 in ints2.
Int ArrayC# program that uses Join
using System;
using System.Linq;
class Program
{
    static void Main()
    {
        // Part 1: create array 1 and array 2.
        var ints1 = new int[3];
        ints1[0] = 4;
        ints1[1] = 3;
        ints1[2] = 0;
        var ints2 = new int[3];
        ints2[0] = 5;
        ints2[1] = 4;
        ints2[2] = 2;
        {
            // Part 2: join with method call.
            var result = ints1.Join<int, int, int, int>(ints2,
                x => x + 1,
                y => y,
                (x, y) => x);
            // Display results.
            foreach (var r in result)
            {
                Console.WriteLine(r);
            }
        }
        {
            // Part 3: join with query expression.
            var result = from t in ints1
                         join x in ints2 on (t + 1) equals x
                         select t;
            // Display results.
            foreach (var r in result)
            {
                Console.WriteLine(r);
            }
        }
    }
}
Output
4  (First loop)
3
4  (Second loop)
3
Info: In the query expression, the customers array is used and each element from that array is identified as "c".
And: The orders array is also used, and each element from that is identified as "o".
ID: The join takes the ID property from "c" and "o" and matches them. As the matches occur, new elements are created in the result.
SQL: This syntax is basically the same as in SQL. Occasionally it is easier to develop logic in this style of language.
C# program that uses join and equals in query
using System;
using System.Linq;
class Customer
{
    public int ID { get; set; }
    public string Name { get; set; }
}
class Order
{
    public int ID { get; set; }
    public string Product { get; set; }
}
class Program
{
    static void Main()
    {
        // Example customers.
        var customers = new Customer[]
        {
            new Customer{ID = 5, Name = "Sam"},
            new Customer{ID = 6, Name = "Dave"},
            new Customer{ID = 7, Name = "Julia"},
            new Customer{ID = 8, Name = "Sue"}
        };
        // Example orders.
        var orders = new Order[]
        {
            new Order{ID = 5, Product = "Book"},
            new Order{ID = 6, Product = "Game"},
            new Order{ID = 7, Product = "Computer"},
            new Order{ID = 8, Product = "Shirt"}
        };
        // Join on the ID properties.
        var query = from c in customers
                    join o in orders on c.ID equals o.ID
                    select new { c.Name, o.Product };
        // Display joined groups.
        foreach (var group in query)
        {
            Console.WriteLine("{0} bought {1}", group.Name, group.Product);
        }
    }
}
Output
Sam bought Book
Dave bought Game
Julia bought Computer
Sue bought Shirt
So: A cat with a specific ID may have 2 medications prescribed to it. The Join call resolves all of these.
And: We use the Join() method with lambda expression arguments. This is equivalent a query expression with the "join" clause.
C# program that uses Join, lambda expressions
using System;
using System.Linq;
class Animal
{
    public int ID { get; set; }
    public string Breed { get; set; }
}
class Medication
{
    public int ID { get; set; }
    public string Type { get; set; }
}
class Program
{
    static void Main()
    {
        // Example animals in veterinarian office.
        var animals = new Animal[]
        {
            new Animal{ID = 0, Breed = "cat"},
            new Animal{ID = 10, Breed = "dog"}
        };
        // Example medications (prescriptions).
        var medications = new Medication[]
        {
            new Medication{ID = 10, Type = "antibiotic"},
            new Medication{ID = 0, Type = "sedative"},
            new Medication{ID = 0, Type = "antihistimine"}
        };
        // Use fluent join syntax on ID.
        var query = animals.Join(medications,
              a => a.ID,
              m => m.ID,
              (a, m) => new { a.Breed, m.Type });
        // Results.
        foreach (var group in query)
        {
            Console.WriteLine($"{group.Breed} prescribed {group.Type}");
        }
    }
}
Output
cat prescribed sedative
cat prescribed antihistimine
dog prescribed antibiotic
And: We can only select a single value. But GroupJoin is invoked with the join query expression keyword.
GroupJoinInfo: This material is complex, tiresome and not all that useful for actual development.
And: This is near the end of the horrifying 143-page chapter on expressions. Thoroughness is helpful in language specifications.
Note: Thanks to Rob Martin for suggesting the Join() fluent syntax example. Two lambda expressions must be used.