Queryable.DefaultIfEmpty<TSource> Method (IQueryable<TSource>, TSource)

Returns the elements of the specified sequence or the specified value in a singleton collection if the sequence is empty.

Namespace:  System.Linq
Assembly:  System.Core (in System.Core.dll)

public static IQueryable<TSource> DefaultIfEmpty<TSource>(
	this IQueryable<TSource> source,
	TSource defaultValue

Type Parameters


The type of the elements of source.


Type: System.Linq.IQueryable<TSource>
The IQueryable<T> to return the specified value for if empty.
Type: TSource
The value to return if the sequence is empty.

Return Value

Type: System.Linq.IQueryable<TSource>
An IQueryable<T> that contains defaultValue if source is empty; otherwise, source.

Usage Note

In Visual Basic and C#, you can call this method as an instance method on any object of type IQueryable<TSource>. When you use instance method syntax to call this method, omit the first parameter.


source is null.

The DefaultIfEmpty<TSource>(IQueryable<TSource>, TSource) method generates a MethodCallExpression that represents calling DefaultIfEmpty<TSource>(IQueryable<TSource>, TSource) itself as a constructed generic method. It then passes the MethodCallExpression to the CreateQuery<TElement>(Expression) method of the IQueryProvider represented by the Provider property of the source parameter.

The query behavior that occurs as a result of executing an expression tree that represents calling DefaultIfEmpty<TSource>(IQueryable<TSource>, TSource) depends on the implementation of the type of the source parameter. The expected behavior is that it returns source if it is not empty. Otherwise, it returns an IQueryable<T> that contains defaultValue.

The following code example shows a situation in which it is useful to call DefaultIfEmpty<TSource>(IQueryable<TSource>, TSource) in a LINQ query. A default value is passed to DefaultIfEmpty<TSource>(IQueryable<TSource>, TSource) in this example.

            // Create a list of Pet objects.
            List<Pet> pets =
                new List<Pet>{ new Pet { Name="Barley", Age=8 },
                                   new Pet { Name="Boots", Age=4 },
                                   new Pet { Name="Whiskers", Age=1 } };

            // This query selects only those pets that are 10 or older.
            // In case there are no pets that meet that criteria, call
            // DefaultIfEmpty(). This code passes an (optional) default
            // value to DefaultIfEmpty().
            string[] oldPets =
                .Where(pet => pet.Age >= 10)
                .Select(pet => pet.Name)

            outputBlock.Text += "First query: " + oldPets[0] + "\n";

            // This query selects only those pets that are 10 or older.
            // This code does not call DefaultIfEmpty().
            string[] oldPets2 =
                .Where(pet => pet.Age >= 10)
                .Select(pet => pet.Name)

            // There may be no elements in the array, so directly
            // accessing element 0 may throw an exception.
               outputBlock.Text += "Second query: " + oldPets2[0] + "\n";
            catch (Exception e)
               outputBlock.Text += "Second query: An exception was thrown: " + e.Message + "\n";

                This code produces the following output:

                First query: [EMPTY]
                Second query: An exception was thrown: Index was outside the bounds of the array.


Supported in: 5, 4, 3

Silverlight for Windows Phone

Supported in: Windows Phone OS 7.1

For a list of the operating systems and browsers that are supported by Silverlight, see Supported Operating Systems and Browsers.

Community Additions