2009-09-08 9 views
5

He estado buscando en la siguiente y parece que hay grandes beneficios que se pueden obtener mediante el uso de consultas compiladas ... http://blogs.msdn.com/ricom/archive/2008/01/14/performance-quiz-13-linq-to-sql-compiled-query-cost-solution.aspxpruebas unitarias, LINQ a SQL y trabajar alrededor del Contexto de datos

Mi problema es que quiero probar mis consultas en forma unitaria, pero las consultas compiladas necesitan una instancia concreta de una clase que se deriva de DataContext (que es particularmente difícil de burlar) ... Así que he encontrado el siguiente código y me preguntaba si sabe si todavía debo obtener los beneficios de rendimiento de las consultas compiladas ...

private static readonly Func<IDatabase, IActionParameters, ISportProgramMapper, IQueryable<ISportProgram>> _GetQueryUnCompiled = 
    (db, parameters, mapper) => from x in db.SportProgramDataSource.ThatHaveActiveSports() 
           where x.SportProgramId == parameters.Id 
           select mapper.FromDataToEntity(x); 

private static readonly Func<Database, IActionParameters, ISportProgramMapper, IQueryable<ISportProgram>> _GetQuery = CompiledQuery.Compile<Database, int, ISportProgramMapper, IQueryable<ISportProgram>>((db, parameters, mapper) => _GetQueryUnCompiled(db, parameters, mapper)); 

public IActionResult<ISportProgram> Get(IActionParameters parameters) 
{ 
    Check.Argument("parameters").ThatValue(parameters).IsNotNull(); 

    IDatabase db = this.CreateDatabase(); 
    ISportProgramMapper mapper = this.CreateMapper<ISportProgramMapper>(); 
    Database typedDb = db as Database; 

    var result = typedDb != null ? _GetQuery(typedDb, parameters, mapper).FirstOrDefault() : _GetQueryUnCompiled(db, parameters, mapper).FirstOrDefault(); 

    return this.CreateActionResult(result); 
} 

Nota: en un escenario de prueba unitaria, mi base de datos no será de tipo Base de datos, lo que significa que llamará a la versión no compilada, en un escenario prod será del tipo Base de datos y ejecutará la versión compilada.

Saludos Anthony

Actualización: Ok incluso si lo hago refactorizar el código para que mi método que actualmente se encuentra en el DAL utiliza un repositorio que devuelve un IQueryable la cuestión subyacente sigue siendo, la versión del repositorio que usa las consultas compiladas envolvería una versión que contiene la consulta sin procesar, de forma similar a lo que estoy haciendo en este momento ... con el patrón de tener la llamada _GetQuery _GetQueryUnCompiled ¿todavía obtengo un beneficio de rendimiento?

+0

¿Alguna vez descubrió si esto funciona? Estoy pensando en hacer lo mismo. –

Respuesta

1

Solo un pensamiento, ¿se puede refactorizar para usar IEnumerable<> solo mediante estratificación? De esta manera, puede probar su código DB por separado de sus consultas?

+0

Yeap: ¿por qué una prueba de unidad necesita saber sobre DataContext en absoluto? La mía ciertamente no. – RichardOD