Сначала вложенный Linq в коде EF - PullRequest
0 голосов
/ 22 февраля 2012

Мне было интересно, возможно ли иметь двойное гнездо linq Statemate.

У меня есть следующие объекты (сначала я использую код EF)

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
}

Затем я использую следующий статус linq для создания объекта

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

Но PaperTotal возвращает только количество ICollection , а не общее количество документов в этой коллекции. Мне было интересно, если бы кто-нибудь знал, как это можно сделать?

Ответы [ 2 ]

1 голос
/ 22 февраля 2012

В настоящее время вы получаете количество коллекций , это потому, что вы выбираете одну коллекцию из каждого человека, а затем подсчитываете их.Вместо этого вы хотите сосчитать Paper экземпляров по всем коллекциям - вы можете сделать это, используя вместо этого SelectMany(), который сглаживает коллекцию, на которую вы проецируете:

(from t in db.Teams
select new TeamPapers 
{
    TeamName = t.Name
    PaperTotal = t.People.SelectMany(p=>p.Papers).Count()
}).ToList()
1 голос
/ 22 февраля 2012

Вы пробовали использовать SelectMany вместо select?

(from t in db.Teams
select new TeamPapers 
{
    TeamName = t.Name
    PaperTotal = t.People.**SelectMany**(p=>p.Papers).Count()
}).ToList()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...