2012-02-22 4 views
0

Je me demandais s'il était possible d'avoir un double nid linq statemate.Linq imbriqué dans le code EF d'abord

J'ai les objets suivants (je suis en utilisant le code EF premier)

public class Team 
{ 
    public int TeamId { get; set; } 
    public sting Name {get;set;} 
    public virtual ICollection<Person> People 
} 

public class Person 
{ 
    public int PersonId { get; set; } 

    [ForeignKey("Team")] 
    public int? TeamId { get; set; } 
    public Team Team { get; set; } 

    public virtual ICollection<Paper> Papers 
} 

public class Paper 
{ 
    public int PaperId { get; set; } 

    [ForeignKey("Person")] 
    public int? PersonId { get; set; } 
    public Person Person { get; set; } 

    public virtual ICollection<Paper> People 
} 

Je puis en utilisant la STATEMATE LINQ suivante pour créer un objet

(from t in db.Teams 
select new TeamPapers 
{ 
    TeamName = t.Name 
    PaperTotal = t.People.Select(p=>p.Papers).Count() 
}).ToList() 

Mais le PaperTotal ne retourne le nombre of ICollection < Papier> pas le nombre total de papiers dans ces collections. Je me demandais si quelqu'un savait comment cela pourrait être fait?

Répondre

1

Avez-vous essayé SelectMany au lieu de sélectionner?

(from t in db.Teams 
select new TeamPapers 
{ 
    TeamName = t.Name 
    PaperTotal = t.People.**SelectMany**(p=>p.Papers).Count() 
}).ToList() 
+0

Merci qui a travaillé, cheers :) –

1

Actuellement, vous extrayez le nombre des collections, c'est parce que vous sélectionnez une collection unique de chaque personne, puis de les compter. Au lieu de cela que vous voulez compter les Paper cas dans toutes les collections - vous pouvez le faire en utilisant à la place SelectMany() qui aplatit la collection que vous projetez à:

(from t in db.Teams 
select new TeamPapers 
{ 
    TeamName = t.Name 
    PaperTotal = t.People.SelectMany(p=>p.Papers).Count() 
}).ToList()