我正在制作一个基于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
答案 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
。