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 ??
Avez-vous déjà trouvé si cela fonctionne? Je pense faire la même chose. –