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

TSource

The type of the elements of source.

Parameters

source
Type: System.Linq.IQueryable<TSource>

The IQueryable<T> to return the specified value for if empty.

defaultValue
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. For more information, see Extension Methods (Visual Basic) or Extension Methods (C# Programming Guide).

ExceptionCondition
ArgumentNullException

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 =
                    pets.AsQueryable()
                    .Where(pet => pet.Age >= 10)
                    .Select(pet => pet.Name)
                    .DefaultIfEmpty("[EMPTY]")
                    .ToArray();

                Console.WriteLine("First query: " + oldPets[0]);

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

                // There may be no elements in the array, so directly 
                // accessing element 0 may throw an exception. 
                try
                {
                    Console.WriteLine("Second query: " + oldPets2[0]);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Second query: An exception was thrown: " + e.Message);
                }

                /*
                    This code produces the following output:

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

.NET Framework

Supported in: 4.6, 4.5, 4, 3.5

.NET Framework Client Profile

Supported in: 4, 3.5 SP1

Portable Class Library

Supported in: Portable Class Library

Supported in: Windows Phone 8.1

Supported in: Windows Phone Silverlight 8.1

Supported in: Windows Phone Silverlight 8
Was this page helpful?
(1500 characters remaining)
Thank you for your feedback
Show:
© 2015 Microsoft