J'utilise généralement un référentiel générique pour mettre mes requêtes EF en attente, donc je dois écrire du code limité et utiliser également la mise en cache. Le code source du référentiel peut être trouvé here.Combinaison Inclut avec Entity Framework
La requête backbone dans le code est celle ci-dessous. FromCache<T>()
est une méthode d'extension IEnumerable<T>
qui utilise HttpContext.Cache
pour stocker la requête en utilisant une représentation stringifiée de l'expression lambda en tant que clé.
public IQueryable<T> Any<T>(Expression<Func<T, bool>> expression = null)
where T : class, new()
{
// Check for a filtering expression and pull all if not.
if (expression == null)
{
return this.context.Set<T>()
.AsNoTracking()
.FromCache<T>(null)
.AsQueryable();
}
return this.context.Set<T>()
.AsNoTracking<T>()
.Where<T>(expression)
.FromCache<T>(expression)
.AsQueryable<T>();
}
Alors que tout cela fonctionne, il est soumis au problème N + 1 pour les tables connexes car si je devais écrire une requête comme ceci:
var posts = this.ReadOnlySession.Any<Post>(p => p.IsDeleted == false)
.Include(p => p.Author);
Le Include()
aura aucun effet sur ma requête car il a déjà été exécuté pour être mis en cache. Maintenant, je sais que je peux forcer Entity Framework à utiliser le chargement passionné dans mon modèle en supprimant le préfixe virtuel sur mes propriétés de navigation, mais cela me semble être le mauvais endroit pour le faire car vous ne pouvez pas prédire les types de requêtes va faire. Pour moi, cela ressemble à quelque chose que je ferais dans une classe de contrôleur. Qu'est-ce que je me demande est de savoir si je peux passer une liste d'inclus dans ma méthode Any<T>()
que je pourrais alors parcourir quand je fais l'appel?
Fantastique! Cela ressemble tellement à ce que je cherche. Merci! –
btw j'utilise quelque chose de similaire pour les projections ;-) –
Pourriez-vous développer votre réponse pour correspondre plus étroitement à la méthode que j'utilise actuellement? Je me perds quelque peu à traduire. Aussi serait-il possible de passer une collection de includes comme argument? –