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)

Syntax

'Declaration
<ExtensionAttribute> _
Public Shared Function DefaultIfEmpty(Of TSource) ( _
    source As IQueryable(Of TSource), _
    defaultValue As TSource _
) As IQueryable(Of TSource)
public static IQueryable<TSource> DefaultIfEmpty<TSource>(
    this IQueryable<TSource> source,
    TSource defaultValue
)

Type Parameters

  • TSource
    The type of the elements of source.

Parameters

  • 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.

Exceptions

Exception Condition
ArgumentNullException

source is nulla null reference (Nothing in Visual Basic).

Remarks

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.

Examples

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.
      Dim pets As New List(Of Pet)(New Pet() { _
                         New Pet With {.Name = "Barley", .Age = 8}, _
                         New Pet With {.Name = "Boots", .Age = 4}, _
                         New Pet With {.Name = "Whiskers", .Age = 1}})

      ' This query returns 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().
      Dim oldPets() As String = pets.AsQueryable() _
          .Where(Function(Pet) Pet.Age >= 10) _
          .Select(Function(Pet) Pet.Name) _
          .DefaultIfEmpty("[EMPTY]") _
          .ToArray()
      Try
         outputBlock.Text &= "First query: " + oldPets(0) & vbCrLf
      Catch ex As Exception
         outputBlock.Text &= "First query: An exception was thrown: " & _
                             ex.Message & vbCrLf
      End Try

      ' This query selects only those pets that are 10 or older.
      ' This code does not call DefaultIfEmpty().
      Dim oldPets2() As String = _
          pets.AsQueryable() _
          .Where(Function(Pet) Pet.Age >= 10) _
          .Select(Function(Pet) Pet.Name) _
          .ToArray()

      ' There may be no elements in the array, so directly
      ' accessing element 0 may throw an exception.
      Try
         outputBlock.Text &= "Second query: " & oldPets2(0) & vbCrLf
      Catch ex As Exception
         outputBlock.Text &= "Second query: An exception was thrown: " & _
                              ex.Message & vbCrLf
      End Try

      ' This code produces the following output:
      '
      ' First(query) : [EMPTY]
      ' Second query: An exception was thrown: Index was outside the bounds of the array.

            // 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();

            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 =
                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
            {
               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.
            */

Version Information

Silverlight

Supported in: 5, 4, 3

Silverlight for Windows Phone

Supported in: Windows Phone OS 7.1

Platforms

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