web-dev-qa-db-ja.com

IEnumerable.Selectによるレコードのフィルタリング

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

}

私はリーグのアクティブなメンバー全員を引き寄せようとしています。したがって、リーグモデルでは、次のようなプロパティを作成しました。

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

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

しかし、すべてのMembersのサイズと等しいサイズのコレクションを返すようです(非アクティブなメンバーの値はnullです)。

Nullを回避するために匿名メソッドでフィルターを適用するより良い方法はありますか?

9
Annie

Selectメソッド内で3項条件を削除するだけです。

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

しかし、すべてのメンバーのサイズに等しい(非アクティブなメンバーの場合はnull値を持つ)コレクションを返すようです。

あなたは具体的にそうするように言っているので。コードでは、クエリがMemberインスタンスを返すように指示しています。メンバーはアクティブですOR a nullメンバーがアクティブでない場合。

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

?式を使用して、次の操作を行います。

return LeagueMembers
    .Where(a => a.IsActive.GetValueOrDefault(false))
    .Select(o=>o.Member);
12
von v.