Язык программирования C#9 и платформа .NET5
{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:CustomerOrderViewmodelBuilder.Entity<CustomerOrderViewModel>().HasNoKey().ToView("CustomerOrderView", "dbo");Экземпляр
для моделей представлений предлагает всю мощь запросовDbSet<T>для сущности с ключом. Отличие касается возможностей обновления. Изменения модели представления не могут быть сохранены в базе данных, тогда как изменения сущностей с ключами — могут. Добавьте в файл классаDbSet<T>показанный далее тест, чтобы продемонстрировать получение данных из представления:OrderTest.cspublic 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]Фильтрация записей
Метод
используется для фильтрации записей изWhere(). Несколько вызововDbSet<T>можно плавно объединять в цепочку для динамического построения запроса. Выстроенные в цепочку вызовыWhere()всегда объединяются с помощью операции "И". Для объединения условий с применением операции "ИЛИ" необходимо использовать один вызовWhere().Where()Приведенный ниже тест возвращает заказчиков с фамилией, начинающейся с буквы "W" (нечувствительно к регистру символов):
[Fact]public void ShouldGetCustomersWithLastNameW(){IQueryable<Customer> query = Context.Customers<b> .Where(x => x.PersonalInformation.LastName.StartsWith("W"));</b>var qs = query.ToQueryString();List<Customer> customers = query.ToList();Assert.Equal(2, customers.Count);}Запрос LINQ транслируется в следующий код SQL:
SELECT [c].[Id], [c].[TimeStamp], [c].[FirstName], [c].[FullName],[c].[LastName]FROM [Dbo].[Customers] AS [c]WHERE [c].[LastName] IS NOT NULL AND ([c].[LastName] LIKE N'W%')Показанный далее тест возвращает заказчиков с фамилией, начинающейся с буквы "W" (нечувствительно к регистру символов), и именем, начинающимся с буквы "М" (нечувствительно к регистру символов), а также демонстрирует объединение вызовов
в цепочку в запросе LINQ:Where()[Fact]public void ShouldGetCustomersWithLastNameWAndFirstNameM(){IQueryable<Customer> query = Context.Customers<b> .Where(x => x.PersonalInformation.LastName.StartsWith("W"))</b><b> .Where(x => x.PersonalInformation.FirstName.StartsWith("M"));</b>var qs = query.ToQueryString();List<Customer> customers = query.ToList();Assert.Single(customers);}Следующий тест возвращает заказчиков с фамилией, начинающейся с буквы "W" (нечувствительно к регистру символов), и именем, начинающимся с буквы "М" (нечувствительно к регистру символов), с применением единственного вызова
:Where()[Fact]public void ShouldGetCustomersWithLastNameWAndFirstNameM(){IQueryable<Customer> query = Context.Customers<b> .Where(x => x.PersonalInformation.LastName.StartsWith("W") &&</b><b> x.PersonalInformation.FirstName.StartsWith("M"));</b>var qs = query.ToQueryString();List<Customer> customers = query.ToList();Assert.Single(customers);}Оба запроса транслируются в такой код SQL:
SELECT [c].[Id], [c].[TimeStamp], [c].[FirstName], [c].[FullName],[c].[LastName]FROM [Dbo].[Customers] AS [c]