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

count entity-framework

Question

Je me posais des questions sur celui-ci depuis un moment maintenant, alors j'ai pensé qu'il serait utile d'utiliser mon premier message Stack Overflow pour poser des questions à ce sujet.

Imaginez que je discute avec une liste de messages associés:

DiscussionCategory discussionCategory = _repository.GetDiscussionCategory(id);

discussionCategory.Discussions est une liste d'entités de discussion qui n'est pas chargée actuellement.

Ce que je veux, c'est pouvoir parcourir les discussions d'une catégorie de discussion et dire combien de messages il y a dans chaque discussion sans récupérer les données du message.

Quand j'ai essayé cela avant d'avoir eu à charger les discussions et les messages pour pouvoir faire quelque chose comme ça:

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 je récupère potentiellement des centaines de corps de messages dans la base de données et les garde en mémoire lorsque tout ce que je veux, c'est compter leur nombre à des fins de présentation.

J'ai vu certaines questions qui touchent ce sujet mais elles ne semblaient pas y répondre directement.

Merci d'avance pour vos réflexions sur ce sujet.

Mise à jour - Un peu plus de code à la demande:

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

Puis dans la vue (juste pour le 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 cela rend mon problème un peu plus clair. Faites-moi savoir si vous avez besoin de plus de détails sur le code.

Réponse acceptée

Facile; projetez simplement sur un type POCO (ou anonyme):

var q = from d in Model.Discussions
        select new DiscussionPresentation
        {
            Subject = d.Subject,
            MessageCount = d.Messages.Count(),
        };

Lorsque vous examinez le code SQL généré, vous constaterez que Count() est effectué par le serveur de base de données.

Notez que cela fonctionne à la fois dans EF 1 et EF 4.


Réponse populaire

Si vous utilisez Entity Framework 4.1 ou version ultérieure, vous pouvez utiliser:

var discussion = _repository.GetDiscussionCategory(id);

// Count how many messages the discussion has 
var messageCount = context.Entry(discussion)
                      .Collection(d => d.Messages)
                      .Query()
                      .Count();

Source: http://msdn.microsoft.com/en-US/data/jj574232



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow