В чем разница между «LINQ to Entities», «LINQ to SQL» и «LINQ to Dataset»

91

Я уже довольно давно работаю с LINQ. Однако остается загадкой, каковы реальные различия между упомянутыми разновидностями LINQ.

Успешный ответ будет содержать краткое различие между ними. Какова основная цель каждого аромата, каковы преимущества и влияние на производительность ...

PS Я знаю, что существует множество источников информации, но я ищу своего рода «шпаргалку», которая инструктирует новичка, куда идти для конкретной цели.

Марсель
источник
2
Также см. Stackoverflow.com/questions/2438672
Хенк Холтерман,

Ответы:

110
  • все они являются LINQ - Language Integrated Query, поэтому все они имеют много общего. Все эти «диалекты» в основном позволяют вам выбирать данные из различных источников в стиле запроса.

  • Linq-to-SQL - это первая попытка Microsoft создать ORM - Object-Relational Mapper. Он поддерживает только SQL Server. Это технология сопоставления для сопоставления таблиц базы данных SQL Server с объектами .NET.

  • Linq-to-Entities - та же идея, но с использованием Entity Framework в фоновом режиме, как ORM - снова от Microsoft, но с поддержкой нескольких бэкэндов баз данных.

  • Linq-to-DataSets - это LINQ, но его использование противоречит «старому стилю» наборов данных ADO.NET 2.0 - во времена, предшествовавшие ORM от Microsoft, все, что вы могли делать с ADO.NET, - это возвращать наборы данных, таблицы данных и т. Д., И Linq -to-DataSets запрашивает данные в этих хранилищах данных. Итак, в этом случае вы должны вернуть DataTable или DataSets (пространство имен System.Data) из бэкэнда базы данных, а затем запросить их, используя синтаксис LINQ

marc_s
источник
1
Поздравляем с 50k, теперь вы официально потратили слишком много времени на 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 всегда имеет два уровня сопоставления (следовательно, наиболее сложный). Но опять же: просто интуиция, никаких цифр,
подтверждающих
3
@marc_s Я знаю, что это старый пост, но в большинстве случаев LINQ to Entities, вероятно, будет быстрее, чем LINQ to Dataset. LINQ to Dataset на самом деле не тип, это LINQ над объектами, набор данных которых вы используете в качестве объекта. Поскольку LINQ поверх объектов не выполняет никакого SQL, вы должны сначала создать свой набор данных из источника SQL, а LINQ поверх объектов не может помочь вам выполнить какие-либо оптимизации запросов при извлечении данных в набор данных. Это и наборы данных ужасны с точки зрения производительности, поскольку все столбцы упакованы в коробки, и все эти смещения типов убивают производительность.
Роберт Макки
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>объектного представления выражения (а LambdaExpression<...>) он может разделить его и применить к любому примеру «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.
Дэн Бароуи
30

LINQ означает интегрированный язык запросов. Он позволяет использовать язык запросов «в стиле SQL» непосредственно в C # для извлечения информации из источников данных.

  • Этим источником данных может быть база данных SQL-сервера - это Linq to SQL.
  • Этот источник данных может быть контекстом данных объектов инфраструктуры сущностей - Linq для сущностей .
  • Этим источником данных могут быть наборы данных 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 framework - это система, в которой вы можете определить базу данных и отображение объектов в XML, а затем использовать Linq для запроса данных, загружаемых через это отображение.

Саймон П. Стивенс
источник
3
на самом деле Linq-to-SQL - это только SQL Server, а не просто "любая" база данных SQL.
marc_s
3
@marc_s: Хорошее место. Спасибо. Хотя, если кому-то интересно, есть сторонние поставщики Linq для sql для других баз данных, если они вам нужны. См. Code2code.net/DB_Linq или Google для других. Хотя я не могу комментировать их качество.
Саймон П. Стивенс,
1
Саймон, особенно спасибо за полезное двухстрочное резюме фреймворка Entitiy. +1
Марсель