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]
public void ShouldGetAllOrdersExceptFiltered()
{
var query = Context.Orders.AsQueryable();
var qs = query.ToQueryString();
var orders = query.ToList();
Assert.NotEmpty(orders);
Assert.Equal(4,orders.Count);
}
Вот сгенерированный код SQL:
SELECT [o].[Id], [o].[CarId], [o].[CustomerId], [o].[TimeStamp]
FROM [Dbo].[Orders] AS [o]
INNER JOIN (
SELECT [i].[Id], [i].[IsDrivable]
FROM [dbo].[Inventory] AS [i]
WHERE [i].[IsDrivable] = CAST(1 AS bit)\r\n) AS [t]
ON [o].[CarId] = [t].[Id]
WHERE [t].[IsDrivable] = CAST(1 AS bit)