2012-02-17 74 views
0

我正在制作一个基于实体框架和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物化为匿名类型的可空布尔值?

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

回答

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 
    }); 
    
  • 如果这不是您的选择,您s HOULD决定该字段的默认值:

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

    拥有的false默认值。

+0

我不想过滤掉它们,因为我仍然希望所有参与者都显示。 – 2012-02-17 16:23:50

+0

@MrBell因此,如果参与者没有ParticipantTeam,那么您希望在返回结果的CaptainPickupFlg字段中做什么?对或错? – 2012-02-17 16:45:52

+0

既不,也不应该为null – 2012-02-17 19:25:16