LINQ (англ. Language Integrated Query - запити, інтегровані в мову) - компонент Microsoft .NET Framework, який додає нативні можливості виконання запитів даних до мов, що входять у .NET. Хоча порти існують для PHP (PHPLinq), JavaScript(linq.js), TypeScript (linq.ts), і ActionScript (ActionLinq), - жоден з них не є абсолютно еквівалентним LINQ в C# (де LINQ - не просто додаткова бібліотека, а частина мови).
LINQ розширює можливості мови, додаючи до неї вирази запитів, що є схожими на твердження SQL та можуть бути використані для зручного отримання та обробки даних масивів, XML документів, реляційних баз даних та сторонніх джерел. LINQ також визначає набір імен методів (що називаються стандартними операторами запитів, або стандартними операторами послідовностей), а також правила перекладу, що має використовувати компілятор для перекладу текучих виразів у звичайні, використовуючи їх назву, лямбда-вирази та [en].
Багато концептів, що представлені у LINQ, були спершу випробувані у дослідницькому проєкті Microsoft Cω. LINQ був випущений як частина .NET Framework 3.5 19 листопада 2007 року.
Архітектура LINQ в .NET Framework
Стандартні оператори запитів
Далі описано роботу операторів з колекціями. Багато операторів приймають у якості аргументу функції. Ці функції можуть бути представлені як у вигляді іменованого методу, так і анонімної функції.
Набір операторів запитів, що визначені в LINQ, надається користувачу у вигляді API. Оператори запитів, що підтримуються API:
Select
Даний оператор виконує проєкцію на колекцію, щоб отримати необхідні члени елементів. Користувач передає у якості параметру довільну функцію у вигляді лямбда-виразу, що проєктує члени даного об'єкту. Функція передається до оператора у вигляді делегату.
Where
Оператор Where дозволяє визначити набір предикатів, що виконуються над кожним елементом колекції та відкидає елементи, що не підпадають під задану умову з результуючого набору. Предикат передається до оператора у вигляді делегату.
SelectMany
SelectMany використовується для створення вихідної колекції згідно заданої користувачем проєкції з вхідних колекцій.
Sum / Min / Max / Average
Дані оператори можуть приймаюти функцію, яка співставляє кожне значення колекції з певним числом, після чого можна знайти їх суму, мінімальне, максимальне, або середнє значення. Перевантажені версії даних методів не приймають функцій на вхід, а виконують відповідні дії над самими елементами колекції.
Aggregate
Узагальнений оператор Sum / Min / Max. Він приймає у якості аргументу функцію, що вказує яким чином треба поєднати два елементи, щоб утворити проміжний, або кінцевий результат. Додатково можна задати початкове значення. Крім цього, можна задати завершальну функцію, що перетворить результат агрегації на фінальне значення.
Join / GroupJoin
Оператор Join виконує inner join щодо двох колекцій, орієнтуючись на співпадаючі ключі для об'єктів з обидвох колекцій. Він приймає дві функції у вигляді делегатів, по одній для кожної колекції, а потім застосовує їх до кожного елемента відповідної колекції, щоб отримати їх ключі. Він також отримує інший делегат, у якому користувач вказує які члени вхідних об'єктів повинні міститися у результуючому наборі. Оператор GroupJoin виконує group join. Так як і оператор Select, результати з'єднання є екземплярами класу, чиї поля збігаються з полями вхідних об'єктів, або є їх підммножиною.
Take / TakeWhile
Оператор Take повертає перші n елементів колекції, тоді як TakeWhile повертає не більше n перших послідовних елементів, що підпадають під умови предикату.
Skip / SkipWhile
Аналогічно до Take та TakeWhile, дані оператори відповідно пропускають перші n елементів, або не більше n перших послідовних елементів, що відповідають предикату.
OfType
Використовується для отримання елементів певного типу.
Concat
Даний оператор конкатенує дві колекції.
OrderBy / ThenBy
Оператор OrderBy дозволяє задати порядок сортування елементів в колекції по певному ключу. За умовчанням сортування відбувається у порядку зростання. Для сортування по спаданню, треба використовувати оператор OrderByDescending. ThenBy and ThenByDescending дозволяють задати правила сортування підпослідовностей. Сортування відбувається по ключу, що користувач передав в якості делегату.
Reverse
Даний оператор повертає елементи колекції в зворотньому порядку.
GroupBy
Оператор GroupBy приймає у якості параметру функцію, що по певному ключу повертає колекцію об'єктів IGrouping<Key, Values>
для кожного унікального значення ключа. Об'єкти IGrouping
можна використати для перечислення всіх елементів з певним ключем.
Distinct
Оператор вилучає дублікати елементів з колекції. Перевантажена версія оператору приймає у якості аргументу об'єкт, що здійснює перевірку елементів на рівність.
Union / Intersect / Except
Дані оператори використовуються, щоб виконати операції об'єднання, перетину та різниці над двома послідовностями. Кожен з них має перевантажену версію, що приймає об'єкт, який перевіряє на рівність елементи колекцій.
SequenceEqual
SequenceEqual визначає чи усі елементи колекцій, що знаходяться на однаковій позиції, є рівними.
First / FirstOrDefault / Last / LastOrDefault
Дані оператори отримують предикат у якості аргументу. Оператор First повертає перший елемент колекції, що підпадає під умову. Якщо ж такого елемента не існує, викидається виключення. Оператор FirstOrDefault діє так само як First, але замість виключення повертає значення за умовчанням відповідного типу. Оператори Last та LastOrDefault виконують аналогічні операції, але з останніми підходящими елементами у колекції.
Single / SingleOrDefault
Оператор Single отримує предикат у якості аргументу та повертає єдиний елемент, що задовольняє предикат. Якщо ж таких елементів більше, ніж один, або немає взагалі, викидається виключення. При використанні SingleOrDefault, якщо жоден елемент у колекції не відповідає предикату, то замість виключення, повертається значення типу за умовчанням. В усіх інших випадках діє так само, як і Single.
ElementAt
Даний оператор повертає елемент, що має відповідний індекс у колекції.
Any / All
Оператор Any перевіряє чи хоча б один елемент у колекції відповідає предикату та повертає відповідне булеве значення. Виклик Any без предикату поверне істину, якщо в колекції є хоча б один елемент. Оператор All перевіряє чи відповідні предикату абсолютно всі елементи колекції.
Contains
Перевіряє чи колекція містить шуканий елемент.
Count
Підраховує кількість елементів у даній колекції. Перевантажений варіант приймає предикат у якості аргументу та рахує кількість елементів, що відповідають предикату.
Стандартне API операторів запитів також надає можливість конвертації колекцій до іншого типу:
- AsEnumerable: статично типізує колекцію як
IEnumerable<T>
. - AsQueryable: статично типізує колекцію як
IQueryable<T>
. - ToArray: створює масив типу
T[]
з вхідної колекції. - ToList: створює колекцію типу
List<T>
з вхідної колекції. - ToDictionary: створює колекцію типу
Dictionary<K, T>
з вхідної колекції, з індексами типу K. Користувач передає у якості аргументу функцію проєкції, що повертає ключ для кожного об'єкту. - ToLookup: створює колекцію типу
Lookup<K, T>
з вхідної колекції, з індексами типуK
. Користувач передає у якості аргументу функцію проєкції, що повертає ключ для кожного об'єкту. - Cast: конвертує неузагальнену колекцію типу
IEnumerable
в узагальненуIEnumerable<T>
. В іншому випадку - конвертує узагальнену колекцію з одним параметром типу в колекцію з іншим параметром. Наприклад,IEnumerable<T>
вIEnumerable<R>
, приводячи кожен елемент типуT
до елементу типуR
. В разі, якщо хоча б один елемент колекції не може бути приведений до необхідного типу, викидається виключення. - OfType: конвертує неузагальнену колекцію типу
IEnumerable
в узагальненуIEnumerable<T>
. В іншому випадку - конвертує узагальнену колекцію з одним параметром типу в колекцію з іншим параметром. Наприклад,IEnumerable<T>
вIEnumerable<R>
, намагаючись привести кожен елемент типуT
до елементу типуR
. У результуючій колекції будуть знаходитися лише ті елементи, що були успішно сконвертовані.
Розширення мови
З появою LINQ, до мов програмування також був доданий синтаксичний цукор, щоб полегшити написання запитів. Дані розширення включають в себе такі:
- Синтаксис запитів: розробники мови програмування мають змогу обрати будь-який зручний синтаксис. Ці ключові слова повинні перекладатися компілятором до відповідних викликів методів LINQ.
- Неявно типізовані змінні: дане покращення дозволило оголошувати змінні без явного зазначення їх типів. Починаючи з C# 3.0 стало можливим використовувати ключове слово
var
. У VB9.0 для цього існує ключове словоDim
. Такі об'єкти є строго типізованими. - Анонімні типи: анонімні типи дозволяють компілятору автоматично створювати та опрацьовувати класи, що містять лише оголошення полів. Це є зручним для таких операторів, як Select та Join, результат виконання яких часто відрізняється від вхідних типів. Компілятор використовує інтерфейси типів для визначення полів, що мають міститися у вихідному класі і генерує до них методи доступу та зміни для них.
- Ініціалізатор об'єкту: ініціалізатори об'єктів дозволяють створювати та ініціалізувати поля об'єкту в одній області видимості, що можна використовувати в операторах Join та Select.
- Лямбда вирази: лямбда вирази дозволяють створювати компактні предикати, або функції проєкції. Вони передаються у функції у вигляді делегатів, або дерев виразів, залежно від провайдера запитів.
Наприклад, у запиті, що повертає всі об'єкти зі значенням SomeProperty
меншим, ніж 10, типи змінних result та results виводяться компілятором, відповідно до сигнатур використаних методів:
var results = from c in SomeCollection where c.SomeProperty < 10 select new {c.SomeProperty, c.OtherProperty}; foreach (var result in results) { Console.WriteLine(result); }
Аналогічний запит також можна подати у наступному вигляді:
var results = SomeCollection .Where(c => c.SomeProperty < 10) .Select(c => new {c.SomeProperty, c.OtherProperty}); results.ForEach(x => {Console.WriteLine(x.ToString());})
Провайдери LINQ
LINQ надає можливість працювати з різними джерелами даних. Для цього існують провайдери. Будь-який розробник може написати власний провайдер для LINQ.
LINQ to Objects
Провайдер LINQ to Objects використовується для колекцій, що знаходяться в пам'яті та застосовує для їх обробки локальний функціонал LINQ. Код, згенерований даним провайдером, реалізує архітектурний шаблон Sequence і дозволяє локально виконувати операції над колекціями IEnumerable<T>
. Поточна реалізація LINQ to Objects перевіряє які інтерфейси реалізовані у типі, що входить до колекції, щоб використати їх для швидкого виконання тих, чи інших запитів, якщо вони підтримуються типом під час виконання.
LINQ to XML
Провайдер LINQ to XML конвертує XML документ в колекцію об'єктів XElement
, над якою виконується запит, використовуючи локальний функціонал LINQ.
LINQ to SQL
Провайдер LINQ to SQL дозволяє виконувати запити до бази даних Microsoft SQL Server. Оскільки дані, що зберігаються у SQL Server, зазвичай знаходяться на іншому сервері та SQL Server має свій власний функціонал по виконанню запитів, LINQ to SQL не використовує локальні можливості LINQ. Замість цього, вирази LINQ перекладаються у запити на мові SQL та відправляються до SQL Server, який обробляє ці запити та повертає результат, якщо необхідно. Однак, оскільки SQL Server є реляційною базою даних, а LINQ працює з об'єктами мови програмування, необхідно співставити відповідні дані. Для цього LINQ to SQL також реалізує спеціальний фреймворк. Співставлення відбувається, оголошуючи класи, які є аналогами таблиць у базі даних і містять в собі всі атрибути таблиці, або їх підмножину. Відповідність між полями класу та атрибутами у таблиці встановлюється через атрибути. Наприклад,
[Table(Name="Customers")] public class Customer { [Column(IsPrimaryKey = true)] public int CustID; [Column] public string CustName; }
Даний клас співставляється з таблицею Customers
та містить в собі 2 поля, що відповідають двом колонкам таблиці.
LINQ to DataSets
Оскільки провайдер LINQ to SQL працює лише з SQL Server, для підтримки інших баз даних створено LINQ to DataSets. Даний провайдер використовує можливості ADO.NET для встановлення комунікації з базою даних. LINQ to DataSets виконує запити над даними, що містяться в наборах даних ADO.NET.
PLINQ
Починаючи з четвертої версії, .NET Framework включає в себе PLINQ (Parallel LINQ), що реалізує виконання LINQ запитів паралельно. Будь-який клас, що реалізує інтерфейс IEnumerable<T>
, може скористатися перевагами PLINQ, викликавши метод розширення AsParallel<T>(this IEnumerable<T>)
, що визначений у класі ParallelEnumerable простору імен System.Linq. PLINQ може виконувати частини запиту одночасно в різних потоках, що дозволяє отримати результат швидше.
Попередники
Багато концепцій, які були введені в LINQ, спочатку були випробувані в науково-дослідному проекті Microsoft Cω, раніше відомому під кодовими іменами X# (X шарп) та Xen. Його перейменували на Cω після того як в нього було інтегровано іншу дослідницьку мову Polyphonic C# на основі [en].
Cω намагається зробити сховища даних (такі як бази даних та XML документи) доступними з такою ж легкістю і безпекою типів як традиційні типи даних на зразок рядки та масиви. Багато цих ідей були успадковані від попереднього проекту інкубації в команді WebData XML під назвою X# та Xen. Cω також включає нові конструкції для підтримки конкурентного програмування; ці особливості в основному були отримані з попереднього проекту Polyphonic C#.
Вперше доступні в 2004, функції Cω були використані Microsoft при створенні LINQ, випущеного в 2007 в .NET версії 3.5 Примітиви конкурентності також випущені в дещо модифікованій формі в [en], для C# та інших .NET мов від Microsoft Research.
Примітки
- . docs.microsoft.com (en-us) . Архів оригіналу за 7 травня 2018. Процитовано 6 травня 2018.
- . docs.microsoft.com (en-us) . Архів оригіналу за 7 травня 2018. Процитовано 6 травня 2018.
- . msdn.microsoft.com (en-us) . Архів оригіналу за 7 травня 2018. Процитовано 6 травня 2018.
- . docs.microsoft.com (en-us) . Архів оригіналу за 7 травня 2018. Процитовано 6 травня 2018.
- . docs.microsoft.com (en-us) . Архів оригіналу за 7 травня 2018. Процитовано 6 травня 2018.
- . docs.microsoft.com (en-us) . Архів оригіналу за 5 квітня 2018. Процитовано 6 травня 2018.
- . docs.microsoft.com (en-us) . Архів оригіналу за 7 травня 2018. Процитовано 6 травня 2018.
- . docs.microsoft.com (en-us) . Архів оригіналу за 7 травня 2018. Процитовано 6 травня 2018.
- Eichert, Steve; Wooley, James B.; Marguerie, Fabrice (2008). LINQ in Action. Manning. с. 56-57 (as reported in the Google Books search link - the book does not have page numbers). ISBN .
- Concepts behind the C# 3.0 language | Articles | TomasP.Net [ 2007-02-12 у Wayback Machine.]
- The Joins Concurrency Library. Процитовано 8 червня 2007.
Посилання
- Програма для інтерактивного написання та тестування запитів LINQ [ 5 травня 2018 у Wayback Machine.]
- Підручник LINQ [ 13 серпня 2021 у Wayback Machine.]
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
LINQ angl Language Integrated Query zapiti integrovani v movu komponent Microsoft NET Framework yakij dodaye nativni mozhlivosti vikonannya zapitiv danih do mov sho vhodyat u NET Hocha porti isnuyut dlya PHP PHPLinq JavaScript linq js TypeScript linq ts i ActionScript ActionLinq zhoden z nih ne ye absolyutno ekvivalentnim LINQ v C de LINQ ne prosto dodatkova biblioteka a chastina movi LINQ rozshiryuye mozhlivosti movi dodayuchi do neyi virazi zapitiv sho ye shozhimi na tverdzhennya SQL ta mozhut buti vikoristani dlya zruchnogo otrimannya ta obrobki danih masiviv XML dokumentiv relyacijnih baz danih ta storonnih dzherel LINQ takozh viznachaye nabir imen metodiv sho nazivayutsya standartnimi operatorami zapitiv abo standartnimi operatorami poslidovnostej a takozh pravila perekladu sho maye vikoristovuvati kompilyator dlya perekladu tekuchih viraziv u zvichajni vikoristovuyuchi yih nazvu lyambda virazi ta en Bagato konceptiv sho predstavleni u LINQ buli spershu viprobuvani u doslidnickomu proyekti Microsoft Cw LINQ buv vipushenij yak chastina NET Framework 3 5 19 listopada 2007 roku Arhitektura LINQ v NET FrameworkStandartni operatori zapitiv Dali opisano robotu operatoriv z kolekciyami Bagato operatoriv prijmayut u yakosti argumentu funkciyi Ci funkciyi mozhut buti predstavleni yak u viglyadi imenovanogo metodu tak i anonimnoyi funkciyi Nabir operatoriv zapitiv sho viznacheni v LINQ nadayetsya koristuvachu u viglyadi API Operatori zapitiv sho pidtrimuyutsya API Select Danij operator vikonuye proyekciyu na kolekciyu shob otrimati neobhidni chleni elementiv Koristuvach peredaye u yakosti parametru dovilnu funkciyu u viglyadi lyambda virazu sho proyektuye chleni danogo ob yektu Funkciya peredayetsya do operatora u viglyadi delegatu Where Operator Where dozvolyaye viznachiti nabir predikativ sho vikonuyutsya nad kozhnim elementom kolekciyi ta vidkidaye elementi sho ne pidpadayut pid zadanu umovu z rezultuyuchogo naboru Predikat peredayetsya do operatora u viglyadi delegatu SelectMany SelectMany vikoristovuyetsya dlya stvorennya vihidnoyi kolekciyi zgidno zadanoyi koristuvachem proyekciyi z vhidnih kolekcij Sum Min Max Average Dani operatori mozhut prijmayuti funkciyu yaka spivstavlyaye kozhne znachennya kolekciyi z pevnim chislom pislya chogo mozhna znajti yih sumu minimalne maksimalne abo serednye znachennya Perevantazheni versiyi danih metodiv ne prijmayut funkcij na vhid a vikonuyut vidpovidni diyi nad samimi elementami kolekciyi Aggregate Uzagalnenij operator Sum Min Max Vin prijmaye u yakosti argumentu funkciyu sho vkazuye yakim chinom treba poyednati dva elementi shob utvoriti promizhnij abo kincevij rezultat Dodatkovo mozhna zadati pochatkove znachennya Krim cogo mozhna zadati zavershalnu funkciyu sho peretvorit rezultat agregaciyi na finalne znachennya Join GroupJoin Operator Join vikonuye inner join shodo dvoh kolekcij oriyentuyuchis na spivpadayuchi klyuchi dlya ob yektiv z obidvoh kolekcij Vin prijmaye dvi funkciyi u viglyadi delegativ po odnij dlya kozhnoyi kolekciyi a potim zastosovuye yih do kozhnogo elementa vidpovidnoyi kolekciyi shob otrimati yih klyuchi Vin takozh otrimuye inshij delegat u yakomu koristuvach vkazuye yaki chleni vhidnih ob yektiv povinni mistitisya u rezultuyuchomu nabori Operator GroupJoin vikonuye group join Tak yak i operator Select rezultati z yednannya ye ekzemplyarami klasu chiyi polya zbigayutsya z polyami vhidnih ob yektiv abo ye yih pidmmnozhinoyu Take TakeWhile Operator Take povertaye pershi n elementiv kolekciyi todi yak TakeWhile povertaye ne bilshe n pershih poslidovnih elementiv sho pidpadayut pid umovi predikatu Skip SkipWhile Analogichno do Take ta TakeWhile dani operatori vidpovidno propuskayut pershi n elementiv abo ne bilshe n pershih poslidovnih elementiv sho vidpovidayut predikatu OfType Vikoristovuyetsya dlya otrimannya elementiv pevnogo tipu Concat Danij operator konkatenuye dvi kolekciyi OrderBy ThenBy Operator OrderBy dozvolyaye zadati poryadok sortuvannya elementiv v kolekciyi po pevnomu klyuchu Za umovchannyam sortuvannya vidbuvayetsya u poryadku zrostannya Dlya sortuvannya po spadannyu treba vikoristovuvati operator OrderByDescending ThenBy and ThenByDescending dozvolyayut zadati pravila sortuvannya pidposlidovnostej Sortuvannya vidbuvayetsya po klyuchu sho koristuvach peredav v yakosti delegatu Reverse Danij operator povertaye elementi kolekciyi v zvorotnomu poryadku GroupBy Operator GroupBy prijmaye u yakosti parametru funkciyu sho po pevnomu klyuchu povertaye kolekciyu ob yektiv IGrouping lt Key Values gt dlya kozhnogo unikalnogo znachennya klyucha Ob yekti IGrouping mozhna vikoristati dlya perechislennya vsih elementiv z pevnim klyuchem Distinct Operator viluchaye dublikati elementiv z kolekciyi Perevantazhena versiya operatoru prijmaye u yakosti argumentu ob yekt sho zdijsnyuye perevirku elementiv na rivnist Union Intersect Except Dani operatori vikoristovuyutsya shob vikonati operaciyi ob yednannya peretinu ta riznici nad dvoma poslidovnostyami Kozhen z nih maye perevantazhenu versiyu sho prijmaye ob yekt yakij pereviryaye na rivnist elementi kolekcij SequenceEqual SequenceEqual viznachaye chi usi elementi kolekcij sho znahodyatsya na odnakovij poziciyi ye rivnimi First FirstOrDefault Last LastOrDefault Dani operatori otrimuyut predikat u yakosti argumentu Operator First povertaye pershij element kolekciyi sho pidpadaye pid umovu Yaksho zh takogo elementa ne isnuye vikidayetsya viklyuchennya Operator FirstOrDefault diye tak samo yak First ale zamist viklyuchennya povertaye znachennya za umovchannyam vidpovidnogo tipu Operatori Last ta LastOrDefault vikonuyut analogichni operaciyi ale z ostannimi pidhodyashimi elementami u kolekciyi Single SingleOrDefault Operator Single otrimuye predikat u yakosti argumentu ta povertaye yedinij element sho zadovolnyaye predikat Yaksho zh takih elementiv bilshe nizh odin abo nemaye vzagali vikidayetsya viklyuchennya Pri vikoristanni SingleOrDefault yaksho zhoden element u kolekciyi ne vidpovidaye predikatu to zamist viklyuchennya povertayetsya znachennya tipu za umovchannyam V usih inshih vipadkah diye tak samo yak i Single ElementAt Danij operator povertaye element sho maye vidpovidnij indeks u kolekciyi Any All Operator Any pereviryaye chi hocha b odin element u kolekciyi vidpovidaye predikatu ta povertaye vidpovidne buleve znachennya Viklik Any bez predikatu poverne istinu yaksho v kolekciyi ye hocha b odin element Operator All pereviryaye chi vidpovidni predikatu absolyutno vsi elementi kolekciyi Contains Pereviryaye chi kolekciya mistit shukanij element Count Pidrahovuye kilkist elementiv u danij kolekciyi Perevantazhenij variant prijmaye predikat u yakosti argumentu ta rahuye kilkist elementiv sho vidpovidayut predikatu Standartne API operatoriv zapitiv takozh nadaye mozhlivist konvertaciyi kolekcij do inshogo tipu AsEnumerable statichno tipizuye kolekciyu yak IEnumerable lt T gt AsQueryable statichno tipizuye kolekciyu yak IQueryable lt T gt ToArray stvoryuye masiv tipu T z vhidnoyi kolekciyi ToList stvoryuye kolekciyu tipu List lt T gt z vhidnoyi kolekciyi ToDictionary stvoryuye kolekciyu tipu Dictionary lt K T gt z vhidnoyi kolekciyi z indeksami tipu K Koristuvach peredaye u yakosti argumentu funkciyu proyekciyi sho povertaye klyuch dlya kozhnogo ob yektu ToLookup stvoryuye kolekciyu tipu Lookup lt K T gt z vhidnoyi kolekciyi z indeksami tipu K Koristuvach peredaye u yakosti argumentu funkciyu proyekciyi sho povertaye klyuch dlya kozhnogo ob yektu Cast konvertuye neuzagalnenu kolekciyu tipu IEnumerable v uzagalnenu IEnumerable lt T gt V inshomu vipadku konvertuye uzagalnenu kolekciyu z odnim parametrom tipu v kolekciyu z inshim parametrom Napriklad IEnumerable lt T gt v IEnumerable lt R gt privodyachi kozhen element tipu T do elementu tipu R V razi yaksho hocha b odin element kolekciyi ne mozhe buti privedenij do neobhidnogo tipu vikidayetsya viklyuchennya OfType konvertuye neuzagalnenu kolekciyu tipu IEnumerable v uzagalnenu IEnumerable lt T gt V inshomu vipadku konvertuye uzagalnenu kolekciyu z odnim parametrom tipu v kolekciyu z inshim parametrom Napriklad IEnumerable lt T gt v IEnumerable lt R gt namagayuchis privesti kozhen element tipu T do elementu tipu R U rezultuyuchij kolekciyi budut znahoditisya lishe ti elementi sho buli uspishno skonvertovani Rozshirennya movi Z poyavoyu LINQ do mov programuvannya takozh buv dodanij sintaksichnij cukor shob polegshiti napisannya zapitiv Dani rozshirennya vklyuchayut v sebe taki Sintaksis zapitiv rozrobniki movi programuvannya mayut zmogu obrati bud yakij zruchnij sintaksis Ci klyuchovi slova povinni perekladatisya kompilyatorom do vidpovidnih viklikiv metodiv LINQ Neyavno tipizovani zminni dane pokrashennya dozvolilo ogoloshuvati zminni bez yavnogo zaznachennya yih tipiv Pochinayuchi z C 3 0 stalo mozhlivim vikoristovuvati klyuchove slovo var U VB9 0 dlya cogo isnuye klyuchove slovo Dim Taki ob yekti ye strogo tipizovanimi Anonimni tipi anonimni tipi dozvolyayut kompilyatoru avtomatichno stvoryuvati ta opracovuvati klasi sho mistyat lishe ogoloshennya poliv Ce ye zruchnim dlya takih operatoriv yak Select ta Join rezultat vikonannya yakih chasto vidriznyayetsya vid vhidnih tipiv Kompilyator vikoristovuye interfejsi tipiv dlya viznachennya poliv sho mayut mistitisya u vihidnomu klasi i generuye do nih metodi dostupu ta zmini dlya nih Inicializator ob yektu inicializatori ob yektiv dozvolyayut stvoryuvati ta inicializuvati polya ob yektu v odnij oblasti vidimosti sho mozhna vikoristovuvati v operatorah Join ta Select Lyambda virazi lyambda virazi dozvolyayut stvoryuvati kompaktni predikati abo funkciyi proyekciyi Voni peredayutsya u funkciyi u viglyadi delegativ abo derev viraziv zalezhno vid provajdera zapitiv Napriklad u zapiti sho povertaye vsi ob yekti zi znachennyam SomeProperty menshim nizh 10 tipi zminnih result ta results vivodyatsya kompilyatorom vidpovidno do signatur vikoristanih metodiv var results from c in SomeCollection where c SomeProperty lt 10 select new c SomeProperty c OtherProperty foreach var result in results Console WriteLine result Analogichnij zapit takozh mozhna podati u nastupnomu viglyadi var results SomeCollection Where c gt c SomeProperty lt 10 Select c gt new c SomeProperty c OtherProperty results ForEach x gt Console WriteLine x ToString Provajderi LINQ LINQ nadaye mozhlivist pracyuvati z riznimi dzherelami danih Dlya cogo isnuyut provajderi Bud yakij rozrobnik mozhe napisati vlasnij provajder dlya LINQ LINQ to Objects Provajder LINQ to Objects vikoristovuyetsya dlya kolekcij sho znahodyatsya v pam yati ta zastosovuye dlya yih obrobki lokalnij funkcional LINQ Kod zgenerovanij danim provajderom realizuye arhitekturnij shablon Sequence i dozvolyaye lokalno vikonuvati operaciyi nad kolekciyami IEnumerable lt T gt Potochna realizaciya LINQ to Objects pereviryaye yaki interfejsi realizovani u tipi sho vhodit do kolekciyi shob vikoristati yih dlya shvidkogo vikonannya tih chi inshih zapitiv yaksho voni pidtrimuyutsya tipom pid chas vikonannya LINQ to XML Provajder LINQ to XML konvertuye XML dokument v kolekciyu ob yektiv XElement nad yakoyu vikonuyetsya zapit vikoristovuyuchi lokalnij funkcional LINQ LINQ to SQL Provajder LINQ to SQL dozvolyaye vikonuvati zapiti do bazi danih Microsoft SQL Server Oskilki dani sho zberigayutsya u SQL Server zazvichaj znahodyatsya na inshomu serveri ta SQL Server maye svij vlasnij funkcional po vikonannyu zapitiv LINQ to SQL ne vikoristovuye lokalni mozhlivosti LINQ Zamist cogo virazi LINQ perekladayutsya u zapiti na movi SQL ta vidpravlyayutsya do SQL Server yakij obroblyaye ci zapiti ta povertaye rezultat yaksho neobhidno Odnak oskilki SQL Server ye relyacijnoyu bazoyu danih a LINQ pracyuye z ob yektami movi programuvannya neobhidno spivstaviti vidpovidni dani Dlya cogo LINQ to SQL takozh realizuye specialnij frejmvork Spivstavlennya vidbuvayetsya ogoloshuyuchi klasi yaki ye analogami tablic u bazi danih i mistyat v sobi vsi atributi tablici abo yih pidmnozhinu Vidpovidnist mizh polyami klasu ta atributami u tablici vstanovlyuyetsya cherez atributi Napriklad Table Name Customers public class Customer Column IsPrimaryKey true public int CustID Column public string CustName Danij klas spivstavlyayetsya z tabliceyu Customers ta mistit v sobi 2 polya sho vidpovidayut dvom kolonkam tablici LINQ to DataSets Oskilki provajder LINQ to SQL pracyuye lishe z SQL Server dlya pidtrimki inshih baz danih stvoreno LINQ to DataSets Danij provajder vikoristovuye mozhlivosti ADO NET dlya vstanovlennya komunikaciyi z bazoyu danih LINQ to DataSets vikonuye zapiti nad danimi sho mistyatsya v naborah danih ADO NET PLINQPochinayuchi z chetvertoyi versiyi NET Framework vklyuchaye v sebe PLINQ Parallel LINQ sho realizuye vikonannya LINQ zapitiv paralelno Bud yakij klas sho realizuye interfejs IEnumerable lt T gt mozhe skoristatisya perevagami PLINQ viklikavshi metod rozshirennya AsParallel lt T gt this IEnumerable lt T gt sho viznachenij u klasi ParallelEnumerable prostoru imen System Linq PLINQ mozhe vikonuvati chastini zapitu odnochasno v riznih potokah sho dozvolyaye otrimati rezultat shvidshe PoperednikiBagato koncepcij yaki buli vvedeni v LINQ spochatku buli viprobuvani v naukovo doslidnomu proekti Microsoft Cw ranishe vidomomu pid kodovimi imenami X X sharp ta Xen Jogo perejmenuvali na Cw pislya togo yak v nogo bulo integrovano inshu doslidnicku movu Polyphonic C na osnovi en Cw namagayetsya zrobiti shovisha danih taki yak bazi danih ta XML dokumenti dostupnimi z takoyu zh legkistyu i bezpekoyu tipiv yak tradicijni tipi danih na zrazok ryadki ta masivi Bagato cih idej buli uspadkovani vid poperednogo proektu inkubaciyi v komandi WebData XML pid nazvoyu X ta Xen Cw takozh vklyuchaye novi konstrukciyi dlya pidtrimki konkurentnogo programuvannya ci osoblivosti v osnovnomu buli otrimani z poperednogo proektu Polyphonic C Vpershe dostupni v 2004 funkciyi Cw buli vikoristani Microsoft pri stvorenni LINQ vipushenogo v 2007 v NET versiyi 3 5 Primitivi konkurentnosti takozh vipusheni v desho modifikovanij formi v en dlya C ta inshih NET mov vid Microsoft Research Primitki docs microsoft com en us Arhiv originalu za 7 travnya 2018 Procitovano 6 travnya 2018 docs microsoft com en us Arhiv originalu za 7 travnya 2018 Procitovano 6 travnya 2018 msdn microsoft com en us Arhiv originalu za 7 travnya 2018 Procitovano 6 travnya 2018 docs microsoft com en us Arhiv originalu za 7 travnya 2018 Procitovano 6 travnya 2018 docs microsoft com en us Arhiv originalu za 7 travnya 2018 Procitovano 6 travnya 2018 docs microsoft com en us Arhiv originalu za 5 kvitnya 2018 Procitovano 6 travnya 2018 docs microsoft com en us Arhiv originalu za 7 travnya 2018 Procitovano 6 travnya 2018 docs microsoft com en us Arhiv originalu za 7 travnya 2018 Procitovano 6 travnya 2018 Eichert Steve Wooley James B Marguerie Fabrice 2008 LINQ in Action Manning s 56 57 as reported in the Google Books search link the book does not have page numbers ISBN 9781638354628 Concepts behind the C 3 0 language Articles TomasP Net 2007 02 12 u Wayback Machine The Joins Concurrency Library Procitovano 8 chervnya 2007 PosilannyaPrograma dlya interaktivnogo napisannya ta testuvannya zapitiv LINQ 5 travnya 2018 u Wayback Machine Pidruchnik LINQ 13 serpnya 2021 u Wayback Machine