2010-01-10 1 views
5

J'ai deux entités, Parent et Child, dans Entity Framework.Comment renvoyer de nombreuses collections d'enfants Count() dans une requête de structure d'entité unique

Le parent a une collection d'entités enfants.

Dans ma requête, je souhaite renvoyer uniquement les entités Parent (les types EF entièrement typés) et aussi Count() des entités enfant (cette propriété peut être définie sur une propriété du parent), mais je souhaite uniquement pour ce faire en un seul appel à la base de données, sans écrire un S-Proc personnalisé. Est-ce possible?

Essential, je veux transformer cela en une seule requête:

EFContext content = new EFContext(); 
IQueryable<Parent> parentQuery = context.Parent.Select(); 
foreach(Parent parent in parentQuery) 
{ 
    parent.NoChildItems = parent.Childs.Count(); 
} 

Quand activer le recenseur sur ce cela, il appelle la base de données de la liste, et encore une fois pour chaque requête Count(). Je retourne environ 100 articles à chaque fois et préfèrerais donc ne pas faire 100 appels séparés juste pour le nombre d'articles pour enfants.

Merci pour toute aide.

Répondre

9

Cela devrait fonctionner:

IQueryable parentQuery = context.Parent.Select(p => new { Parent = p, ChildCount = p.Childs.Count() }); 

EDIT

Si vous définissez:

public class ParentModel 
{ 
    public Task Parent { get; set; } 
    public int ChildCount { get; set; } 
} 

vous pouvez utiliser

IQueryable parentQuery = context.Parent.Select(p => new ParentModel { Parent = p, ChildCount = p.Childs.Count() }); 

EDIT

Vous pouvez également faire:

var parentQuery = context.Parent.Select(p => new { Parent = p, ChildCount = p.Childs.Count() }).ToList(); 
parentQuery.ForEach(p => p.Parent.ChildCount = p.ChildCount); 
var result = return parentQuery.Select(p => p.Parent); 

court et vous avez votre propriété peuplée.

+0

Merci pour votre réponse, mais y a-t-il un moyen de le faire sans utiliser un cours anonyme? – James

+0

Je pensais que tu allais dire ça! Peu importe, merci pour votre aide. – James

+1

La solution ci-dessus, mais entraîne plusieurs appels db. Comment le compte peut-il être récupéré dans un appel pour tous les enregistrements dans ParentModel? –

Questions connexes