// Сгенерировать исключение, если найдено более одного соответствия.
Assert.Throws
=> Context.Customers.SingleOrDefault);
}
Предыдущий запрос 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
{
// Expression
Expression
// Возвращается null, когда ничего не найдено.
var customer = Context.Customers.SingleOrDefault(expression);
Assert.Null(customer);
}
Предыдущий запрос LINQ транслируется в такой код SQL:
SELECT TOP(1) [c].[Id], [c].[TimeStamp], [c].[FirstName], [c].[FullName],
[c].[LastName]
FROM [Dbo].[Customers] AS [c]WHERE [c].[Id] = 10
Глобальные фильтры запросов
Вспомните о наличии для сущности Car
IsDrivable, равным false:modelBuilder.Entity
{
entity.HasQueryFilter(c => c.IsDrivable);
...
});
Откройте файл класса CarTests.cs
СаrTests.cs, если не указано иначе):[Fact]
public void ShouldReturnDrivableCarsWithQueryFilterSet
{
IQueryable
var qs = query.ToQueryString;
var cars = query.ToList;
Assert.NotEmpty(cars);
Assert.Equal(9, cars.Count);
}
Также вспомните, что в процессе инициализации данных были созданы 10 записей об автомобилях,из которых один установлен как неуправляемый. При запуске запроса применяется глобальный фильтр запросов и выполняется следующий код SQL:
SELECT [i].[Id], [i].[Color], [i].[IsDrivable], [i].[MakeId], [i].[PetName],
[i].[TimeStamp]
FROM [dbo].[Inventory] AS [i]WHERE [i].[IsDrivable] = CAST(1 AS bit)
На заметку!
Как вскоре будет показано, глобальные фильтры запросов также применяются при загрузке связанных сущностей и при использовании методовFromSqlRaw и FromSqlInterpolated.Отключение глобальных фильтров запросов
Чтобы отключить глобальные фильтры запросов для сущностей в запросе, добавьте к запросу LINQ вызов метода IgnoreQueryFilters
Where оператора LINQ. Добавьте в файл класса CarTests.cs приведенный ниже тест, который отключает фильтр запросов и возвращает все записи:[Fact]
public void ShouldGetAllOfTheCars
{
IQueryable
var qs = query.ToQueryString;
var cars = query.ToList;
Assert.Equal(10, cars.Count);
}
Как и можно было ожидать, в сгенерированном коде SQL больше нет конструкции WHERE
SELECT [i].[Id], [i].[Color], [i].[IsDrivable], [i].[MakeId], [i].[PetName],
[i].[TimeStamp]
FROM [dbo].[Inventory] AS [i]Фильтры запросов для навигационных свойств
Помимо глобального фильтра запросов для сущности Car
CarNavigation сущности Order:modelBuilder.Entity
Чтобы увидеть его в действии, добавьте в файл класса OrderTests.cs
[Fact]
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT