У чому різниця між “LINQ to Entities”, “LINQ to SQL” та “LINQ to Dataset”


91

Я вже давно працюю з LINQ. Однак залишається трохи загадкою, які справжні відмінності між згаданими смаками LINQ.

Успішна відповідь міститиме коротке розмежування між ними. Що є головною метою кожного аромату, яка користь і чи є вплив на ефективність ...

PS Я знаю, що там багато джерел інформації, але я шукаю свого роду "шпаргалку", яка вказує новачкові, куди рухатися до певної мети.


Відповіді:


110
  • усі вони - LINQ - Мовний інтегрований запит - тому всі вони мають багато спільного. Усі ці "діалекти" в основному дозволяють робити вибірку даних із різних джерел у стилі запиту.

  • Linq-to-SQL - це перша спроба корпорації Майкрософт на ORM - об'єктно-реляційний картограф. Він підтримує лише SQL Server. Це технологія картографування для зіставлення таблиць баз даних SQL Server з об’єктами .NET.

  • Linq-to-Entities - це та сама ідея, але використання Entity Framework у фоновому режимі, як ORM - знову ж таки від Microsoft, але підтримує декілька серверних баз даних

  • Linq-to-DataSets - це LINQ, але використання проти "старовинного" набору даних ADO.NET 2.0 - за часів до ORM від Microsoft все, що ви могли зробити з ADO.NET, було повернення DataSets, DataTables тощо, і Linq -to-DataSets запитує дані у сховищах даних. Отже, у цьому випадку ви повинні повернути DataTable або DataSets (простір імен System.Data) із серверної бази даних, а потім надіслати запит тим, хто використовує синтаксис LINQ


1
Вітаємо з 50 тис., Ти зараз офіційно витратив занадто багато часу на StackOverflow. ;)
Aaronaught

1
@Aaronaught: дякую - і ви абсолютно праві! :-) Потрібно залишити одну залежність для кожного чоловіка, ні? Будь ласка?!?!?!
marc_s

1
marc_s, дякую за цю відповідь. Чи можете ви сказати щось про продуктивність? З вашої відповіді я здогадався б, що Linq-to-Entities є найбільш просунутим і, отже, напевно найбільш ефективним?
Марсель

2
@Marcel: з мого кишечника (немає твердих фактів), я б сказав: Linq-to-SQL або є найшвидшим (лише один шар між базою даних та об'єктною моделлю), Linq-to-Dataset близький другий, і Linq-to -Entities останнє, оскільки Entity Framework завжди має два рівні відображення (таким чином, найбільш складний). Але знову ж таки: просто відчуття кишки, цифри не підтверджують
marc_s

3
@marc_s Я знаю, що це стара публікація, але LINQ to Entities, швидше за все, швидше, ніж LINQ to Dataset, в більшості випадків. LINQ to Dataset насправді не є типом, це LINQ над Об’єктами, для яких ви використовуєте набір даних як об’єкт. Оскільки LINQ над об’єктами не робить жодного SQL, спочатку потрібно створити свій набір даних із джерела SQL, а LINQ над об’єктами не може допомогти вам виконати будь-яку оптимізацію запитів щодо отримання даних у наборі даних. Це і набори даних є страшними показниками продуктивності, оскільки всі стовпці розміщені в коробках, і всі такі типи перемикання вбивають продуктивність.
Robert McKee

38

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, який повертає невелику кількість даних, відбувається швидше, ніж завантаження цілої бази даних по мережі, а потім фільтрація на клієнті. Проте обидва мають ідеальні сценарії та просто неправильні сценарії.

Мета і перевага тут полягає в тому, щоб дозволити вам використовувати єдиний, перевірений статикою синтаксис, щоб запитувати широкий спектр джерел даних, і зробити код більш виразним (наприклад, "традиційний" код для групування даних не є дуже чітко з точки зору того, що він намагається зробити - це втрачається в масі коду).


Марк, дякую за це розуміння. Однак я не питав про такі докладні внутрішні дані. -1, вибачте, бо це не відповідає на питання.
Марсель

7
Як хтось пише свого власного постачальника LINQ, це найкраща відповідь, яку я бачив на сьогодні. Я не згоден з -1.
Dan Barowy,

30

LINQ розшифровується як мовний інтегрований запит. Це дозволяє використовувати мову запитів "Стиль SQL" безпосередньо в C # для отримання інформації з джерел даних.

  • Таким джерелом даних може бути база даних SQL-сервера - це Linq to SQL
  • Це джерело даних може бути контекстом даних об'єктів фреймворку сутності - Linq to сутності .
  • Таким джерелом даних можуть бути набори даних ADO.net - Linq to Dataset .

Це джерело даних також може бути XML-файлом - Linq to XML .
Або навіть просто клас колекції простих об'єктів - Linq to Objects .

LINQ описує технологію запитів, решта назви описує джерело даних, що запитуються.

Для трішки додаткового фону:

Набори даних - це об’єкти ADO.net, де дані завантажуються з бази даних у .net набір даних, і Linq може використовуватися для запиту цих даних після їх завантаження.

С Linq to SQL ви визначаєте .net-класи, які відображаються у базі даних, а Linq-to-SQL дбає про завантаження даних із бази даних SQL сервера

І нарешті, структура Entity - це система, де ви можете визначити базу даних та зіставлення об’єктів у XML, а потім можете використовувати Linq для запиту даних, які завантажуються за допомогою цього відображення.


3
насправді Linq-to-SQL - це лише SQL Server - а не просто "будь-яка" внутрішня база даних SQL.
marc_s

3
@marc_s: Гарне місце. Дякую. Хоча, якщо хтось зацікавлений, існують сторонні постачальники Linq to sql для інших баз даних, якщо ви їх хочете. Див. Code2code.net/DB_Linq або Google для інших. Однак я не можу коментувати їх якість.
Саймон П Стівенс

1
Саймоне, дякую особливо за корисний короткий зміст фреймворку Entitiy у 2 рядки. +1
Марсель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.