LoveRead.info » Книги » Разная литература » Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

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

Книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!

178 0 18:04, 26-08-2023
Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
26 август 2023

Книга Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен читать онлайн бесплатно без регистрации

В 10-м издании книги описаны новейшие возможности языка C# 9 и .NET 5 вместе с подробным "закулисным" обсуждением, призванным расширить навыки критического мышления разработчиков, когда речь идет об их ремесле. Книга охватывает ASP.NET Core, Entity Framework Core и многое другое наряду с последними обновлениями унифицированной платформы .NET, начиная с улучшений показателей производительности настольных приложений Windows в .NET 5 и обновления инструментария XAML и заканчивая расширенным рассмотрением файлов данных и способов обработки данных. Все примеры кода были переписаны с учетом возможностей последнего выпуска C# 9.

    1 ... 299 300 301 302 303 304 305 306 307 ... 407
    Перейти на страницу:
    приводимых далее тестах) и для управления фильтрами запросов (как показано в следующем разделе). Чтобы выполнить запрос и загрузить запись (записи), вызовите метод Load() на результате метода Collection(), Reference() или Query(). Выполнение запроса начнется немедленно после вызова Load().

    Представленный ниже тест (из CarTests.cs) демонстрирует, каким образом загрузить связанные данные через навигационное свойство типа ссылки внутри сущности Car:

    [Fact]

    public void ShouldGetReferenceRelatedInformationExplicitly()

    {

      var car = Context.Cars.First(x => x.Id == 1);

      Assert.Null(car.MakeNavigation);

      var query = Context.Entry(car).Reference(c => c.MakeNavigation).Query();

      var qs = query.ToQueryString();

      query.Load();

      Assert.NotNull(car.MakeNavigation);

    }

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

    DECLARE @__p_0 int = 1;

    SELECT [m].[Id], [m].[Name], [m].[TimeStamp]

    FROM [dbo].[Makes] AS [m]

    WHERE [m].[Id] = @__p_0

    В следующем тесте показано, как загрузить связанные данные через навигационное свойство типа коллекции внутри сущности Car:

    [Fact]

    public void ShouldGetCollectionRelatedInformationExplicitly()

    {

      var car = Context.Cars.First(x => x.Id == 1);

      Assert.Empty(car.Orders);

      var query = Context.Entry(car).Collection(c => c.Orders).Query();

      var qs = query.ToQueryString();

      query.Load();

      Assert.Single(car.Orders);

    }

    Сгенерированный код SQL выглядит так:

    DECLARE @__p_0 int = 1;

    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)

    ) AS [t] ON [o].[CarId] = [t].[Id]

    WHERE ([t].[IsDrivable] = CAST(1 AS bit)) AND ([o].[CarId] = @__p_0)

    Явная загрузка связанных данных с фильтрами запросов

    Глобальные фильтры запросов активны не только при формировании запросов, генерируемых для энергичной загрузки связанных данных, но и при явной загрузке связанных данных. Добавьте (в MakeTests.cs) приведенный далее тест:

    [Theory]

    [InlineData(1,1)]

    [InlineData(2,1)]

    [InlineData(3,1)]

    [InlineData(4,2)]

    [InlineData(5,3)]

    [InlineData(6,1)]

    public void ShouldGetAllCarsForAMakeExplicitlyWithQueryFilters(

        int makeId, int carCount)

    {

      var make = Context.Makes.First(x => x.Id == makeId);

      IQueryable<Car> query = Context.Entry(make).Collection(c => c.Cars).Query();

      var qs = query.ToQueryString();

      query.Load();

      Assert.Equal(carCount,make.Cars.Count());

    }

    Этот тест похож на тест ShouldGetTheCarsByMake() из раздела "Фильтрация записей" ранее в главе. Однако вместо того, чтобы просто получить записи Car, которые имеют определенное значение MakeId, текущий тест сначала получает запись Make и затем явно загружает записи Car для находящейся в памяти записи Make. Ниже показан сгенерированный код SQL:

    DECLARE @__p_0 int = 5;

    SELECT [i].[Id], [i].[Color], [i].[IsDrivable], [i].[MakeId],

           [i].[PetName], [i].[TimeStamp]

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

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

    Обратите внимание на то, что фильтр запросов по-прежнему применяется, хотя главной сущностью в запросе является запись Make. Для отключения фильтров запросов при явной загрузке записей вызовите IgnoreQueryFilters() в сочетании с методом Query(). Вот тест, который отключает фильтры запросов (находится в MakeTests.cs):

    [Theory]

    [InlineData(1, 2)]

    [InlineData(2, 1)]

    [InlineData(3, 1)]

    [InlineData(4, 2)]

    [InlineData(5, 3)]

    [InlineData(6, 1)]

    public void ShouldGetAllCarsForAMakeExplicitly(int makeId, int carCount)

    {

      var make = Context.Makes.First(x => x.Id == makeId);

      IQueryable<Car> query =

        Context.Entry(make).Collection(c => c.Cars).Query().IgnoreQueryFilters();

      var qs = query.IgnoreQueryFilters().ToQueryString();

      query.Load();

      Assert.Equal(carCount, make.Cars.Count());

    }

    Выполнение запросов SQL с помощью LINQ

    Если оператор LINQ для отдельного запроса слишком сложен или тестирование показывает, что производительность оказалась ниже, чем желаемая, тогда данные можно извлекать с использованием низкоуровневого оператора SQL через метод FromSqlRaw() или FromSqlInterpolated() класса DbSet<T>. Оператором SQL может быть встроенный оператор SELECT языка Т-SQL, хранимая процедура или табличная функция. Если запрос является открытым (например, оператор Т-SQL без завершающей точки с запятой), тогда операторы LINQ можно добавлять к вызову метода FromSqlRaw()/FromSqlInterpolated() для дальнейшего определения генерируемого запроса. Полный запрос выполняется на серверной стороне с объединением оператора SQL и кода SQL, сгенерированного операторами LINQ.

    Если оператор завершен или содержит код SQL, который не может быть достроен (скажем, задействует общие табличные выражения), то такой запрос все равно выполняется на серверной стороне, но любая дополнительная фильтрация и обработка должна делаться на клиентской стороне как LINQ to Objects. Метод FromSqlRaw() выполняет запрос в том виде, в котором он набран. Метод FromSqlInterpolated() применяет интерполяцию строк C# и помещает интерполированные значения в параметры. В следующих тестах (из CarTests.cs) демонстрируются примеры использования обоих методов с глобальными фильтрами запросов и без них:

    [Fact]

    public void ShouldNotGetTheLemonsUsingFromSql()

    {

      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}")

        .ToList();

      Assert.Equal(9, cars.Count);

    }

    [Fact]

    public void ShouldGetTheCarsUsingFromSqlWithIgnoreQueryFilters()

    {

      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}")

        .IgnoreQueryFilters().ToList();

      Assert.Equal(10, cars.Count);

    }

    [Fact]

    public void ShouldGetOneCarUsingInterpolation()

    {

      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, должны соответствовать столбцам в модели, должны возвращаться все столбцы для модели, а возвращать связанные данные не допускается.

    Методы агрегирования

    В EF Core также поддерживаются методы агрегирования серверной стороны (Мах(), Min(), Count(),

    1 ... 299 300 301 302 303 304 305 306 307 ... 407
    Перейти на страницу:
    1. Жалоба
    Отзывы - 0

    Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.


    Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

    • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
    • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
    • 3. Просьба отказаться от нецензурной лексики.
    • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

    Надеемся на Ваше понимание и благоразумие. С уважением, администратор LoveRead.info.


    Установить VPN и читай слушай бесплатно

    Новые отзывы

    1. Людмила Хофман Людмила Хофман10 июнь 22:13 У меня перевернулся мир после прочтения ваших книг! Так приятно и чисто на душе, ведь по сути неважно кто с кем , а только любовь... Долгая игра - Рейчел Рид
    2. Анна Анна08 июнь 11:28 Спасибо за новую историю жизни и любви на сайте,прочитала с удовольствием .... Давай поженимся - Юлия Резник
    3. Елена Елена08 июнь 11:13 Прочла несколько романов этого, без сомнения, талантливого автора. Впечатление прекрасное, но хотелось бы когда-нибудь прочесть... Предатель. Ты врал мне годами - Арина Арская
    Все комметарии
    Новинки бесплатной онлайн библиотеки