Как да използваме проекции в C #

Проекцията е операция, която преобразува резултатите от заявката. Можете да използвате проекция, за да трансформирате обект в нова форма, която има само тези свойства, необходими във вашето приложение. В тази статия ще разгледаме как можем да работим с проекции в C #.

За да работите с примерите за кодове, предоставени в тази статия, трябва да имате Visual Studio 2019 инсталиран във вашата система. Ако все още нямате копие, можете да изтеглите Visual Studio 2019 тук. 

Създайте проект за конзолно приложение в Visual Studio

Първо, нека създадем проект за приложение на конзола .NET Core в Visual Studio. Ако приемем, че Visual Studio 2019 е инсталиран във вашата система, следвайте стъпките, описани по-долу, за да създадете нов проект за приложение на .NET Core Console в Visual Studio.

  1. Стартирайте Visual Studio IDE.
  2. Кликнете върху „Създаване на нов проект“.
  3. В прозореца „Създаване на нов проект“ изберете „Console App (.NET Core)“ от показания списък с шаблони.
  4. Щракнете върху Напред.
  5. В показания след това прозорец „Конфигуриране на вашия нов проект“ посочете името и местоположението на новия проект.
  6. Щракнете върху Създаване.
  7. Това ще създаде нов проект за приложение на конзола .NET Core в Visual Studio 2019. Ще използваме този проект в следващите раздели на тази статия.

Какво е проекция в C #?

Проекцията се отнася до акта на трансформиране на обект в нова форма, така че новосъздаденият обект да съдържа само свойствата, които ще бъдат използвани. Езикова интегрирана заявка (LINQ) осигурява поддръжка за два стандартни оператора за проектиране на заявки, Select и SelectMany.

Можете да използвате операторите Select и SelectMany, за да проектирате едно свойство или да проектирате резултатите от заявка или да проектирате множество свойства от източник на данни в анонимен тип. Можете дори да извършвате изчисления, филтриране или всякакви други операции върху проекция, ако е необходимо.

В следващите раздели ще разгледаме как можем да работим с тези оператори в C #.

Проектирайте с помощта на оператора Select в C #

Напишете следния код във файла Program.cs.

публична класа Автор

{

    public int Id {get; комплект; }

    публичен низ FirstName {get; комплект; }

    публичен низ LastName {get; комплект; }

    публичен низ Адрес {get; комплект; }

    публичен автор (int id, низ firstName,

    низ lastName, низ адрес)

    {

        this.Id = id;

        this.FirstName = firstName;

        this.LastName = lastName;

        this.Address = адрес;

    }

}

Следният кодов фрагмент илюстрира как можете да се възползвате от оператора Select за заявка за данни.

var автори = нов списък

{

   нов автор (1, "Joydip", "Kanjilal", "Hyderabad, INDIA"),

   нов автор (2, "Anand", "Naraswamy", "Cochin, INDIA"),

   нов автор (3, "Стив", "Смит", "Охайо, САЩ"),

   нов автор (4, "Uday", "Denduluri", "London, UK")

};

foreach (име на var в авторите. Изберете (e => e.FirstName))

{

   Console.WriteLine (име);

}

Когато изпълните кодовия фрагмент по-горе, имената на всички автори ще се покажат в прозореца на конзолата.

Проектирайте към анонимни типове в C #

Можете да проектирате повече от едно свойство от източник на данни, дори можете да проектирате и към анонимен тип. Следният кодов фрагмент илюстрира как можете да проектирате множество свойства в анонимен тип.

var данни = автори.Изберете (e => ново {e.FirstName, e.LastName});

Проектирайте с помощта на оператора SelectMany в C #

Можете да се възползвате от оператора SelectMany за заявки за данни от колекция, която реализира интерфейса IEnumerable. Можете да използвате оператора SelectMany, когато искате да поискате данни от няколко колекции и да ги проектирате или изравните в една последователност.

Имайте предвид, че и Select, и SelectMany произвеждат резултат от изходни стойности. Докато Select генерира един резултат от всяка стойност на източника, SelectMany създава обединена подколекция от всяка стойност на източника.

Нека сега включим допълнително свойство в класа Author на име Subjects. Това свойство е списък с низове, които съдържат имената на предметите, за които авторът пише книги.

публична класа Автор

    {

        public int Id {get; комплект; }

        публичен низ FirstName {get; комплект; }

        публичен низ LastName {get; комплект; }

        публичен низ Адрес {get; комплект; }

        публичен списък Субекти {get; комплект; }

        публичен автор (int id, низ firstName, низ lastName,

        низ адрес, списък на теми)

        {

            this.Id = id;

            this.FirstName = firstName;

            this.LastName = lastName;

            this.Address = адрес;

            this.Subjects = предмети;

        }

    }

Можете да използвате следния кодов фрагмент, за да създадете списък с автори.

var автори = нов списък

{

    нов автор (1, "Joydip", "Kanjilal", "Hyderabad, INDIA",

    нов списък {"C #", "F #"}),

    нов автор (2, "Anand", "Naraswamy", "Cochin, INDIA", 

    нов списък {"C #", "VB.NET"}),

    нов автор (3, "Стив", "Смит", "Охайо, САЩ", 

    нов списък {"C #", "C ++"}),

    нов автор (4, "Uday", "Denduluri", "London, UK", 

    нов списък {"C #", "VB.NET"}),

    нов автор (5, "Jane", "Barlow", "London, UK", 

    нов списък {"C #", "C ++"})

 };

И можете да използвате кодовия фрагмент по-долу, за да извлечете имената на програмните езици, за които авторите пишат книги.

var данни = автори.SelectMany (a => a.Subjects) .Distinct ();

foreach (вариращ обект в данните)

{

    Console.WriteLine (тема);

}

Използвайте оператора Where за филтриране на данните за резултатите в C #

Можете да приложите оператора Where след SelectMany, за да филтрирате резултата. Следният кодов фрагмент, когато се изпълнява, показва FirstName и Subject на автора, чието FirstName започва със знака „J“ и се намира във Великобритания

var данни = автори

.Къде (a => a.Address.IndexOf ("UK")> = 0)

.SelectMany (a => a.Subjects, (a, Subject) => new {a.FirstName, Subject})

.Where (n => n.FirstName.StartsWith ("J"));

foreach (var автор в данни)

{

    Console.WriteLine (автор);

}

Когато изпълните горния кодов фрагмент, трябва да видите изхода в прозореца на конзолата, както е показано на изображението на екрана по-долу.

Проекциите могат да се използват при работа с EF Core, така че можете да извлечете само колоните от основната база данни, от която се нуждаете за вашето приложение. В бъдеща статия тук ще обсъдя някои усъвършенствани операции, използващи проекции като проекции едно към много, филтриране на резултати и подреждане.