books-read.com
books-read.com » Компьютеры и Интернет » Базы данных » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

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

Наш ресурс дает возможность бесплатно читать книгу онлайн Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю. Жанр: Базы данных . Сайт books-read.com дает возможность читать полную версию книги без регистрации и sms. Все книги онлайн, не надо качать fb2, epub, txt.
Добавить книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю в приложение ЧИТАТЬ КНИГУ ОФЛАЙН в приложении ios/android
Перейти на страницу:

  // Expression<Func<Customer>> - это лямбда-выражение.

  Expression<Func<Customer, bool>> expression = x => x.Id == 10;

  // Возвращается null, когда ничего не найдено.

  var customer = Context.Customers.SingleOrDefault(expression);

  Assert.Null(customer);

}

Предыдущий запрос LINQ транслируется в такой код SQL:

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<Car>(entity =>

{

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

  ...

});

Откройте файл класса

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

[Fact]

public void ShouldReturnDrivableCarsWithQueryFilterSet()

{

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

Отключение глобальных фильтров запросов

Чтобы отключить глобальные фильтры запросов для сущностей в запросе, добавьте к запросу LINQ вызов метода

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

[Fact]

public void ShouldGetAllOfTheCars()

{

  IQueryable&lt;Car&gt; query = Context.Cars.<b>IgnoreQueryFilters()</b>;

  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&lt;Order&gt;().HasQueryFilter(e =&gt; 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)rn) AS [t]

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

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

Поскольку навигационное свойство

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

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

Троелсен Эндрю читать все книги автора по порядку

Троелсен Эндрю - на сайте онлайн книг books-read.com Вы можете читать полные версии книг автора в одном месте.


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

Отзывы читателей о книге Язык программирования C#9 и платформа .NET5, автор: Троелсен Эндрю. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор books-read.com


Прокомментировать
Подтвердите что вы не робот:*