2013-04-26 34 views
8

Trong dự án ASP.NET MVC 4, tôi có một mô hình cho tham gia (with payload):hồ sơ Filtering với 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; } 

} 

Tôi cố gắng để kéo tất cả các thành viên tích cực của các giải đấu. Vì vậy, trong mô hình League, tôi đã tạo ra một tài sản như thế này:

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

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

Nhưng có vẻ như nó sẽ trả về một bộ sưu tập với kích thước tương đương như của tất cả Members (với các giá trị null cho các thành viên hoạt động).

Có cách nào tốt hơn để áp dụng bộ lọc theo phương pháp ẩn danh để tránh null không?

Trả lời

4

Chỉ cần loại bỏ tình trạng ternary của bạn trong vòng Chọn Method.

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

Chúng ta cần trả về '.Member', không phải' .IsActive' (bool). – Annie

+0

Xem chỉnh sửa của tôi nếu bạn muốn nhận danh sách .Member thuộc tính của đối tượng được liệt kê trong 'LeagueMembers'. – lexeRoy

+0

Đã hoạt động! Cảm ơn bạn. – Annie

12

Nhưng có vẻ như nó trả về một bộ sưu tập có kích thước bằng tất cả Thành viên (có giá trị null cho các thành viên không hoạt động).

Vì bạn đặc biệt yêu cầu làm như vậy. Trong mã của bạn, bạn đang yêu cầu trả về một cá thể Member là thành viên đang hoạt động HOẶC một số null nếu thành viên KHÔNG hoạt động.

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

Bạn có thể đi xa với khái niệm ? và chỉ cần làm một:

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

'IsActive' là nullable Boolean. Nó phải là 'a.IsActive == true'. Thêm vào đó nó sẽ trả về danh sách 'LeagueMember' không phải là' Member'. – Annie

+0

"Tôi đang cố gắng để kéo tất cả các thành viên tích cực của giải đấu." - Sau đó, 'Thành viên' của bạn nên có tài sản IsActive. –

+0

"Sau đó, Thành viên của bạn phải có thuộc tính IsActive". * Thành viên tích cực của giải đấu * không chỉ * Thành viên tích cực *. Vì vậy, IsActive phải có mặt trong 'LeagueMember'. – Annie