【问题标题】:Filtering records with IEnumerable.Select使用 IEnumerable.Select 过滤记录
【发布时间】:2013-04-26 02:50:24
【问题描述】:

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

}

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • IsActive 是可为空的布尔值。应该是a.IsActive == true。加上它返回LeagueMember 而不是Member 列表。
    • “我正在尝试拉取联盟的所有活跃成员。” - 那么您的Member 应该具有 IsActive 属性。
    • "那么您的 Member 应该具有 IsActive 属性"。 联盟的活跃成员不仅仅是活跃的成员。所以 IsActive 必须存在于LeagueMember
    • 查看我更新的答案,我认为这就是您需要的原因。认真的人,为什么要投反对票?
    • 是的,我想我在完全理解您的问题并编辑我的答案以使其被接受方面迟到了一分钟。嗯,重要的是,你的问题得到了解决,你学到​​了一些新东西。
    【解决方案2】:

    只需删除 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);
        }
    }
    

    【讨论】:

    • 我们需要返回.Member,而不是.IsActive (bool)。
    • 如果要获取LeagueMembers中枚举对象的.Member属性列表,请查看我的编辑。
    • 我注意到这个回复使用了声明性语法。 IMO 这是一个非问题的非解决方案,它只会使文档膨胀,并给示例、解释和用法增加混淆。事实上,这是现在的普遍共识 太糟糕了 MS 没有那么清晰的远见。附言你真的不需要“== true”,它显然是一个布尔表达式。
    猜你喜欢
    • 2010-10-27
    • 1970-01-01
    • 2018-04-26
    • 2014-07-22
    • 2016-08-23
    • 2020-04-15
    • 2011-06-19
    • 1970-01-01
    • 2011-08-10
    相关资源
    最近更新 更多