LINQ - це широкий набір технологій, заснований на (наприклад) синтаксисі розуміння запитів, наприклад:
var qry = from x in source.Foo
where x.SomeProp == "abc"
select x.Bar;
що відображається компілятором у код:
var qry = source.Foo.Where(x => x.SomeProp == "abc").Select(x => x.Bar);
і тут починається справжня магія. Зверніть увагу, що ми не сказали, що Foo
тут є - і компілятору все одно! Поки він може вирішити якийсь підходящий метод, який називається Where
лямбда, і результат цього має якийсь Select
метод, який може прийняти лямбда, це щасливо.
Тепер подумайте, що лямбда-комбінація може бути скомпільована або в анонімний метод (делегат, для LINQ-to-Objects, що включає LINQ-to-DataSet), або в дерево виразів (модель середовища виконання, яка представляє лямбда в об'єктній моделі ).
Для даних в пам'яті (як правило IEnumerable<T>
) він просто виконує делегат - тонко і швидко. Але для IQueryable<T>
об'єкта-подання виразу (aLambdaExpression<...>
) він може розібрати його та застосувати до будь-якого прикладу "LINQ-to-Something".
Для баз даних (LINQ-to-SQL, LINQ-to-Entities) це може означати написання TSQL, наприклад:
SELECT x.Bar
FROM [SomeTable] x
WHERE x.SomeProp = @p1
Але це може (наприклад, для служб даних ADO.NET) означати написання HTTP-запиту.
Виконання добре написаного запиту TSQL, який повертає невелику кількість даних, відбувається швидше, ніж завантаження цілої бази даних по мережі, а потім фільтрація на клієнті. Проте обидва мають ідеальні сценарії та просто неправильні сценарії.
Мета і перевага тут полягає в тому, щоб дозволити вам використовувати єдиний, перевірений статикою синтаксис, щоб запитувати широкий спектр джерел даних, і зробити код більш виразним (наприклад, "традиційний" код для групування даних не є дуже чітко з точки зору того, що він намагається зробити - це втрачається в масі коду).