2013-06-06 6 views
21

Есть ли существенная разница между .Find(id) и .Where(x = >x.Id == id), что должно заставить меня использовать .Find() по сравнению с .Where()/.First()?Entity Framework Найти vs. Где

Я бы предположил, что .Find() будет более эффективным, но настолько ли он эффективнее, что я должен избегать .Where()/.First()?

Причина, по которой я прошу, состоит в том, что я использую общий набор FakeDbSet в своих тестах, чтобы упростить реализацию поддельных результатов, и до сих пор я обнаружил, что должен наследовать этот класс и предоставить пользовательскую реализацию .Find(), тогда как если я напишу мой код с .Where()/.First() Мне не нужно делать эту дополнительную работу.

+1

Ну, вам, вероятно, будет лучше сравнивать «Найти» и «SingleOrDefault», так как 'Where' возвращает коллекции. –

+0

Правда, хотя я всегда использую .First или .FirstOrDefault. –

+3

@JimmyBosse, вы можете рассмотреть возможность использования Single для любых ситуаций, когда должно соответствовать только одна запись. – Kyle

ответ

31

Дело в том, что find начинается с поиска в локальном кеше контекста, а затем, если нет совпадения, отправляет запрос в db.

where всегда отправляет запрос в db.

С EF 4. * Раньше я думал, что sql, сгенерированный find, был слишком сложным и в некоторых случаях приводил к проблеме с производительностью. Так что я всегда использую where даже с EF 5. Я должен проверить SQL, генерируемый find с EF 5.

Таким образом, в работе find лучше, потому что он использует кэш.

+9

+1. Поиск также не имеет накладных расходов на посещение дерева выражений, поэтому он может быстрее ударить по базе данных, если он попадает в базу данных. Где всегда проходит «ExpressionVisitor». – vcsjones

+0

Могу ли я получить неверные данные из-за кеша? Т.е. Db обновляется в фоновом режиме? – Zapnologica

+0

Да, вы можете. У вас также может быть проблема с параллельным доступом при обновлении записи после ее возврата или из-за уровня изоляции или ... :) – tschmit007

Смежные вопросы