ORDER BY [c].[LastName] DESC, [c].[FirstName] DESC
Извлечение одиночной записи
Существуют три главных метода для возвращения одиночной записи посредством запроса:
First/FirstOrDefault
,
Last/LastOrDefault
и
Single/SingleOrDefault
. Хотя все они возвращают одиночную запись, принятые в них подходы отличаются. Методы и их варианты более подробно описаны ниже.
• Метод
First
возвращает первую запись, которая соответствует условию запроса и любым конструкциям
упорядочения. Если конструкции упорядочения не указаны, то возвращаемая запись основывается на порядке, установленном в базе данных. Если запись не возвращается, тогда генерируется исключение.
• Поведение метода
FirstOrDefault
совпадает с поведением
First
, но при отсутствии записей, соответствующих запросу,
FirstOrDefault
возвращает стандартное значение для типа (
null
).
• Метод
Single
возвращает первую запись, которая соответствует условию запроса и любым конструкциям упорядочения. Если конструкции упорядочения не указаны, то возвращаемая запись основывается на порядке, установленном в базе данных. Если запросу не соответствует одна или большее число записей, тогда генерируется исключение.
• Поведение метода
SingleOrDefault
совпадает с поведением
Single
, но при отсутствии записей, соответствующих запросу,
SingleOrDefault
возвращает стандартное значение для типа (
null
).
• Метод
Last
возвращает последнюю запись, которая соответствует условию запроса и любым конструкциям упорядочения. Если конструкции упорядочения не указаны, то возвращаемая запись основывается на порядке, установленном в базе данных. Если запись не возвращается, тогда генерируется исключение.
• Поведение метода
LastOrDefault
совпадает с поведением
Last
, но при отсутствии записей, соответствующих запросу,
LastOrDefault
возвращает стандартное значение для типа (
null
).
Все методы могут также принимать
Expression<Func<T, bool>>
(лямбда-выражение) для фильтрации результирующего набора. Это означает, что вы можете помещать выражение
Where
внутрь вызова
First/Single
. Следующие операторы эквивалентны:
Context.Customers.Where(c=>c.Id < 5).First;
Context.Customers.First(c=>c.Id < 5);
Из-за немедленного выполнения операторов LINQ, извлекающих одиночную запись, метод
ToQueryString
оказывается недоступным. Приводимые трансляции запросов в код SQL получены с применением профилировщика SQL Server.
Использование First/FirstOrDefault
При использовании формы
First
и
FirstOrDefault
без параметров будет возвращаться первая запись (на основе порядка в базе данных или предшествующих конструкций упорядочения).
Показанный далее тест получает первую запись на основе порядка в базе данных:
[Fact]
public void GetFirstMatchingRecordDatabaseOrder
{
//
Получить первую запись на основе порядка в базе данных.
var customer = Context.Customers.First;
Assert.Equal(1, customer.Id);
}
Предыдущий запрос LINQ транслируется в такой код SQL:
— это специальный тип утверждения, который ожидает, что код в выражении сгенерирует исключение. Если исключение не было сгенерировано, тогда утверждение терпит неудачу.
В случае применения метода
FirstOrDefault
, если соответствие не найдено, то результатом будет null, а не исключение: