Queryable.SingleOrDefault Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Возвращает один, конкретный элемент последовательности или значение по умолчанию, если такой элемент не найден.
Перегрузки
SingleOrDefault<TSource>(IQueryable<TSource>, TSource) |
Возвращает единственный элемент последовательности или значение по умолчанию, если последовательность пуста; этот метод создает исключение, если в последовательности существует несколько элементов. |
SingleOrDefault<TSource>(IQueryable<TSource>, Expression<Func<TSource,Boolean>>, TSource) |
Возвращает единственный элемент последовательности, удовлетворяющий указанному условию или значению по умолчанию, если такой элемент не существует; Этот метод создает исключение, если несколько элементов удовлетворяют условию. |
SingleOrDefault<TSource>(IQueryable<TSource>) |
Возвращает единственный элемент последовательности или значение по умолчанию, если последовательность пуста; этот метод создает исключение, если в последовательности существует несколько элементов. |
SingleOrDefault<TSource>(IQueryable<TSource>, Expression<Func<TSource,Boolean>>) |
Возвращает единственный элемент последовательности, удовлетворяющий указанному условию или значению по умолчанию, если такой элемент не существует; Этот метод создает исключение, если несколько элементов удовлетворяют условию. |
SingleOrDefault<TSource>(IQueryable<TSource>, TSource)
- Исходный код:
- Queryable.cs
- Исходный код:
- Queryable.cs
- Исходный код:
- Queryable.cs
Возвращает единственный элемент последовательности или значение по умолчанию, если последовательность пуста; этот метод создает исключение, если в последовательности существует несколько элементов.
public:
generic <typename TSource>
[System::Runtime::CompilerServices::Extension]
static TSource SingleOrDefault(System::Linq::IQueryable<TSource> ^ source, TSource defaultValue);
public static TSource SingleOrDefault<TSource> (this System.Linq.IQueryable<TSource> source, TSource defaultValue);
static member SingleOrDefault : System.Linq.IQueryable<'Source> * 'Source -> 'Source
<Extension()>
Public Function SingleOrDefault(Of TSource) (source As IQueryable(Of TSource), defaultValue As TSource) As TSource
Параметры типа
- TSource
Тип элементов source
.
Параметры
- source
- IQueryable<TSource>
IEnumerable<T> для возврата одного элемента.
- defaultValue
- TSource
Значение по умолчанию, возвращаемое, если последовательность пуста.
Возвращаемое значение
Один элемент входной последовательности или defaultValue
, если последовательность не содержит элементов.
Исключения
source
null
.
Входная последовательность содержит несколько элементов.
Применяется к
SingleOrDefault<TSource>(IQueryable<TSource>, Expression<Func<TSource,Boolean>>, TSource)
- Исходный код:
- Queryable.cs
- Исходный код:
- Queryable.cs
- Исходный код:
- Queryable.cs
Возвращает единственный элемент последовательности, удовлетворяющий указанному условию или значению по умолчанию, если такой элемент не существует; Этот метод создает исключение, если несколько элементов удовлетворяют условию.
public:
generic <typename TSource>
[System::Runtime::CompilerServices::Extension]
static TSource SingleOrDefault(System::Linq::IQueryable<TSource> ^ source, System::Linq::Expressions::Expression<Func<TSource, bool> ^> ^ predicate, TSource defaultValue);
public static TSource SingleOrDefault<TSource> (this System.Linq.IQueryable<TSource> source, System.Linq.Expressions.Expression<Func<TSource,bool>> predicate, TSource defaultValue);
static member SingleOrDefault : System.Linq.IQueryable<'Source> * System.Linq.Expressions.Expression<Func<'Source, bool>> * 'Source -> 'Source
<Extension()>
Public Function SingleOrDefault(Of TSource) (source As IQueryable(Of TSource), predicate As Expression(Of Func(Of TSource, Boolean)), defaultValue As TSource) As TSource
Параметры типа
- TSource
Тип элементов source
.
Параметры
- source
- IQueryable<TSource>
IEnumerable<T>, из который возвращается один элемент.
- predicate
- Expression<Func<TSource,Boolean>>
Функция для тестирования элемента для условия.
- defaultValue
- TSource
Значение по умолчанию, возвращаемое, если последовательность пуста.
Возвращаемое значение
Один элемент входной последовательности, удовлетворяющий условию, или defaultValue
, если такой элемент не найден.
Исключения
source
или predicate
null
.
Несколько элементов удовлетворяют условию в predicate
.
Применяется к
SingleOrDefault<TSource>(IQueryable<TSource>)
- Исходный код:
- Queryable.cs
- Исходный код:
- Queryable.cs
- Исходный код:
- Queryable.cs
Возвращает единственный элемент последовательности или значение по умолчанию, если последовательность пуста; этот метод создает исключение, если в последовательности существует несколько элементов.
public:
generic <typename TSource>
[System::Runtime::CompilerServices::Extension]
static TSource SingleOrDefault(System::Linq::IQueryable<TSource> ^ source);
public static TSource SingleOrDefault<TSource> (this System.Linq.IQueryable<TSource> source);
public static TSource? SingleOrDefault<TSource> (this System.Linq.IQueryable<TSource> source);
static member SingleOrDefault : System.Linq.IQueryable<'Source> -> 'Source
<Extension()>
Public Function SingleOrDefault(Of TSource) (source As IQueryable(Of TSource)) As TSource
Параметры типа
- TSource
Тип элементов source
.
Параметры
- source
- IQueryable<TSource>
IQueryable<T> для возврата одного элемента.
Возвращаемое значение
Один элемент входной последовательности или default
(TSource
), если последовательность не содержит элементов.
Исключения
source
null
.
source
имеет несколько элементов.
Примеры
В следующем примере кода показано, как использовать SingleOrDefault<TSource>(IQueryable<TSource>) для выбора единственного элемента массива. Второй запрос демонстрирует, что SingleOrDefault<TSource>(IQueryable<TSource>) возвращает значение по умолчанию, если последовательность не содержит ровно одного элемента.
// Create two arrays. The second is empty.
string[] fruits1 = { "orange" };
string[] fruits2 = { };
// Get the only item in the first array, or else
// the default value for type string (null).
string fruit1 = fruits1.AsQueryable().SingleOrDefault();
Console.WriteLine("First Query: " + fruit1);
// Get the only item in the second array, or else
// the default value for type string (null).
string fruit2 = fruits2.AsQueryable().SingleOrDefault();
Console.WriteLine("Second Query: " +
(String.IsNullOrEmpty(fruit2) ? "No such string!" : fruit2));
/*
This code produces the following output:
First Query: orange
Second Query: No such string!
*/
' Create two arrays. The second is empty.
Dim fruits1() As String = {"orange"}
Dim fruits2() As String = {}
' Get the only item in the first array, or else
' the default value for type string (null).
Dim fruit1 As String = fruits1.AsQueryable().SingleOrDefault()
MsgBox("First Query: " + fruit1)
' Get the only item in the second array, or else
' the default value for type string (null).
Dim fruit2 As String = fruits2.AsQueryable().SingleOrDefault()
MsgBox("Second Query: " & _
IIf(String.IsNullOrEmpty(fruit2), "No such string!", fruit2))
' This code produces the following output:
' First Query: orange
' Second Query: No such string!
Иногда значение default(TSource)
не является значением по умолчанию, которое требуется использовать, если коллекция не содержит элементов. Вместо проверки результата для нежелательного значения по умолчанию и изменения его при необходимости можно использовать метод DefaultIfEmpty<TSource>(IQueryable<TSource>, TSource), чтобы указать значение по умолчанию, которое необходимо использовать, если коллекция пуста. Затем вызовите Single<TSource>(IQueryable<TSource>), чтобы получить элемент. В следующем примере кода используются оба метода для получения значения по умолчанию 1, если коллекция номеров страниц пуста. Так как значение по умолчанию для целого числа равно 0, которое обычно не является допустимым номером страницы, значение по умолчанию должно быть указано как 1. Первая переменная результата проверяется на нежелательное значение по умолчанию после завершения запроса. Вторая переменная результата получается путем вызова DefaultIfEmpty<TSource>(IQueryable<TSource>, TSource) для указания значения по умолчанию 1.
int[] pageNumbers = { };
// Setting the default value to 1 after the query.
int pageNumber1 = pageNumbers.AsQueryable().SingleOrDefault();
if (pageNumber1 == 0)
{
pageNumber1 = 1;
}
Console.WriteLine("The value of the pageNumber1 variable is {0}", pageNumber1);
// Setting the default value to 1 by using DefaultIfEmpty() in the query.
int pageNumber2 = pageNumbers.AsQueryable().DefaultIfEmpty(1).Single();
Console.WriteLine("The value of the pageNumber2 variable is {0}", pageNumber2);
/*
This code produces the following output:
The value of the pageNumber1 variable is 1
The value of the pageNumber2 variable is 1
*/
Dim pageNumbers() As Integer = {}
' Setting the default value to 1 after the query.
Dim pageNumber1 As Integer = pageNumbers.AsQueryable().SingleOrDefault()
If pageNumber1 = 0 Then
pageNumber1 = 1
End If
MsgBox(String.Format("The value of the pageNumber1 variable is {0}", pageNumber1))
' Setting the default value to 1 by using DefaultIfEmpty() in the query.
Dim pageNumber2 As Integer = pageNumbers.AsQueryable().DefaultIfEmpty(1).Single()
MsgBox(String.Format("The value of the pageNumber2 variable is {0}", pageNumber2))
' This code produces the following output:
' The value of the pageNumber1 variable is 1
' The value of the pageNumber2 variable is 1
Комментарии
Метод SingleOrDefault<TSource>(IQueryable<TSource>) создает MethodCallExpression, который представляет вызов SingleOrDefault<TSource>(IQueryable<TSource>) себя в качестве созданного универсального метода. Затем он передает MethodCallExpression методу Execute<TResult>(Expression)IQueryProvider, представленному свойством Provider параметра source
.
Поведение запроса, возникающее в результате выполнения дерева выражений, представляющего вызов SingleOrDefault<TSource>(IQueryable<TSource>), зависит от реализации типа параметра source
. Ожидаемое поведение заключается в том, что он возвращает единственный элемент в source
или значение по умолчанию, если source
пусто.
Метод SingleOrDefault не предоставляет способ указания значения по умолчанию. Если вы хотите указать значение по умолчанию, отличное от default(TSource)
, используйте метод DefaultIfEmpty<TSource>(IQueryable<TSource>, TSource), как описано в разделе "Пример".
Применяется к
SingleOrDefault<TSource>(IQueryable<TSource>, Expression<Func<TSource,Boolean>>)
- Исходный код:
- Queryable.cs
- Исходный код:
- Queryable.cs
- Исходный код:
- Queryable.cs
Возвращает единственный элемент последовательности, удовлетворяющий указанному условию или значению по умолчанию, если такой элемент не существует; Этот метод создает исключение, если несколько элементов удовлетворяют условию.
public:
generic <typename TSource>
[System::Runtime::CompilerServices::Extension]
static TSource SingleOrDefault(System::Linq::IQueryable<TSource> ^ source, System::Linq::Expressions::Expression<Func<TSource, bool> ^> ^ predicate);
public static TSource SingleOrDefault<TSource> (this System.Linq.IQueryable<TSource> source, System.Linq.Expressions.Expression<Func<TSource,bool>> predicate);
public static TSource? SingleOrDefault<TSource> (this System.Linq.IQueryable<TSource> source, System.Linq.Expressions.Expression<Func<TSource,bool>> predicate);
static member SingleOrDefault : System.Linq.IQueryable<'Source> * System.Linq.Expressions.Expression<Func<'Source, bool>> -> 'Source
<Extension()>
Public Function SingleOrDefault(Of TSource) (source As IQueryable(Of TSource), predicate As Expression(Of Func(Of TSource, Boolean))) As TSource
Параметры типа
- TSource
Тип элементов source
.
Параметры
- source
- IQueryable<TSource>
IQueryable<T>, из который возвращается один элемент.
- predicate
- Expression<Func<TSource,Boolean>>
Функция для тестирования элемента для условия.
Возвращаемое значение
Один элемент входной последовательности, удовлетворяющий условию в predicate
или default
(TSource
), если такой элемент не найден.
Исключения
source
или predicate
null
.
Несколько элементов удовлетворяют условию в predicate
.
Примеры
В следующем примере кода показано, как использовать SingleOrDefault<TSource>(IQueryable<TSource>, Expression<Func<TSource,Boolean>>) для выбора единственного элемента массива, удовлетворяющего условию. Второй запрос демонстрирует, что SingleOrDefault<TSource>(IQueryable<TSource>, Expression<Func<TSource,Boolean>>) возвращает значение по умолчанию, если последовательность не содержит ровно одного элемента, удовлетворяющего условию.
string[] fruits = { "apple", "banana", "mango",
"orange", "passionfruit", "grape" };
// Get the single string in the array whose length is greater
// than 10, or else the default value for type string (null).
string fruit1 =
fruits.AsQueryable().SingleOrDefault(fruit => fruit.Length > 10);
Console.WriteLine("First Query: " + fruit1);
// Get the single string in the array whose length is greater
// than 15, or else the default value for type string (null).
string fruit2 =
fruits.AsQueryable().SingleOrDefault(fruit => fruit.Length > 15);
Console.WriteLine("Second Query: " +
(String.IsNullOrEmpty(fruit2) ? "No such string!" : fruit2));
/*
This code produces the following output:
First Query: passionfruit
Second Query: No such string!
*/
Dim fruits() As String = _
{"apple", "banana", "mango", "orange", "passionfruit", "grape"}
' Get the single string in the array whose length is greater
' than 10, or else the default value for type string (null).
Dim fruit1 As String = _
fruits.AsQueryable().SingleOrDefault(Function(fruit) fruit.Length > 10)
' Display the result.
MsgBox("First Query: " & fruit1)
' Get the single string in the array whose length is greater
' than 15, or else the default value for type string (null).
Dim fruit2 As String = _
fruits.AsQueryable().SingleOrDefault(Function(fruit) fruit.Length > 15)
MsgBox("Second Query: " & _
IIf(String.IsNullOrEmpty(fruit2), "No such string!", fruit2))
' This code produces the following output:
' First Query: passionfruit
' Second Query: No such string!
Комментарии
Этот метод имеет по крайней мере один параметр типа Expression<TDelegate> аргумент типа, аргумент типа которого является одним из Func<T,TResult> типов. Для этих параметров можно передать лямбда-выражение и скомпилировать его в Expression<TDelegate>.
Метод SingleOrDefault<TSource>(IQueryable<TSource>, Expression<Func<TSource,Boolean>>) создает MethodCallExpression, который представляет вызов SingleOrDefault<TSource>(IQueryable<TSource>, Expression<Func<TSource,Boolean>>) себя в качестве созданного универсального метода. Затем он передает MethodCallExpression методу Execute<TResult>(Expression)IQueryProvider, представленному свойством Provider параметра source
.
Поведение запроса, возникающее в результате выполнения дерева выражений, представляющего вызов SingleOrDefault<TSource>(IQueryable<TSource>, Expression<Func<TSource,Boolean>>), зависит от реализации типа параметра source
. Ожидаемое поведение заключается в том, что он возвращает единственный элемент в source
, который удовлетворяет условию, заданному predicate
, или значение по умолчанию, если такой элемент не существует.