2013-04-26 16 views
8

In ASP.NET MVC 4 Projekt habe ich ein Modell für die join (with payload):Filtering Datensätze mit IEnumerable.Select

public class LeagueMember 
{ 
    [Key, Column(Order = 0)] 
    public int MemberId { get; set; } 

    [Key, Column(Order = 1)] 
    public int LeagueId { get; set; } 

    public bool? IsActive { get; set; } 

    [Required] 
    public virtual League League { get; set; } 

    [Required] 
    public virtual Member Member { get; set; } 

} 

Ich versuche, alle aktiven Mitglieder der Liga zu ziehen. Also, in der Liga Modell, habe ich eine Eigenschaft wie folgt:

public virtual ICollection<LeagueMember> LeagueMembers { get; set; } 

public IEnumerable<Member> GetActiveMembers 
{ 
    get 
    { 
     return LeagueMembers.Select(a => a.IsActive == true ? a.Member : null); 
    } 
} 

Aber es sieht aus wie eine Sammlung mit neuem Größe derjenigen aller Members gleich (mit Nullwerten für die inaktiven Mitglieder).

Gibt es eine bessere Möglichkeit, Filter in anonymer Methode anzuwenden, um Nullen zu vermeiden?

Antwort

4

einfach Ihre ternären Zustand innerhalb Select-Methode entfernen.

public IEnumerable<Member> GetActiveMembers 
{ 
    get 
    { 
     return from activeMember in LeagueMembers 
       where activeMember.IsActive == true 
       select activeMember.Member; 
     //return LeagueMembers.Select(a => a.IsActive == true); 
    } 
} 
+0

Wir müssen '.Member', nicht' .IsActive' (bool) zurückgeben. – Annie

+0

Sehen Sie meine Bearbeitung, wenn Sie die Liste der .Member-Eigenschaft des enumerierten Objekts in den 'LeagueMembers' abrufen möchten. – lexeRoy

+0

Das hat funktioniert! Vielen Dank. – Annie

12

Aber es sieht so aus, als ob es eine Sammlung mit der Größe aller Mitglieder zurückgibt (mit Nullwerten für die inaktiven Mitglieder).

Weil Sie es ausdrücklich sagen, tun Sie es. In Ihrem Code sagen Sie der Abfrage, dass eine Member Instanz zurückgegeben wird, ist das Mitglied aktiv ODER eine null, wenn das Mitglied NICHT aktiv ist.

return LeagueMembers.Select(a => a.IsActive == true ? a.Member : null); 

Sie können mit dem ? Ausdruck weggehen und einfach tun ein:

return LeagueMembers 
    .Where(a => a.IsActive.GetValueOrDefault(false)) 
    .Select(o=>o.Member); 
+0

'IsActive' ist Nullable Boolean. Es sollte "a.IsActive == true" sein. Plus es gibt 'LeagueMember' nicht' Member' Liste zurück. – Annie

+0

"Ich versuche, alle aktiven Mitglieder der Liga zu ziehen." - Dann sollte Ihr 'Member' die IsActive-Eigenschaft haben. –

+0

"Dann sollte Ihr Mitglied die IsActive-Eigenschaft haben". * Aktives Mitglied der Liga * nicht nur * aktives Mitglied *. Also muss IsActive in 'LeagueMember' präsent sein. – Annie