В чем разница между «LINQ to Entities», «LINQ to SQL» и «LINQ to Dataset» - PullRequest
85 голосов
/ 15 марта 2010

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

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

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

Ответы [ 3 ]

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

  • 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 - во времена, предшествующие ORM от Microsoft, все, что вы могли сделать с ADO .NET возвращал DataSets, DataTables и т. Д., А Linq-to-DataSets запрашивает данные в этих хранилищах данных. Таким образом, в этом случае вы должны вернуть DataTable или DataSets (пространство имен System.Data) из серверной части базы данных, а затем запросить их, используя синтаксис LINQ

36 голосов
/ 15 марта 2010

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);

и здесь начинается волшебство real . Обратите внимание, что мы не сказали, что Foo здесь - и компилятору все равно! Пока он может разрешить некоторый подходящий метод, называемый Where, который может принимать лямбду, и в результате этого есть некоторый Select метод, который может принимать лямбду, он счастливый.

Теперь рассмотрим, что лямбда может быть скомпилирована либо в анонимный метод (делегат, для LINQ-to-Objects, который включает LINQ-to-DataSet), или в дерево выражений (модель времени выполнения, представляющая лямбду в объектной модели).

Для данных в памяти (обычно IEnumerable<T>) он просто выполняет делегат - отлично и быстро. Но для IQueryable<T> объектного представления выражения (a LambdaExpression<...>) он может отделить его и применить к любому примеру "LINQ-to-Something".

Для баз данных (LINQ-to-SQL, LINQ-to-Entities) это может означать написание TSQL, например:

SELECT x.Bar
FROM [SomeTable] x
WHERE x.SomeProp = @p1

Но это может (например, для ADO.NET Data Services) означать написание HTTP-запроса.

Выполнение хорошо написанного запроса TSQL, который возвращает небольшой объем данных, быстрее, чем загрузка всей базы данных по сети и последующая фильтрация на клиенте. У обоих есть идеальные сценарии и сценарии с явной ошибкой.

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

25 голосов
/ 15 марта 2010

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

  • Этот источник данных может быть базой данных сервера SQL - это Linq to SQL
  • Этот источник данных может быть контекстом данных объектов каркаса сущности - Линк к сущности .
  • Этим источником данных могут быть наборы данных ADO.net - Linq to Dataset .

Этот источник данных также может быть файлом XML - Linq to XML .
Или даже просто класс Collection простых объектов - Linq to Objects .

LINQ описывает технологию запросов, остальная часть имени описывает источник запрашиваемых данных.

Для дополнительного фона:

Наборы данных являются объектами ADO.net, где данные загружаются из базы данных в набор данных .net, и Linq можно использовать для запроса этих данных после их загрузки.

С помощью Linq to SQL вы определяете классы .net, которые сопоставляются с базой данных, а Linq-to-SQL заботится о загрузке данных из базы данных сервера SQL

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

...