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)\r\n) AS [t]
ON [o].[CarId] = [t].[Id]
WHERE [t].[IsDrivable] = CAST(1 AS bit)
Поскольку навигационное свойство CarNavigation
INNER JOIN, исключая записи Order, где Car соответствует неуправляемому автомобилю. Для возвращения всех записей добавьте в запрос LINQ вызов IgnoreQueryFilters.Энергичная загрузка связанных данных
В предыдущей главе объяснялось, что сущности, которые связаны через навигационные свойства, могут создаваться в одном запросе с применением энергичной загрузки. Метод Include
ThenInclude используется для последующих соединений. Оба метода будут задействованы в рассматриваемых далее тестах. Как упоминалось ранее, когда методы Include/ThenInclude транслируются в SQL, для обязательных отношений применяется внутреннее соединение, а для необязательных — левое соединение.Поместите в файл класса CarTests.cs
Include:[Fact]
public void ShouldGetAllOfTheCarsWithMakes
{
IIncludableQueryable
Context.Cars.Include(c => c.MakeNavigation)
var queryString = query.ToQueryString;
var cars = query.ToList;
Assert.Equal(9, cars.Count);
}
Тест добавляет к результатам свойство MakeNavigation
SELECT [i].[Id], [i].[Color], [i].[IsDrivable], [i].[MakeId], [i].[PetName],
[i].
[TimeStamp], [m].[Id], [m].[Name], [m].[TimeStamp]FROM [dbo].[Inventory] AS [i]
INNER JOIN [dbo].[Makes] AS [m] ON [i].[MakeId] = [m].[Id]
WHERE [i].[IsDrivable] = CAST(1 AS bit)
Во втором тесте используется два набора связанных данных. Первый — это получение информации Make
Order и затем присоединенных к ним сущностей Customer. Полный тест также отфильтровывает записи Car, для которых есть записи Order. Для необязательных отношений генерируются левые соединения:[Fact]
public void ShouldGetCarsOnOrderWithRelatedProperties
{
IIncludableQueryable
.Where(c => c.Orders.Any)
.Include(c => c.MakeNavigation)
.Include(c => c.Orders).ThenInclude(o => o.CustomerNavigation);
var queryString = query.ToQueryString;
var cars = query.ToList;
Assert.Equal(4, cars.Count);
cars.ForEach(c =>
{
Assert.NotNull(c.MakeNavigation);
Assert.NotNull(c.Orders.ToList[0].CustomerNavigation);
});
}
Вот сгенерированный запрос:
SELECT [i].[Id], [i].[Color], [i].[IsDrivable], [i].[MakeId], [i].[PetName],
[i].
[TimeStamp], [m].[Id], [m].[Name], [m].[TimeStamp], [t0].[Id], [t0].[CarId], [t0].[CustomerId], [
t0].[TimeStamp], [t0].[Id0], [t0].[TimeStamp0], [t0].[FirstName], [t0].[FullName],
[t0].[LastName], [t0].[Id1]
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT