Читаем Язык программирования C#9 и платформа .NET5 полностью

SELECT TOP(1) [c].[Id], [c].[TimeStamp], [c].[FirstName], [c].[FullName],

              [c].[LastName] FROM [Dbo].[Customers] AS [c]

WHERE [c].[Id] = 10

<p id="AutBody_Root1034"><strong>Глобальные фильтры запросов</strong></p>

Вспомните о наличии для сущности Car глобального фильтра запросов, который отбрасывает данные об автомобилях со значением свойства IsDrivable, равным false:

modelBuilder.Entity(entity =>

{

  entity.HasQueryFilter(c => c.IsDrivable);

  ...

});

Откройте файл класса CarTests.cs и добавьте показанный далее тест (все тесты в последующих разделах находятся в СаrTests.cs, если не указано иначе):

[Fact]

public void ShouldReturnDrivableCarsWithQueryFilterSet()

{

  IQueryable query = Context.Cars;

  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().

<p id="AutBody_Root1035"><strong>Отключение глобальных фильтров запросов</strong></p>

Чтобы отключить глобальные фильтры запросов для сущностей в запросе, добавьте к запросу LINQ вызов метода IgnoreQueryFilters(). Он заблокирует все фильтры для всех сущностей в запросе. Если есть несколько сущностей с глобальными фильтрами запросов и некоторые фильтры сущностей нужны, тогда потребуется поместить их в методы Where() оператора LINQ. Добавьте в файл класса CarTests.cs приведенный ниже тест, который отключает фильтр запросов и возвращает все записи:

[Fact]

public void ShouldGetAllOfTheCars()

{

  IQueryable query = Context.Cars.IgnoreQueryFilters();

  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]

<p id="AutBody_Root1036"><strong>Фильтры запросов для навигационных свойств</strong></p>

Помимо глобального фильтра запросов для сущности Car был добавлен фильтр запросов к свойству CarNavigation сущности Order:

modelBuilder.Entity().HasQueryFilter(e => e.CarNavigation!.IsDrivable);

Чтобы увидеть его в действии, добавьте в файл класса 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)

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных