2013-01-04 6 views
5

Скажите, что я хочу протестировать логику запросов Entity Framework, одним из способов было бы преобразовать DbSet<T> в IQueryable<T>, прежде чем строить деревья выражений для легкой насмешки. Является ли это «безопасным» и есть ли что-нибудь, о чем нужно знать?Вызывает AsQueryable <T> на DbSet <T> «безопасный»?

ответ

7

Это не только безопасно, но и законно и полностью стандартно. Это то, о чем OO. Ты просто опустошен. A DbSet Должно быть IQUeryable, согласно договору, определенному дизайнерами.

+0

Относительно смиренных, глядя на +5,0 документации HTTP: // msdn.microsoft.com/en-us/library/system.data.entity.dbset(v=vs.103).aspx (не удалось найти версию 6.0), DbSet, похоже, не наследует IQueryable, поэтому кажется мне немного подозрительным. – Dante

+3

@JohnNevermore Посмотрите на общую версию: http://msdn.microsoft.com/en-us/library/gg696460(v=vs.103).aspx – ken2k

+2

Глупый я, полностью пропустил это. Благодарю. – Dante

4

Будьте осторожны с AsQueryable(). Если одна из ваших переменных имеет тип IQueryable<IEntity> после звонка AsQueryable(), , вы больше не знаете, какой конкретный тип переменной (DbSet<IEntity> в вашем примере).

В то время как это совершенно верно с точки зрения ООП (это целая точка интерфейсов!), Это может привести к множеству ошибок/ошибок. Помните, что пока вы не перечислите источник DbSet<IEntity>, вы фактически не выполняете запрос.

Вот почему, например, вы не можете присоединиться в оперативной памяти IQueryable<IEntity> (например new List<IEntity>{ ... }.AsQueryable()) с результатом в DbSet<IEntity> с использованием .Union(...) ...