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

Поскольку навигационное свойство CarNavigation является обязательным, механизм трансляции запросов использует конструкцию INNER JOIN, исключая записи Order, где Car соответствует неуправляемому автомобилю. Для возвращения всех записей добавьте в запрос LINQ вызов IgnoreQueryFilters().

<p id="AutBody_Root1037"><strong>Энергичная загрузка связанных данных</strong></p>

В предыдущей главе объяснялось, что сущности, которые связаны через навигационные свойства, могут создаваться в одном запросе с применением энергичной загрузки. Метод Include() указывает соединение со связанной сущностью, а метод ThenInclude() используется для последующих соединений. Оба метода будут задействованы в рассматриваемых далее тестах. Как упоминалось ранее, когда методы Include()/ThenInclude() транслируются в SQL, для обязательных отношений применяется внутреннее соединение, а для необязательных — левое соединение.

Поместите в файл класса CarTests.cs следующий тест, чтобы продемонстрировать одиночный вызов Include():

[Fact]

public void ShouldGetAllOfTheCarsWithMakes()

{

 IIncludableQueryable query =

  Context.Cars.Include(c => c.MakeNavigation);

  var queryString = query.ToQueryString();

  var cars = query.ToList();

  Assert.Equal(9, cars.Count);

}

Тест добавляет к результатам свойство MakeNavigation, выполняя внутреннее соединение с помощью показанного ниже кода SQL. Обратите внимание, что глобальный фильтр запросов действует:

SELECT [i].[Id], [i].[Color], [i].[IsDrivable], [i].[MakeId], [i].[PetName],

       [i].[TimeStamp], [m].[Id], [m].[Name], [m].[TimeStamp]

FROM [dbo].[Inventory] AS [i]

INNER JOIN [dbo].[Makes] AS [m] ON [i].[MakeId] = [m].[Id]

WHERE [i].[IsDrivable] = CAST(1 AS bit)

Во втором тесте используется два набора связанных данных. Первый — это получение информации Make (как и в предыдущем тесте), а второй — получение сущностей Order и затем присоединенных к ним сущностей Customer. Полный тест также отфильтровывает записи Car, для которых есть записи Order. Для необязательных отношений генерируются левые соединения:

[Fact]

public void ShouldGetCarsOnOrderWithRelatedProperties()

{

  IIncludableQueryable query = Context.Cars

    .Where(c => c.Orders.Any())

    .Include(c => c.MakeNavigation)

    .Include(c => c.Orders).ThenInclude(o => o.CustomerNavigation);

  var queryString = query.ToQueryString();

  var cars = query.ToList();

  Assert.Equal(4, cars.Count);

  cars.ForEach(c =>

  {

    Assert.NotNull(c.MakeNavigation);

    Assert.NotNull(c.Orders.ToList()[0].CustomerNavigation);

  });

}

Вот сгенерированный запрос:

SELECT [i].[Id], [i].[Color], [i].[IsDrivable], [i].[MakeId], [i].[PetName],

       [i].[TimeStamp], [m].[Id], [m].[Name], [m].[TimeStamp], [t0].[Id],

       [t0].[CarId], [t0].[CustomerId], [t0].[TimeStamp], [t0].[Id0],

       [t0].[TimeStamp0], [t0].[FirstName], [t0].[FullName],

    [t0].[LastName], [t0].[Id1]

FROM [dbo].[Inventory] AS [i]

     INNER JOIN [dbo].[Makes] AS [m] ON [i].[MakeId]=[m].[Id]

     LEFT JOIN(SELECT [o].[Id], [o].[CarId], [o].[CustomerId], [o].[TimeStamp],

        [c].[Id] AS [Id0], [c].[TimeStamp] AS [TimeStamp0],

        [c].[FirstName], [c].[FullName], [c].[LastName], [t].[Id] AS [Id1]

       FROM [dbo].[Orders] AS [o]

         INNER JOIN(SELECT [i0].[Id], [i0].[IsDrivable]

           FROM [dbo].[Inventory] AS [i0]

           WHERE [i0].[IsDrivable]=CAST(1 AS BIT)) AS [t] ON

                 [o].[CarId]=[t].[Id]

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

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

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

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

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

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

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

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

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