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

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

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

С. П. Я знаю, что существует много источников информации, но я ищу своего рода " обман лист", который инструктирует новичка, куда идти к определенной цели.

3 ответов


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

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

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

  • Linq-to-DataSets является LINQ, но использование против "старого стиля" ADO.NET 2.0 DataSets - в времена до ORM от Microsoft, все, что вы могли сделать с ADO.NET возвращал наборы данных, DataTables и т. д., и Linq-to-DataSets запрашивает эти данные хранит данные. Таким образом, в этом случае вы вернете DataTable или DataSets (System.Пространство имен данных) из бэкэнда базы данных, а затем запросите тех, кто использует синтаксис LINQ


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> в object-представление выражения (a 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, который возвращает небольшой объем данных быстрее, чем загрузка всей базы данных по сети, а затем фильтрация у клиента. У обоих есть идеальные сценарии и совершенно неправильные сценарии.

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


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

  • этот источник данных может быть базой данных SQL server-это Linq to SQL
  • этот источник данных может быть контекстом данных объектов entity framework -Linq to entities.
  • этот источник данных может быть 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 server

и наконец Entity framework - это система, в которой вы можете определить сопоставление базы данных и объектов в XML, а затем использовать Linq для запроса данных, загружаемых через это сопоставление.