2009-09-08 8 views
5

Sono stato a guardare al seguente e sembrerebbe che ci sono grandi benefici che si possono ottenere utilizzando query compilate ... http://blogs.msdn.com/ricom/archive/2008/01/14/performance-quiz-13-linq-to-sql-compiled-query-cost-solution.aspxUnit Testing, LINQ to SQL e di lavoro intorno il contesto dati

Il mio problema è che voglio testare le mie query unitarie, ma le query compilate richiedono un'istanza concreta di una classe derivata da DataContext (che è particolarmente difficile da prendere in giro) ... Così ho trovato il seguente codice e mi chiedevo se sa se dovrei ancora ottenere i benefici delle prestazioni delle query compilate ...

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 in uno scenario di test unitario il mio db non sarà di tipo Database, il che significa che chiamerà la versione non compilata, in uno scenario prod sarà di tipo Database e verrà eseguita la versione compilata.

Acclamazioni Anthony

Aggiornamento: Ok, anche se faccio refactoring del codice in modo che il mio metodo, che è attualmente in DAL utilizza un repository che restituisce un IQueryable la questione di fondo rimane ancora, la versione del repository che usa le query compilate avvolgerebbe una versione che contiene la query non elaborata, in un modo simile a quello che sto facendo al momento ... con lo schema di avere la chiamata _GetQuery _GetQueryUnCompiled ottengo ancora un vantaggio in termini di prestazioni ??

+0

Hai mai capito se questo funziona? Sto pensando di fare la stessa cosa. –

risposta

1

Solo un pensiero, puoi refactoring per utilizzare IEnumerable<> solo da margotta? In questo modo puoi testare il tuo codice DB separatamente dalle tue query?

+0

Yeap: perché un test di unità deve conoscere a fondo DataContext. Il mio certamente no. – RichardOD