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

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

    Assert.Equal(expectedCount, count);

}


Оба теста создают те же самые обращения SQL к серверу (в каждом тесте значение для MakeId изменяется на основе [InlineData]):


exec sp_executesql N'SELECT COUNT(*)

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

WHERE ([i].[IsDrivable] = CAST(1 AS bit)) AND ([i].[MakeId] = @__makeId_0)'

,N'@__makeId_0 int',@__makeId_0=6

Any и All

Методы Any и All проверяют набор записей, чтобы выяснить, соответствует ли критериям любая запись (Any) или же все записи (Аll). Как и вызовы методов агрегирования, их можно добавлять в конец запроса LINQ с вызовами Where либо же помещать выражение фильтрации в сам вызов метода. Методы Any и All выполняются на серверной стороне, а из запроса возвращается булевское значение. Глобальные фильтры запросов оказывают воздействие на методы Any и All; их можно отключить с помощью IgnoreQueryFilters.

Все операторы SQL, показанные в этом разделе, были получены с применением профилировщика SQL Server. Первый тест (из CarTests.cs) проверяет, имеет ли любая запись Car специфическое значение MakeId:


[Theory]

[InlineData(1, true)]

[InlineData(11, false)]

public void ShouldCheckForAnyCarsWithMake(int makeId, bool expectedResult)

{

  var result = Context.Cars.Any(x => x.MakeId == makeId);

  Assert.Equal(expectedResult, result);

}


Для первого теста [Theory] выполняется следующий код SQL:


exec sp_executesql N'SELECT CASE

  WHEN EXISTS (

    SELECT 1

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

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

      AND ([i].[MakeId] = @__makeId_0)) THEN

    CAST(1 AS bit)

   ELSE CAST(0 AS bit)

END',N'@__makeId_0 int',@__makeId_0=1


Второй тест проверяет, имеют ли все записи Car специфическое значение MakeId:


[Theory]

[InlineData(1, false)]

[InlineData(11, false)]

public void ShouldCheckForAllCarsWithMake(int makeId, bool expectedResult)

{

  var result = Context.Cars.All(x => x.MakeId == makeId);

  Assert.Equal(expectedResult, result);

}


Вот код SQL, выполняемый для второго теста [Theory]:


exec sp_executesql N'SELECT CASE

  WHEN NOT EXISTS (

    SELECT 1

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

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

      AND ([i].[MakeId] <> @__makeId_0)) THEN

    CAST(1 AS bit)

  ELSE CAST(0 AS bit)

END',N'@__makeId_0 int',@__makeId_0=1

Получение данных из хранимых процедур

Последний шаблон извлечения данных, который необходимо изучить, предусматривает получение данных из хранимых процедур. Несмотря на некоторые пробелы EF Core в плане работы с хранимыми процедурами (по сравнению с EF 6), не забывайте, что инфраструктура EF Core построена поверх ADO.NET. Нужно просто спуститься на уровень ниже и вспомнить, как вызывались хранимые процедуры до появления инструментов объектно-реляционного отображения. Показанный далее метод в CarRepo создает обязательные параметры (входной и выходной), задействует свойство Database экземпляра ApplicationDbContext и вызывает ExecuteSqlRaw:


public string GetPetName(int id)

{

  var parameterId = new SqlParameter

    {

    ParameterName = "@carId",

    SqlDbType = System.Data.SqlDbType.Int,

    Value = id,

  };


  var parameterName = new SqlParameter

  {

    ParameterName = "@petName",

    SqlDbType = System.Data.SqlDbType.NVarChar,

    Size = 50,

    Direction = ParameterDirection.Output

  };


  var result = Context.Database

    .ExecuteSqlRaw("EXEC [dbo].[GetPetName] @carId, @petName OUTPUT",

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

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

Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT
97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Нил Форд , Билл де Ора , Майкл Хайгард

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT