9

在 ASP.NET MVC 4 项目中,我有一个连接模型(带有有效负载):

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; }

}

我正在尝试拉动联盟的所有活跃成员。所以,在 League 模型中,我创建了一个这样的属性:

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

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

但看起来它返回一个大小等于所有集合的集合Members(非活动成员的值为空)。

有没有更好的方法在匿名方法中应用过滤器以避免空值?

4

2 回答 2

12

但看起来它返回一个大小等于所有成员的集合(非活动成员的值为空)。

因为您明确告诉它这样做。在您的代码中,您告诉查询返回一个Member实例是成员处于活动状态,或者null如果成员不处于活动状态。

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

您可以不使用该?表达式,只需执行以下操作:

return LeagueMembers
    .Where(a => a.IsActive.GetValueOrDefault(false))
    .Select(o=>o.Member);
于 2013-04-26T02:52:33.550 回答
4

只需在 Select 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);
    }
}
于 2013-04-26T02:54:16.460 回答