Що таке LINQ? Я знаю, що це для баз даних, але що це робить?
Що таке LINQ? Я знаю, що це для баз даних, але що це робить?
Відповіді:
LINQ означає інтегрований запит мови .
Замість того, щоб писати YAQL (Ще одна мова запитів), розробники мови Microsoft запропонували спосіб вираження запитів безпосередньо своїми мовами (наприклад, C # та Visual Basic). Методи формування цих запитів не покладаються на деталі реалізації запитуваної речі, так що ви можете записувати дійсні запити проти багатьох цілей (бази даних, об'єкти в пам'яті, XML), практично не враховуючи основного способу, за яким запит буде виконано.
Почнемо це дослідження з частин, що належать до .NET Framework (3.5).
LINQ до об'єктів - вивчіть System.Linq.Чесно для методів запитів. Ці цілі IEnumerable<T>
дозволяють запитувати будь-яку набрану циклічну колекцію безпечним чином. Ці запити покладаються на складені методи .NET, а не на вирази.
LINQ Що-небудь - вивчіть System.Linq.Queyable для деяких методів запитів. Ці цілі IQueryable<T>
дозволяють побудувати дерева виразів, які можуть бути переведені базовою реалізацією.
Дерева виразів - вивчіть простір імен System.Linq.Expressions . Це код як дані. На практиці ви повинні знати про цей матеріал, але насправді не потрібно писати код проти цих типів. Мовні функції (наприклад, лямбда-вирази) дозволяють використовувати різні короткі руки, щоб уникнути прямого спілкування з цими типами.
LINQ To SQL - вивчіть простір імен System.Data.Linq . Особливо зверніть увагу на DataContext
. Це технологія DataAccess, побудована командою C #. Це просто працює.
LINQ Entities - вивчіть простір імен System.Data.Objects . Особливо зверніть увагу на ObjectContext
. Це технологія DataAccess, побудована командою ADO.NET. Він складний, потужний і складніший у використанні, ніж LINQ To SQL.
LINQ To XML - вивчіть простір імен System.Xml.Linq . По суті, люди не були задоволені речами System.Xml
. Тож Microsoft переписав це і скористався перезаписом, щоб запровадити деякі методи, що полегшують використання LINQ To Objects проти XML.
Деякі приємні типи помічників, такі як Func та Action . Ці типи є делегатами із загальною підтримкою. Минули дні оголошення власних (і незмінних) типів делегатів.
Все вищезазначене є частиною .NET Framework і доступне з будь-якої мови .NET (VB.NET, C #, IronPython, COBOL .NET тощо).
Гаразд, щодо мовних особливостей. Я буду дотримуватися C #, оскільки це я найкраще знаю. VB.NET також мав декілька подібних удосконалень (і пару, до якої не потрапив C # - XML-літерали). Це короткий і неповний список.
Методи розширення - це дозволяє "додати" метод до типу. Метод дійсно є статичним методом, який передається екземпляром типу і обмежується публічним договором типу, але він дуже корисний для додавання методів до типів, якими ви не керуєте (рядок), або додавання (повністю реалізований ) допоміжні методи інтерфейсів.
Синтаксис розуміння запитів - це дозволяє писати в структурі подібних SQL. Весь цей матеріал перекладається на методи на System.Linq.Queyable або System.Linq.Eumerable (залежно від типу моїх клієнтів). Це абсолютно необов’язково, і ви можете добре використовувати LINQ без нього. Однією з переваг цього стилю оголошення запитів є те, що змінні діапазону розміщені за шкалою: їх не потрібно повторно оголошувати для кожного пункту.
IEnumerable<string> result =
from c in myCustomers
where c.Name.StartsWith("B")
select c.Name;
Lambda вирази - це скорочення для визначення способу. Компілятор C # переведе кожен або в анонімний метод, або в істинний System.Linq.Expressions.Expression
. Вам справді потрібно зрозуміти це, щоб добре використовувати Linq. Є три частини: список параметрів, стрілка та тіло методу.
IEnumerable<string> result = myCustomers
.Where(c => c.Name.StartsWith("B"))
.Select(c => c.Name);`
Анонімні типи - іноді у компілятора є достатньо інформації, щоб створити тип для вас. Ці типи не є справді анонімними: компілятор називає їх, коли він робить їх. Але ці імена створюються під час компіляції, що занадто пізно, щоб розробник використовував це ім'я під час проектування.
myCustomers.Select(c => new
{
Name = c.Name;
Age = c.Age;
})
Неявні типи - іноді компілятор має достатньо інформації від ініціалізації, щоб він міг з’ясувати тип для вас. Ви можете доручити компілятору зробити це за допомогою ключового слова var. Для декларування змінних для анонімних типів потрібно негласне введення тексту, оскільки програмісти не можуть використовувати ім'я анонімного типу.
// The compiler will determine that names is an IEnumerable<string>
var names = myCustomers.Select(c => c.Name);
LINQ (мова інтегрованого запиту) може стосуватися:
бібліотека для збору та маніпуляції з ітератором, яка широко використовує функції вищого порядку як аргументи (System.Linq)
бібліотека для передачі та маніпулювання простими функціями як абстрактні синтаксичні дерева (System.Linq.Expressions)
розширення синтаксису на різні мови для забезпечення більш SQL-подібного синтаксису для обробки колекцій, більш компактного позначення для анонімних функцій та механізму для введення статичних допоміжних функцій, синтаксично невідмінних від функцій кінцевих членів
визначення інтерфейсу, якому постачальники даних можуть відповідати, щоб отримати структуру запитів і потенційно виконати оптимізацію на них, або іноді самі сумісні постачальники даних
Компоненти можна використовувати ізольовано або комбінувати.
Коротше кажучи, LINQ (Language-Integrated Query) дозволяє писати запити безпосередньо у свій код. Ці запити можуть знаходитись у реляційних базах даних, а також на об'єктах контейнерів XML або контейнерів пам'яті, таких як масиви та списки. Більше інформації можна знайти в бібліотеці MSDN: http://msdn.microsoft.com/en-us/library/bb308959.aspx
Я спробую отримати просту відповідь: LINQ - це спосіб запиту вашої бази даних (або іншого сховища даних, XML тощо), використовуючи мову запиту, схожу на SQL, але її можна компілювати в додатку .NET.
From Where Select, etc.
- тобто він повинен бути написаний так, як насправді формується набір результатів
LINQ розшифровується як інтегрований мовний запит і є способом надання механізму загального призначення "запиту" в CLR.
На самому базовому рівні це складається з набору методів на IEnumerable <T> - напр., Select, Sum, Where - які можна використовувати для обмежень, прогнозів тощо [1]
Щоб зробити це трохи далі, LINQ також визначає нову модель постачальника LINQ, яка може взяти дерево експресії і використовувати його для запуску "рідних" запитів проти джерела даних за межами CLR - наприклад, LINQ до SQL, LINQ до XML, LINQ до NHibernate тощо.
C # і VB.NET також визначили синтаксис запитів, який дозволяє записувати сильно набрані запити в рядок (який дуже схожий на SQL), який потім компілятор переводить у еквівалентні IEnumerable <T> виклики.
Для мене найцікавіше в LINQ - це всі функції C # і VB.NET, які були необхідні для його підтримки, корисні самі по собі. Методи розширення, анонімні типи, лямбда-вирази та неявна введення тексту були потрібні для підтримки LINQ - але ми, як правило, використовуємо ці функції поза чистим контекстом LINQ.
[1] Це реляційні терміни, функціональні програмісти, ймовірно, віддають перевагу Map, Reduce, Fold тощо.
LINQ - це технологія вилучення даних за допомогою ідіоми, отриманої з мови програмування C #. Хоча він багато в функціональному дизайні зобов'язаний SQL, він принципово є власною мовою запитів даних. Він працює в широкому спектрі джерел даних (бази даних SQL, уявлення в пам'яті, XML тощо). Зокрема, LINQ-To-SQL слід розглядати як протилежність традиційному використанню вбудованого SQL, який страждає від того, що часто називають "невідповідністю імпедансу" між програмуванням SQL та програмуванням на C # / VB.
Для обговорення LINQ та його обмежень, можливо, ви захочете поглянути на це пов’язане питання: чи не пропускає LINQ для SQL суть?
http://msdn.microsoft.com/en-us/netframework/aa904594.aspx
"Проект LINQ - це кодове ім'я для набору розширень до .NET Framework, які охоплюють інтегровані до мови операції запитів, наборів та перетворень. Він розширює C # та Visual Basic з синтаксисом рідної мови для запитів та надає бібліотекам класів, щоб скористатися перевагами ці можливості ".