Может кто-нибудь, пожалуйста, проясните ключевое различие между Entity Framework и Typed Datasets? - PullRequest
6 голосов
/ 29 июля 2010

Я сравниваю наборы данных EF и типизированных для их полезности.Мне не удалось понять, почему вы используете EF над типизированными наборами данных, если EF привязан только к SQL Server.Но верно ли, что операторы Linq в EF оцениваются поздно, в том смысле, что если бы вы сделали что-то вроде:

db.Customers.where(c => c.Name == "John Smith")

EF создаст запрос, подобный:

select * from Customers where Name = 'John smith'

Но с Типизированными наборами данных вы могли бы написать:

bll.GetCustomers().where(c => c.Name == "John Smith")

, что очень похоже, но разница в том, что он сначала выполняется:

select * from Customers

А затем с помощью стандартной библиотеки коллекций находит строки, которыеИмя: «Джон Смит».В теории это означает, что EF будет более эффективным.

Это правильно?

Ответы [ 3 ]

4 голосов
/ 29 июля 2010

Да.С Entity Framework он использует IQueryable<T> для построения ваших запросов.Делая:

var results = db.Customers.Where(c => c.Name == "John Smith");

Внутренне, результаты будут IQueryable<Customer> (или ваш тип).Это позволяет провайдеру (EF) оптимизировать внутреннее выполнение.В случае SQL Server фактический запрос, отправленный на сервер, уже будет иметь предложение SQL WHERE, что, в свою очередь, будет означать, что вы вернете из БД только одну запись (если «Имя» уникально) вместокаждой записи.

Используя типизированные наборы данных, вы будете возвращать каждую запись, а затем искать в результатах соответствующее имя.Это потенциально гораздо менее эффективно.

2 голосов
/ 29 июля 2010

Это правильно. Entity Framework - это объектно-реляционный картограф (ORM). Он предоставляет способ сопоставить ваши объекты с реляционными данными для запросов. IQueryable<T> используется с EF и может в основном оптимизировать SQL, отправляемый на сервер и с сервера.

1 голос
/ 05 января 2013

Нет, это не правильно. Используя типизированные наборы данных, вы добавляете запрос параметра в табличный адаптер, такой как «SELECT * from Customers, где name = @name» Вы должны указать параметр name из своего кода во время выполнения. Таким образом, вы только перетащите нужные данные в набор данных. Сначала извлекать всю таблицу согласно ответу Рида в лучшем случае было бы крайне неэффективно и нереально с базой данных любого размера. Похоже, это распространенное заблуждение ADO.Net, увековеченное даже в некоторых книгах, особенно в книгах о Entity Framework!

...