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

Если связанные данные нужно загрузить сразу после того, как главная сущность была запрошена в память, то связанные сущности можно извлечь из базы данных с помощью последующих обращений к базе данных. Это запускается с применением метода Entry() класса, производного от DbContext. При загрузке сущностей на стороне "многие" отношения "один ко многим" используйте вызов метода Collection() на результате Entry(). Чтобы загрузить сущности на стороне "один" отношения "один ко многим" (или отношения "один к одному"), применяйте метод Reference(). Вызов метода Query() на результате Collection() или Reference() возвращает экземпляр реализации IQueryable, который можно использовать для получения строки запроса (как видно в приводимых далее тестах) и для управления фильтрами запросов (как показано в следующем разделе). Чтобы выполнить запрос и загрузить запись (записи), вызовите метод Load() на результате метода Collection(), Reference() или Query(). Выполнение запроса начнется немедленно после вызова Load().

Представленный ниже тест (из CarTests.cs) демонстрирует, каким образом загрузить связанные данные через навигационное свойство типа ссылки внутри сущности Car:

[Fact]

public void ShouldGetReferenceRelatedInformationExplicitly()

{

  var car = Context.Cars.First(x => x.Id == 1);

  Assert.Null(car.MakeNavigation);

  var query = Context.Entry(car).Reference(c => c.MakeNavigation).Query();

  var qs = query.ToQueryString();

  query.Load();

  Assert.NotNull(car.MakeNavigation);

}

Вот сгенерированный код SQL:

DECLARE @__p_0 int = 1;

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

FROM [dbo].[Makes] AS [m]

WHERE [m].[Id] = @__p_0

В следующем тесте показано, как загрузить связанные данные через навигационное свойство типа коллекции внутри сущности Car:

[Fact]

public void ShouldGetCollectionRelatedInformationExplicitly()

{

  var car = Context.Cars.First(x => x.Id == 1);

  Assert.Empty(car.Orders);

  var query = Context.Entry(car).Collection(c => c.Orders).Query();

  var qs = query.ToQueryString();

  query.Load();

  Assert.Single(car.Orders);

}

Сгенерированный код SQL выглядит так:

DECLARE @__p_0 int = 1;

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)

) AS [t] ON [o].[CarId] = [t].[Id]

WHERE ([t].[IsDrivable] = CAST(1 AS bit)) AND ([o].[CarId] = @__p_0)

<p id="AutBody_Root1041"><strong>Явная загрузка связанных данных с фильтрами запросов</strong></p>

Глобальные фильтры запросов активны не только при формировании запросов, генерируемых для энергичной загрузки связанных данных, но и при явной загрузке связанных данных. Добавьте (в MakeTests.cs) приведенный далее тест:

[Theory]

[InlineData(1,1)]

[InlineData(2,1)]

[InlineData(3,1)]

[InlineData(4,2)]

[InlineData(5,3)]

[InlineData(6,1)]

public void ShouldGetAllCarsForAMakeExplicitlyWithQueryFilters(

    int makeId, int carCount)

{

  var make = Context.Makes.First(x => x.Id == makeId);

  IQueryable query = Context.Entry(make).Collection(c => c.Cars).Query();

  var qs = query.ToQueryString();

  query.Load();

  Assert.Equal(carCount,make.Cars.Count());

}

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

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

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

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

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

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

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

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

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