2011-10-08 5 views
1

J'ai l'entité "Idées", qui a la collection d'entités enfant "ChildIdeas". J'ai besoin de charger la liste d'idées et le compte de "ChildIdeas" (seulement compter!). je peux faire:Entity Framework, optimisation des performances

chargement désireux

from i in _dataContext.Ideas.Include("ChildIdeas") ... 

avantages: toutes les données nécessaires ont par une demande; inconvénients: charger des données inutiles. J'ai besoin que le nombre de ChildIdeas, pas ChildIdeas liste complète

chargement explicite

from i in _dataContext.Ideas ... 

idea.ChildIdeas.Loading() 

avantages: none; inconvénients: de nombreuses demandes (ideas.count + 1) au lieu d'une, charge les données inutiles

demandes indépendantes

from i in _dataContext.Ideas ... 

_repository.GetCountChildIdeas(idea.ID); 

Avantages: charge uniquement les données nécessaires; inconvénients: beaucoup de demandes (ideas.count + 1) au lieu d'un

tous les 3 types ont des inconvénients. Peut-être existe-t-il un moyen de charger uniquement les données nécessaires? Si oui - qu'est-ce que c'est, si non - quel est le meilleur moyen pour cette affaire?

[AJOUTÉE] après le test de charge (pour 1 utilisateur) Je suis chargement de la page (en sec): désireux Idées d'enfants - 1,31 s explicites Idées d'enfants - 1,19 sec des demandes externes - 1.14 sec

si , la façon avide pour mon cas est le pire ... Pourquoi même manière explicite est meilleure?

Répondre

2

Vous devez utiliser la projection. Count des idées enfants ne fait pas partie de l'entité persistante Idea, créez donc un nouveau type non mappé contenant toutes les propriétés de l'entité Idea et de la propriété Count.

public class IdeaProjection 
{ 
    public int Id { get; set; } 
    // Other properties 
    public int Count { get; set; } 
} 

Maintenant, vous pouvez utiliser la requête de projection simple pour obtenir tout à la demande unique sans charger des données supplémentaires:

var query = from x in context.Ideas 
      where ... 
      select new IdeaProjection 
       { 
        Id = x.Id, 
        // Mapped other properties 
        Count = x.ChildIdeas.Count() 
       }; 

Inconvénient est que IdeaProjection n'est pas une entité et si vous voulez l'utiliser pour les mises à jour comme Eh bien, vous devez le transformer en idée et dire à EF sur les changements. Du point de vue des performances, il est préférable que vous puissiez obtenir de EF sans revenir à SQL ou aux procédures stockées.

+0

J'ai ajouté votre exemple concernant la duplication de données de chargement désirée (http://stackoverflow.com/questions/5521749/how-many-include-i-can-use-on-objectset-in-entityframework-to-retain-performance/5522195 # 5522195) comme explication possible du fait que OP a mesuré des performances plus lentes avec un chargement plus rapide qu'explicite. – Slauma

+0

Si je comprends bien, nous pouvons simplement étendre la classe Ideas à une autre propriété ... –

+0

Non, vous ne pouvez pas parce que la projection n'est pas possible à la classe mappée. –

Questions connexes