Queryable.DefaultIfEmpty<TSource> Method (IQueryable<TSource>, TSource)
Microsoft Silverlight will reach end of support after October 2021. Learn more.
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
- 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.
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.