2009-09-08 5 views
5

je cherchais à l'adresse suivante et il semble qu'il ya de grands avantages à gagner en utilisant des requêtes compilées ... http://blogs.msdn.com/ricom/archive/2008/01/14/performance-quiz-13-linq-to-sql-compiled-query-cost-solution.aspxtests unitaires, LINQ to SQL et de travailler dans le contexte des données

Mon problème est que je veux tester mes requêtes unitaires, mais les requêtes compilées ont besoin d'une instance concrète d'une classe dérivée de DataContext (ce qui est particulièrement difficile à simuler) ... Donc j'ai trouvé le code suivant et je me demandais s'il y en avait sait si je devrais encore obtenir les avantages de performance des requêtes compilées ...

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); 
} 

Note dans un scénario de test unitaire mon db ne sera pas de type Base de données ce qui signifie qu'il appellera la version non compilée, dans un scénario prod il sera de type Base de données et lancera la version compilée.

Vive Anthony

Mise à jour: Ok, même si je factoriser le code de sorte que ma méthode qui est actuellement dans le DAL utilise un référentiel qui renvoie un IQueryable la question sous-jacente reste encore, la version du référentiel qui utilise les requêtes compilées encapsulerait une version qui contient la requête brute, de la même manière que ce que je fais en ce moment ... avec le modèle d'avoir l'appel _GetQuery _GetQueryUnCompiled je reçois toujours un avantage de performance ??

+0

Avez-vous déjà trouvé si cela fonctionne? Je pense faire la même chose. –

Répondre

1

Juste une pensée, pouvez-vous refactor pour utiliser IEnumerable<> seulement par superposition? De cette façon, vous pouvez tester votre code DB séparément de vos requêtes?

+0

Yeap - pourquoi un test unitaire a besoin de savoir à propos de DataContext. La mienne ne le fait certainement pas. – RichardOD