Язык программирования C#9 и платформа .NET5
Часть 462 из 642 Информация о книге
}Предыдущий запрос LINQ транслируется в тот же код SQL, что и ранее:
SELECT TOP(1) [c].[Id], [c].[TimeStamp], [c].[FirstName], [c].[FullName],[c].[LastName]FROM [Dbo].[Customers] AS [c]WHERE [c].[Id] = 10Использование Last()/LastOrDefault()
При использовании формы
иLast()без параметров будет возвращаться последняя запись (на основе предшествующих конструкций упорядочения). Показанный далее тест получает последнюю запись на основе порядка "фамилия, имя":LastOrDefault()[Fact]public void GetLastMatchingRecordNameOrder(){// Получить последнюю запись на основе порядка "фамилия, имя".var customer = Context.Customers<b> .OrderBy(x => x.PersonalInformation.LastName)</b><b> .ThenBy(x => x.PersonalInformation.FirstName)</b><b> .Last();</b>Assert.Equal(4, customer.Id);}Инфраструктура EF Core инвертирует операторы
и затем получает результат с помощьюORDER BY. Вот как выглядит выполняемый запрос:ТОР(1)SELECT TOP(1) [c].[Id], [c].[TimeStamp], [c].[FirstName], [c].[FullName],[c].[LastName]FROM [Dbo].[Customers] AS [c]ORDER BY [c].[LastName] DESC, [c].[FirstName] DESCИспользование Single()/SingleOrDefault()
Концептуально
работает аналогичноSingle()/SingleOrDefault(). Основное отличие в том, что методFirst()/FirstOrDefault()возвращаетSingle()/SingleOrDefault(), а неTOP(2), и генерирует исключение, если из базы данных возвращаются две записи. Следующий тест извлекает одиночную запись, в которой значениеТОР(1)равно 1:Id[Fact]public void GetOneMatchingRecordWithSingle(){// Получить первую запись на основе порядка в базе данных.<b> var customer = Context.Customers.Single(x => x.Id == 1);</b>Assert.Equal(1, customer.Id);}Предыдущий запрос LINQ транслируется в такой код SQL:
SELECT TOP(2) [c].[Id], [c].[TimeStamp], [c].[FirstName], [c].[FullName],[c].[LastName]FROM [Dbo].[Customers] AS [c]WHERE [c].[Id] = 1Если запись не возвращается, тогда метод
генерирует исключение:Single()[Fact]public void SingleShouldThrowExceptionIfNoneMatch(){// Фильтровать на основе Id.// Сгенерировать исключение, если соответствие не найдено.<b> Assert.Throws<InvalidOperationException>(()</b><b> => Context.Customers.Single(x => x.Id == 10));</b>}Предыдущий запрос LINQ транслируется в такой код SQL:
SELECT TOP(2) [c].[Id], [c].[TimeStamp], [c].[FirstName], [c].[FullName],[c].[LastName]FROM [Dbo].[Customers] AS [c]WHERE [c].[Id] = 10Если при использовании
илиSingle()возвращается больше чем одна запись, тогда генерируется исключение:SingleOrDefault()[Fact]public void SingleShouldThrowExceptionIfMoreThenOneMatch(){// Сгенерировать исключение, если найдено более одного соответствия.<b> Assert.Throws<InvalidOperationException>(()</b><b> => Context.Customers.Single());</b>}[Fact]public void SingleOrDefaultShouldThrowExceptionIfMoreThenOneMatch(){// Сгенерировать исключение, если найдено более одного соответствия.<b> Assert.Throws<InvalidOperationException>(()</b><b> => Context.Customers.SingleOrDefault());</b>}Предыдущий запрос LINQ транслируется в такой код SQL:
SELECT TOP(2) [c].[Id], [c].[TimeStamp], [c].[FirstName], [c].[FullName],[c].[LastName]FROM [Dbo].[Customers] AS [c]Если никакие данные не возвращаются в случае применения
, то результатом будетSingleOrDefault(), а не исключение:null[Fact]public void SingleOrDefaultShouldReturnDefaultIfNoneMatch(){