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

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

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

P.S. Я знаю, что есть много источников информации, но я ищу своего рода "чит-лист", в котором инструктирует новичка, куда направиться к определенной цели.

Ответ 1

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

Ответ 2

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, который может принимать лямбда, а результат этого метода some Select, который может принимать лямбда, он счастлив.

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

Для данных в памяти (обычно 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) означать запись HTTP-запроса.

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

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

Ответ 3

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

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

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

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

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

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

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

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