如何在实体框架中从可空关系中选择非空元

时间:2012-02-17 15:25:30

标签: c# entity-framework dynamic-linq

我正在制作一个基于Entity Framework和Scott Guthrie的Dynamic Linq库的报告工具。

当相关记录始终存在时,我试图从相关表中选择一个不可为空的字段时遇到了麻烦。例如,我有一个Participant表,它具有Team表的可为空的外键。这是因为一些参与者将在团队中,有些参与者不会。问题在于,我想提交一份报告,其中显示了参与者名单以及他们在团队中的一些团队信息。团队表上的一列不可为空,所以当我尝试使用标准投影或动态投影时选择它:

    var standardProjection = data.Select(i => new
    {
        i.FirstName,
        i.ParticipantTeam.CaptainPickupFlg <--- Non Nullable Boolean
    });

    var dynamicProjection = data.Select("new (FirstName, ParticipantTeam.CaptainPickupFlg)");

尝试枚举结果时出错:

“转换为值类型'布尔值'失败,因为具体化值为null。结果类型的泛型参数或查询必须使用可空类型。”

我如何避免此错误,只是让ParticipantTeam.CaptainPickupFlg在匿名类型中实现为可空的bool?

ScottGu的动态Linq:http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

1 个答案:

答案 0 :(得分:0)

data.Where( i => i.ParticipantTeam != null ).Select( i=> new
    {
        i.FirstName,
        i.ParticipantTeam.CaptainPickupFlg
    });

如果您需要所有参与者,您有两种选择:

  • 如果您能够以返回的匿名类型支付可空字段:

    var standardProjection = data.Select(i => new
    {
        i.FirstName,
        CaptainPickupFlg = (bool?)i.ParticipantTeam.CaptainPickupFlg
    });
    
  • 如果这不适合您,您应该决定该字段的默认值:

    var standardProjection = data.Select(i => new
    {
        i.FirstName,
        CaptainPickupFlg = ((bool?)i.ParticipantTeam.CaptainPickupFlg) ?? false
    });
    

    ,其默认值为false