Подтвердить что ты не робот

Являются ли Find и Where() эквивалентными FirstOrDefault()?

Я использовал метод расширения Find(id) с коллекциями в Entity Framework 5. Однако многие из примеров, которые я вижу, используют Where(s => s.Id == 1), к которым я добавил FirstOrDefault(), чтобы получить объект вместо коллекции. Разве это различие в стиле или существует функциональная причина для кажущегося предпочтения .Where()?

4b9b3361

Ответ 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()!