使用IEnumerable.Select过滤记录

时间:2013-04-26 02:50:25

标签: c# asp.net-mvc linq entity-framework anonymous-methods

在ASP.NET MVC 4项目中,我有一个连接模型(with payload):

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

}

我正在努力吸引联盟中所有活跃的成员。所以,在联盟模型中,我创建了一个这样的属性:

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

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

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

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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:4)

只需在选择方法中移除您的三元条件。

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