Многие демонстрируемые здесь методы имеют асинхронные версии. Синтаксис запросов LINQ структурно одинаков, поэтому будут использоваться только синхронные версии.

<p id="AutBody_Root1023"><strong>Состояние сущности</strong></p>

Когда сущность создается за счет чтения данных из базы, значение EntityState устанавливается в Unchanged.

<p id="AutBody_Root1024"><strong>Запросы LINQ</strong></p>

Тип коллекции DbSet реализует (помимо прочих) интерфейс IQueryable, что позволяет применять команды LINQ языка C# для создания запросов, извлекающих информацию из базы данных. Наряду с тем, что все операторы LINQ языка C# доступны для использования с типом коллекции DbSet, некоторые операторы LINQ могут не поддерживаться поставщиком баз данных, а в EF Core появились дополнительные операторы LINQ. Неподдерживаемый оператор LINQ, который невозможно транслировать в язык запросов поставщика баз данных, приведет к генерации исключения времени выполнения, если только он не является последним в цепочке операторов LINQ. Когда неподдерживаемый оператор LINQ находится в самом конце цепочки LINQ, он выполнится на клиентской стороне (в коде С#).

На заметку! Настоящая книга не задумывалась как полный справочник по LINQ, так что в ней приводится не особо много примеров. С дополнительными примерами запросов LINQ можно ознакомиться по ссылке https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b.

<p id="AutBody_Root1025"><strong>Выполнение запросов LINQ</strong></p>

Вспомните, что при использовании LINQ для запрашивания из базы данных списка сущностей запрос не выполняется до тех пор, пока не начнется проход по результатам запроса, пока запрос не будет преобразован в List (или объект) либо же пока не произойдет привязка запроса к списковому элементу управления (вроде сетки данных). Запрос единственной записи выполняется немедленно в случае применения вызова First, Single и т.д.

Нововведением версии EF Core 5 стало то, что в большинстве запросов LINQ можно вызывать метод ToQueryString для исследования запроса, который выполняется в отношении базы данных. Для разделяемых запросов метод ToQueryString возвращает только первый запрос, который будет выполняться. В рассматриваемых далее тестах это значение по возможности присваивается переменной (qs), чтобы вы могли изучить запрос во время отладки тестов.

Первый набор тестов (если только специально не указано иначе) находится в файле класса CustomerTests.cs.

<p id="AutBody_Root1026"><strong>Получение всех записей</strong></p>

Чтобы получить все записи из таблицы, просто используйте свойство DbSet на прямую без каких-либо операторов LINQ. Добавьте приведенный ниже тест [Fact]:

[Fact]

public void ShouldGetAllOfTheCustomers

{

  var qs = Context.Customers.ToQueryString;

  var customers = Context.Customers.ToList;

  Assert.Equal(5, customers.Count);

}

Выделенный полужирным оператор транслируется в следующий код SQL:

SELECT [c].[Id], [c].[TimeStamp], [c].[FirstName], [c].[FullName],

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

Тот же самый процесс применяется для сущностей без ключей, подобных модели представления CustomerOrderViewModel, которая сконфигурирован на получение своих данных из представления CustomerOrderView:

modelBuilder.Entity.HasNoKey

  .ToView("CustomerOrderView", "dbo");

Экземпляр DbSet для моделей представлений предлагает всю мощь запросов DbSet для сущности с ключом. Отличие касается возможностей обновления. Изменения модели представления не могут быть сохранены в базе данных, тогда как изменения сущностей с ключами — могут. Добавьте в файл класса OrderTest.cs показанный далее тест, чтобы продемонстрировать получение данных из представления:

public void ShouldGetAllViewModels

{

  var qs = Context.Orders.ToQueryString;

  var orders = Context.Orders.ToList;

   Assert.NotEmpty(orders);

  Assert.Equal(5,orders.Count);

}

Выделенный полужирным оператор транслируется в следующий код SQL:

SELECT [c].[Color], [c].[FirstName], [c].[IsDrivable], [c].[LastName],

       [c].[Make], [c].[PetName] FROM [dbo].[CustomerOrderView] AS [c]

<p id="AutBody_Root1027"><strong>Фильтрация записей</strong></p>
Перейти на страницу:

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