The let clause allows you to store a result of  an expression inside a query expression and use it on the remaining part of the  query. A let clause is useful when the query is  using an expression multiple times in a query or if you simply want to create a short alias to a very long variable or property name.

List<Person> persons = new List<Person>
{
    new Person { FirstName="John", LastName="Smith" },
    new Person { FirstName="Henry", LastName="Boon" },
    new Person { FirstName="Jacob", LastName="Lesley" }
};

var query = from p in persons
            let fullName = p.FirstName + " " + p.LastName
            select new { FullName = fullName };

foreach (var person in query)
{
    Console.WriteLine(person.FullName);
}

Example 1

In the query expression in Example 1, the result of an expression to combine a  person’s FirstName and LastName properties and it store it to a variable for easy access. The  rest of the query expression after the let clause can now use the variable  containing the result of the expression. As you can see in the select clause of  the query expression in Example 1, we used the newly created variable from the  let clause and to create a property named FullName  during projection.

The let clause doesn’t have an equivalent query method. The following  rewrites the query expression above using the method syntax.

var query = persons.Select(p => new { fullName = p.FirstName + " " + p.LastName })
                   .Select(p => new { FullName = p.fullName });

The following are more examples of using the let  clause.

int[] numbers = { 1, 2, 3, 4, 5 };

//Query Expression
var query1 = from n in numbers
            let squared = n * n
            select squared;

//Method Syntax
var query2 = numbers.Select(n => new { squared = n * n })
                    .Select(n => n.squared);

Example 2

//Query Expression
var query1 = from p in persons
             let isTeenager = p.Age < 20 && p.Age > 12
             where isTeenager
             select new { p.FirstName, p.LastName };

//Method Syntax
var query2 = persons.Select(p => new { isTeenAger = p.Age < 20 && p.Age > 12 })
                    .Where(p => p.isTeenager)
                    .Select(p => new { p.FirstName, p.LastName });

Example 3

The above query uses the variable created by the let clause as an argument to  the where clause since the expression in the let clause is a boolean expression.