2013-06-06 8 views
21

Czy istnieje znacząca różnica między .Find(id) a .Where(x = >x.Id == id), która powinna zmusić mnie do korzystania z .Find() przez .Where()/.First()?Podsumowanie struktury jednostki kontra Gdzie

Wyobrażam sobie, że .Find() będzie bardziej wydajny, ale czy jest o wiele bardziej wydajny, niż powinienem unikać .Where()/.First()?

Pytam się, że używam rodzajowe FakeDbSet w moich testów, aby ułatwić wdrożenie fałszywe wyniki, a do tej pory znalazłem, że muszę odziedziczyć tę klasę i zapewniają realizację niestandardowej .Find() natomiast jeśli piszę mój kod z .Where()/.First() Nie muszę wykonywać tej dodatkowej pracy.

+1

Cóż, prawdopodobnie lepiej byłoby porównać 'Find' i' SingleOrDefault', ponieważ 'Where' zwraca kolekcje. –

+0

To prawda, chociaż zawsze używam .First lub .FirstOrDefault. –

+3

@ JimmyBosse możesz rozważyć użycie Single, w dowolnych sytuacjach, w których powinien pasować tylko jeden rekord. – Kyle

Odpowiedz

31

Chodzi o to, że find rozpoczyna się od wyszukania w lokalnej pamięci podręcznej kontekstu, a następnie, jeśli nie pasuje, wysyła zapytanie do bazy danych.

where zawsze wysyła zapytanie do bazy danych.

W wersji EF 4. *, uważałem, że sql generowany przez find był zbyt złożony i, w niektórych przypadkach, prowadzi do problemu z wydajnością. Więc zawsze używać where nawet EF 5. Należy sprawdzić SQL generowany przez find EF 5.

więc na papierze, find jest lepszy, bo korzysta z pamięci podręcznej.

+9

+1. Znajdź również nie ma na celu odwiedzenia drzewa wyrażeń, więc może trafić do bazy danych szybciej, jeśli trafi do bazy danych. Gdzie zawsze przechodzi przez "ExpressionVisitor". – vcsjones

+0

Czy mogę nie uzyskać nieprawidłowych danych z powodu pamięci podręcznej? Czy Db jest aktualizowany w tle? – Zapnologica

+0

Tak, możesz. Możesz również mieć problemy z dostępem do współbieżności przy aktualizacji rekordu po odzyskaniu go lub z powodu poziomu izolacji lub ... :) – tschmit007