【问题标题】:How to select non nullables from nullable relation in Entity Framework如何从实体框架中的可空关系中选择不可空值
【发布时间】:2012-02-17 15:25:30
【问题描述】:

我正在制作一个基于 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)");

尝试枚举结果时出现错误:

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

我怎样才能避免这个错误,而只是将 ParticipantTeam.CaptainPickupFlg 物化为匿名类型中的可为空的布尔值?

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

【问题讨论】:

标签: c# entity-framework dynamic-linq


【解决方案1】:
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

【讨论】:

  • 我不想过滤掉它们,因为我仍然希望所有参与者都显示。
  • @MrBell 那么,如果一个参与者没有 ParticipantTeam,你想在返回结果的CaptainPickupFlg 字段中是什么?是真是假?
  • 你知道如何在动态 linq 表达式中做同样的事情吗?
  • @MrBell:试试这个:data.Select("new (FirstName, bool?(ParticipantTeam.CaptainPickupFlg) as CaptainPickupFlg)");我还没有测试过。请测试并告知结果。
猜你喜欢
  • 2018-07-04
  • 2021-09-18
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
相关资源
最近更新 更多