2013-01-04 8 views
5

Powiedz, że chcę przeprowadzić test jednostkowy w logice zapytań Entity Framework, jednym ze sposobów byłoby przekonwertowanie DbSet<T> na IQueryable<T> przed zbudowaniem drzewek wyrażeń dla łatwego kpienia. Czy jest to "bezpieczne" i czy jest coś, o czym należy pamiętać?Czy wywołanie AsQueryable <T> jest bezpieczne "DbSet <T>"?

Odpowiedz

7

Jest nie tylko bezpieczny, ale również legalny iw pełni standard. O to właśnie chodzi w OO. Po prostu jesteś spuszczony. A DbSet MUSI być IQUeryable, zgodnie z umową określoną przez projektantów.

+0

Jeśli chodzi o przygnębiony, patrząc na http 5.0 Dokumentacja: // msdn.microsoft.com/en-us/library/system.data.entity.dbset(v=vs.103).aspx (nie można znaleźć wersji 6.0), DbSet nie dziedziczy z IQueryable, dlatego wydaje mi się trochę podejrzany. – Dante

+3

@JohnNevermore Spójrz na ogólną wersję: http://msdn.microsoft.com/en-us/library/gg696460(v=vs.103).aspx – ken2k

+2

Silly me, totalnie to przegapiłem. Dzięki. – Dante

4

Należy zachować ostrożność pod numerem AsQueryable(). Jeśli jedna z twoich zmiennych jest typu IQueryable<IEntity> po wywołaniu AsQueryable(), , nie wiesz już, jaki konkretny typ zmiennej to (DbSet<IEntity> w twoim przykładzie).

Podczas gdy jest całkowicie ważny z perspektywy OOP (to jest cały punkt interfejsów!), Może to prowadzić do wielu błędów/błędów. Pamiętaj, że dopóki nie wyliczysz źródła DbSet<IEntity>, nie wykonasz zapytania.

Dlatego na przykład nie można dołączyć in-memory IQueryable<IEntity> (np new List<IEntity>{ ... }.AsQueryable()) z wyniku DbSet<IEntity> wykorzystaniem .Union(...) ...