В чем разница между «LINQ to Entities», «LINQ to SQL» и «LINQ to Dataset»
Вопрос
Я уже довольно давно работаю с LINQ.Однако остается загадкой, в чем заключаются реальные различия между упомянутыми разновидностями LINQ.
Успешный ответ будет содержать краткое различие между ними.Какова основная цель каждого варианта, какова его польза и влияет ли это на производительность...
P.S.Я знаю, что существует множество источников информации, но я ищу своего рода «шпаргалку», которая подскажет новичку, куда двигаться для достижения конкретной цели.
Решение
все они 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, - это возвращать наборы данных, таблицы данных и т. д., а также запросы Linq-to-DataSets. эти хранилища данных для данных.Итак, в этом случае вы должны вернуть DataTable или DataSets (пространство имен System.Data) из серверной части базы данных, а затем запросить их, используя синтаксис 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>
объект-представление выражения (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» непосредственно в C# для извлечения информации из источников данных.
- Этим источником данных может быть база данных SQL-сервера. Linq для SQL
- Этот источник данных может быть контекстом данных объектов инфраструктуры сущностей - Linq для сущностей.
- Этим источником данных могут быть наборы данных ADO.net. Linq для набора данных.
Этот источник данных также может быть файлом XML – Linq в XML.
Или даже просто класс коллекции простых объектов — Linq для объектов.
LINQ описывает технологию запросов, остальная часть имени описывает источник запрашиваемых данных.
Немного дополнительной информации:
Наборы данных представляют собой объекты ADO.net, где данные загружаются из базы данных в набор данных .net, а Linq может использоваться для запроса этих данных после их загрузки.
С Linq для SQL вы определяете классы .net, которые сопоставляются с базой данных, а Linq-to-SQL заботится о загрузке данных из базы данных SQL-сервера.
И, наконец, Структура сущности — это система, в которой вы можете определить сопоставление базы данных и объектов в XML, а затем использовать Linq для запроса данных, загружаемых с помощью этого сопоставления.