Каков наилучший способ написания запросов в Entity Framework - PullRequest
7 голосов
/ 07 февраля 2012

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

ObjectQuery<Employee> queryEmp =
    context.CreateQuery<Employee>(
    "Select value e from Employees AS e Where e.LastName = @lastName",
    new ObjectParameter("lastName", typeof(String)) { Value = "Farooqi" });
ObjectResult<Employee> results = query.Execute(MergeOption.AppendOnly);

OR

var v = from e in context.Employees where e.LastName == "Farooqi" select e;

OR

context.Employees.Where(e => e.LastName == "Farooqi");

OR

context.Employees.Where("LastName = @lastName", new ObjectParameter("lastName", typeof(String)) { Value = "Farooqi" });

Мой вопрос заключается в том, какой метод запроса лучше. Что меня смущает, так это то, что я думаю (но не уверен), что при использовании последних трех методов, отличных от первого, будут извлечены все записи сотрудника из базы данных, а затем путем перечисления всех записей, которые будут восстановлены, которые удовлетворяют указанному условию where, поэтому я думаю, что последние три способа займут больше времени, чем первый, поэтому я использовал только первый. Но что является лучшим в действительности, я не знаю. Все ли методы выбирают только записи из базы данных, которые удовлетворяют условию были, или выбирают все записи из базы данных и затем перечисляют их, чтобы вернуть отфильтрованные записи в конце приложения?

1 Ответ

9 голосов
/ 07 февраля 2012

Есть небольшая разница;2-й / 3-й имеют преимущество принудительной корректности типов во время компиляции, так как дерево выражений не будет компилироваться, если LastName не существует или является (скажем) int - избегает опечаток и вопроса "волшебные струны ".

Re ваше предположение о возвращении все;нет.2-й / 3-й компилируются в деревья выражений , которые могут быть разобраны и использованы для создания правильного SQL (выполнение фильтра на сервере).Очень умно, но часто неправильно.Ключевым моментом является то, что это Queryable.Where (принимая Expression<Func<T, bool>>), а не Enumerable.Where (принимая Func<T, bool>).Не стесняйтесь выполнять трассировку.

Аналогично, разница между 1-м и 4-м небольшая - оба будут фильтровать на сервере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...