45 votes

Comment compter les entités associées sans les récupérer dans Entity Framework ?

Cela fait un moment que je m'interroge sur ce sujet, et j'ai donc pensé qu'il valait la peine d'utiliser mon premier post Stack Overflow pour poser la question.

Imaginons que j'aie une discussion à laquelle est associée une liste de messages :

DiscussionCategory discussionCategory = _repository.GetDiscussionCategory(id);

discussionCategory.Discussions est une liste d'entités Discussion qui n'est pas encore chargée.

Ce que je veux, c'est pouvoir parcourir les discussions d'une discussionCategory et dire combien de messages se trouvent dans chaque discussion sans avoir à récupérer les données des messages.

Lorsque j'ai essayé cela auparavant, j'ai dû charger les discussions et les messages pour pouvoir faire quelque chose comme cela :

discussionCategory.Discussions.Attach(Model.Discussions.CreateSourceQuery().Include("Messages").AsEnumerable());

foreach(Discussion discussion in discussionCategory.Discussions)
{

int messageCount = discussion.Messages.Count;

Console.WriteLine(messageCount);

}

Cela me semble plutôt inefficace, car j'extrais potentiellement des centaines de corps de messages de la base de données et je les garde en mémoire alors que tout ce que je souhaite faire, c'est compter leur nombre à des fins de présentation.

J'ai vu quelques questions qui abordaient ce sujet, mais elles ne semblaient pas l'aborder directement.

Merci d'avance pour toute réflexion que vous pourriez avoir sur ce sujet.

Mise à jour - Un peu plus de code comme demandé :

public ActionResult Details(int id)
    {  
        Project project = _repository.GetProject(id);
        return View(project);
    }

Ensuite, dans la vue (juste pour tester) :

Model.Discussions.Load();
var items = from d in Model.Discussions select new { Id = d.Id, Name = d.Name, MessageCount = d.Messages.Count() };

foreach (var item in items) {
//etc

J'espère que mon problème est un peu plus clair. Faites-moi savoir si vous avez besoin de plus de détails sur le code.

0voto

Sheldmandu Points 474

J'ai rencontré le même problème lorsque j'ai eu affaire à plusieurs mappers, y compris EF et DevExpress XPO (qui ne permet même pas à une seule entité d'être mappée à plusieurs tables). La meilleure solution consiste à utiliser les modèles EDMX et T4 pour générer des vues actualisables dans SQL Server (au lieu de déclencheurs). De cette façon, vous avez un contrôle de bas niveau sur le SQL, ce qui vous permet de faire des sous-requêtes dans la clause de sélection, d'utiliser toutes sortes de jointures complexes pour apporter des données, etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X