2013-01-04 9 views
5

Dire che voglio testare la logica di query di Entity Framework, un modo sarebbe quello di convertire lo DbSet<T> in IQueryable<T> prima di costruire gli alberi di espressione per semplificare il mocking. Questo è "sicuro" e c'è qualcosa di cui essere a conoscenza?Chiama AsQueryable <T> su un DbSet <T> "sicuro"?

risposta

7

Non è solo sicuro, è legale e completamente standard. Questo è ciò che riguarda OO. Hai appena abbattuto. Un DbSet deve essere un IQUeryable, per il contratto definito dai progettisti.

+0

Per quanto riguarda gli afflitti, guardando il 5,0 documentazione di http: // msdn.microsoft.com/en-us/library/system.data.entity.dbset(v=vs.103).aspx (impossibile trovare una versione 6.0), DbSet non sembra ereditare da IQueryable, è per questo che sembra un po 'strano per me. – Dante

+3

@JohnNevermore Guarda la versione generica: http://msdn.microsoft.com/en-us/library/gg696460(v=vs.103).aspx – ken2k

+2

Silly me, totalmente perso. Grazie. – Dante

4

Fare attenzione con AsQueryable(). Se una delle variabili è di tipo AsQueryable(), AsQueryable(), , non si sa più quale sia il tipo di calcestruzzo della variabile è (DbSet<IEntity> nell'esempio).

Mentre è perfettamente valido da una prospettiva OOP (che è l'intero punto delle interfacce!), Può portare a un sacco di bug/errori. Ricordare che finché non si enumera un'origine DbSet<IEntity>, non si esegue effettivamente la query.

Ecco perché ad esempio non è possibile partecipare a una in memoria IQueryable<IEntity> (ad esempio new List<IEntity>{ ... }.AsQueryable()) con il risultato di una DbSet<IEntity> utilizzando .Union(...) ...

Problemi correlati