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

{

  var carId = 1;

  var car = Context.Cars

    .FromSqlInterpolated($"Select * from dbo.Inventory where Id = {carId}")

    .Include(x => x.MakeNavigation)

    .First();

  Assert.Equal("Black", car.Color);

  Assert.Equal("VW", car.MakeNavigation.Name);

}

[Theory]

[InlineData(1, 1)]

[InlineData(2, 1)]

[InlineData(3, 1)]

[InlineData(4, 2)]

[InlineData(5, 3)]

[InlineData(6, 1)]

public void ShouldGetTheCarsByMakeUsingFromSql(int makeId, int expectedCount)

{

  var entity = Context.Model.FindEntityType($"{typeof(Car).FullName}");

  var tableName = entity.GetTableName();

  var schemaName = entity.GetSchema();

  var cars = Context.Cars.FromSqlRaw($"Select * from {schemaName}.{tableName}")

    .Where(x => x.MakeId == makeId).ToList();

  Assert.Equal(expectedCount, cars.Count);

}

Во время применения методов FromSqlRaw()/FromSqlInterpolated() действует ряд правил: столбцы, возвращаемые из оператора SQL, должны соответствовать столбцам в модели, должны возвращаться все столбцы для модели, а возвращать связанные данные не допускается.

<p id="AutBody_Root1043"><strong>Методы агрегирования</strong></p>

В EF Core также поддерживаются методы агрегирования серверной стороны (Мах(), Min(), Count(), Average() и т.д.). Вызовы методов агрегирования можно добавлять в конец запроса LINQ с вызовами Where() или же сам вызов метода агрегирования может содержать выражение фильтра (подобно First() и Single()). Агрегирование выполняется на серверной стороне и из запроса возвращается одиночное значение. Глобальные фильтры запросов оказывают воздействие на методы агрегирования и могут быть отключены с помощью IgnoreQueryFiltersсе(). В операторы SQL, показанные в этом разделе, были получены с использованием профилировщика SQL Server.

Первый тест (из CarTests.cs) просто подсчитывает все записи Car в базе данных. Из-за того, что фильтр запросов активен, результатом подсчета будет 9:

[Fact]

public void ShouldGetTheCountOfCars()

{

  var count = Context.Cars.Count();

  Assert.Equal(9, count);

}

Ниже приведен код SQL, который выполнялся:

The executed SQL is shown here:SELECT COUNT(*)

FROM [dbo].[Inventory] AS [i]

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

После добавления вызова IgnoreQueryFilters() метод Count() возвращает 10 и конструкция WHERE удаляется из запроса SQL:

[Fact]

public void ShouldGetTheCountOfCarsIgnoreQueryFilters()

{

  var count = Context.Cars.IgnoreQueryFilters().Count();

  Assert.Equal(10, count);

}

Вот сгенерированный код SQL:

SELECT COUNT(*) FROM [dbo].[Inventory] AS [i]

Следующие тесты (из CarTests.cs) демонстрируют метод Count() с условием WHERE. В первом тесте выражение добавляется прямо в вызов метода Count(), а во втором вызов метода Count() помещается в конец запроса LINQ:

[Theory]

[InlineData(1, 1)]

[InlineData(2, 1)]

[InlineData(3, 1)]

[InlineData(4, 2)]

[InlineData(5, 3)]

[InlineData(6, 1)]

public void ShouldGetTheCountOfCarsByMakeP1(int makeId, int expectedCount)

{

    var count = Context.Cars.Count(x=>x.MakeId == makeId);

    Assert.Equal(expectedCount, count);

}

[Theory]

[InlineData(1, 1)]

[InlineData(2, 1)]

[InlineData(3, 1)]

[InlineData(4, 2)]

[InlineData(5, 3)]

[InlineData(6, 1)]

public void ShouldGetTheCountOfCarsByMakeP2(int makeId, int expectedCount)

{

    var count = Context.Cars.Where(x => x.MakeId == makeId).Count();

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

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

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных