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?
¿Alguna vez descubrió si esto funciona? Estoy pensando en hacer lo mismo. –