Я использовал метод расширения Find(id)
с коллекциями в Entity Framework 5. Однако многие из примеров, которые я вижу, используют Where(s => s.Id == 1)
, к которым я добавил FirstOrDefault()
, чтобы получить объект вместо коллекции.
Разве это различие в стиле или существует функциональная причина для кажущегося предпочтения .Where()?
Являются ли Find и Where() эквивалентными FirstOrDefault()?
Ответ 1
Find() имеет принципиальное отличие от Where(), Single(), First() и т.д., поскольку он сначала будет искать объект в памяти и только попадет в базу данных, если объект еще не был загружен. Таким образом, попробуйте использовать "Найти" (), где это возможно, поскольку это дает возможность быстрой загрузки нагрузки из памяти. Find() работает только с первичным ключом и не поддерживает lambdas, поэтому он не очень гибкий.
Где() обычно используется для получения списка объектов. Чтобы получить один объект, я обычно использую Single(), SingleorDefault(), First(), FirstorDefault().
Single() и SingleOrDefault() отличаются от First() и FirstOrDefault(), поскольку они гарантируют, что максимум один объект может удовлетворять критериям, которые помогают обеспечить целостность данных в базе данных. Они "Одинарные" предложения делают это, выбирая "TOP 2" в SQL-запросе и затем бросая исключение, если возвращаются два объекта.
Обратите внимание, что вы не должны привязывать их к концу предложения Where().
Итак, вместо
.Where(s => s.Id == 1).FirstOrDefault();
использование:
.FirstOrDefault(s => s.Id == 1);
Я написал сообщение в блоге, чтобы полностью изучить эту проблему: http://judeokelly.com/primer-on-selecting-data-using-entity-framework/
Ответ 2
Если производительность имеет значение, http://wp.secretnest.info/archives/2991,.Where(...). FirstOrDefault() намного быстрее, чем FirstOrDefault (...). Конечно, List Find() может быть намного быстрее, чем предыдущий.
Таким образом, вопреки принятому ответу, вы не должны избегать Where (...). FirstOrDefault()!