Je pense qu'il est important pour comprendre comment fonctionnent les requêtes compilées dans EF.
Lorsque vous exécutez une requête Entity Framework mappera votre arborescence d'expression à l'aide de votre fichier de mappage (EDMX ou avec le code d'abord vos définitions de modèle) à une requête SQL. Cela peut être une tâche complexe et exigeante. La précompilation stocke les résultats de ces phases de mappage. Ainsi, la prochaine fois que vous cliquerez sur la requête, le SQL sera déjà disponible et il ne lui restera plus qu'à définir les paramètres actuels.
Le problème est qu'une requête précompilée perd son avantage de performance dès que vous modifiez la requête. Disons que vous avez les éléments suivants:
IQueryable query = GetCompiledQuery(); // => db.Tasks.Where(t => t.Id == myId);
var notModifiedResult = query.ToList(); // Fast
int ModifiedResult = query.Count(); // Slow
Avec la première requête, vous aurez tous les avantages de précompilation car EF a le SQL déjà généré pour vous et peut exécuter cette immediat. La deuxième requête perdra la précompilation car elle doit régénérer son SQL.
Si vous souhaitez maintenant exécuter une requête sur notModifiedResult
, il s'agira d'une requête Linq To Objects car vous avez déjà exécuté votre SQL dans la base de données et récupéré tous les éléments en mémoire.
Vous pouvez toutefois chaîner des requêtes compilées (c'est-à-dire utiliser une requête compilée dans une autre requête compilée).
Mais votre code nécessiterait une série de requêtes compilées:! - La valeur par défaut - Un état où = null - Une catégorie où = null - Un statut et où les deux catégories = null