linq для объектов против linq для объектов - они одинаковы? - PullRequest
26 голосов
/ 25 августа 2011

Обычно я использую термин entity для представления объекта бизнес-данных, и, на мой взгляд, linq to entities и linq to objects были одинаковыми.Разве это не правильно?

Ответы [ 5 ]

50 голосов
/ 25 августа 2011

Это определенно не тот случай.

LINQ-to-Objects - это набор методов расширения в IEnumerable<T>, которые позволяют выполнять операции запроса в памяти для произвольных последовательностей объектов. Методы принимают простые делегаты при необходимости.

LINQ-to-Entities - это поставщик LINQ, который имеет набор методов расширения для IQueryable<T>. Методы создают дерево выражений (именно поэтому делегаты фактически передаются как Expression<> s), а поставщик создает SQL-запрос на основе своего анализа этого дерева выражений.

В качестве примера рассмотрим следующие запросы:

var query1 = mydb.MyEntity.Select(x => x.SomeProp).Where(x => x == "Prop");
var query2 = mydb.MyEntity.Select(x => x.SomeProp).AsEnumerable().Where(x => x == "Prop");

Первый запрос - это построение дерева выражений, состоящего из выбора и где, с двумя лямбдами, которые на самом деле считаются LambdaExpression с. Поставщик LINQ-to-Entities преобразует это в SQL, который выбирает и фильтрует.

Второй запрос вставляет AsEnumerable(), что заставит оставшуюся часть запроса использовать LINQ-to-Objects. В этом случае поставщик будет генерировать SQL на основе только выбора, возвращать все эти записи из базы данных, и тогда фильтрация будет происходить в памяти. Очевидно, что это будет намного медленнее.

12 голосов
/ 25 августа 2011

L2o для объектов в памяти. L2e запрашивает базу данных.

9 голосов
/ 25 августа 2011

Линк к объектам Термин «LINQ to Objects» относится к использованию запросов LINQ с любой коллекцией IEnumerable или IEnumerable напрямую, без использования промежуточного поставщика LINQ или API, такого как LINQ to SQL или LINQ to XML. Вы можете использовать LINQ для запроса любых перечисляемых коллекций, таких как List, Array или Dictionary. Коллекция может быть определена пользователем или может быть возвращена .NET Framework API.

В базовом смысле LINQ to Objects представляет новый подход к коллекциям. По старинке вам приходилось писать сложные циклы foreach, в которых указывалось, как извлекать данные из коллекции. В подходе LINQ вы пишете декларативный код, который описывает, что вы хотите получить.

ref: http://msdn.microsoft.com/en-us/library/bb397919.aspx

Линк к сущности LINQ to Entities обеспечивает поддержку Language-Integrated Query (LINQ), которая позволяет разработчикам писать запросы к концептуальной модели Entity Framework с использованием Visual Basic или Visual C #. Запросы к Entity Framework представлены запросами дерева команд, которые выполняются к контексту объекта. LINQ to Entities преобразует запросы, интегрированные в язык (LINQ), в запросы дерева команд, выполняет запросы к Entity Framework и возвращает объекты, которые могут использоваться как Entity Framework, так и LINQ. Ниже описан процесс создания и выполнения запроса LINQ to Entities: Ссылка: http://msdn.microsoft.com/en-us/library/bb386964.aspx

9 голосов
/ 25 августа 2011

Linq для объектов предназначен для использования с Entity Framework, в то время как Linq для объектов предназначен для любой коллекции IEnumerable.

Подробнее:

  1. Linq to Entities
  2. Линк к объектам
3 голосов
/ 25 августа 2011

Linq2Entities означает запрос данных через ADO.NET Entity Framework (База данных)

Linq2Objects обозначает запросы в данные памяти (локальные объекты).

...