2013-04-26 14 views
8

in ASP.NET MVC 4 progetto, ho un modello per la join (with payload):Filtraggio dei record con 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; } 

} 

Sto cercando di tirare tutti i membri attivi del campionato. Quindi, nel modello di Lega, ho creato una proprietà come questa:

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

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

ma sembra che restituisce un insieme di dimensioni uguale a quella di tutti Members (con valori nulli per i membri non attivi).

Esiste un modo migliore per applicare il filtro nel metodo anonimo per evitare i valori null?

risposta

4

Basta togliere la sua condizione ternario entro Seleziona metodo.

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

Dobbiamo restituire '.Member', non' .IsActive' (bool). – Annie

+0

Vedere la mia modifica se si desidera ottenere l'elenco della proprietà .Member dell'oggetto enumerato in 'LeagueMembers'. – lexeRoy

+0

Ha funzionato! Grazie. – Annie

12

Ma sembra che restituisca una collezione con dimensione uguale a quella di tutti i membri (con valori nulli per i membri inattivi).

Perché si sta specificatamente dicendo di farlo. Nel codice si dice che la query restituisce un'istanza Member se il membro è attivo OPPURE un null se il membro NON è attivo.

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

Si può andare via con l'? espressione e semplicemente fare un:

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

'IsActive' è nullable booleano. Dovrebbe essere 'a.IsActive == true'. Inoltre restituisce la lista 'MemberMember' non' Member'. – Annie

+0

"Sto provando a recuperare tutti i membri attivi del campionato." - Quindi il tuo membro dovrebbe avere la proprietà IsActive. –

+0

"Quindi il tuo membro dovrebbe avere la proprietà IsActive". * Membro attivo della lega * non solo * Membro attivo *. Quindi IsActive deve essere presente in 'LeagueMember'. – Annie