Шрифт:
Интервал:
Закладка:
{
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<CustomerOrderViewModel>().HasNoKey()
.ToView("CustomerOrderView", "dbo");
Экземпляр DbSet<T> для моделей представлений предлагает всю мощь запросов DbSet<T> для сущности с ключом. Отличие касается возможностей обновления. Изменения модели представления не могут быть сохранены в базе данных, тогда как изменения сущностей с ключами — могут. Добавьте в файл класса 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]
Фильтрация записей
Метод 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>
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})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" (нечувствительно к регистру символов), и именем, начинающимся с буквы "М" (нечувствительно к регистру символов), а также демонстрирует объединение вызовов Where() в цепочку в запросе LINQ:
[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]
- Понимание SQL - Мартин Грубер - Базы данных