如何在实体框架中从可为null的关系中选择不可为null
本文关键字:null 关系 选择 实体 框架 | 更新日期: 2023-09-27 18:25:10
我正在制作一个基于实体框架和Scott Guthrie的动态Linq库的报告工具。
当我试图从相关表中选择一个不可为null的字段时,遇到了一个障碍,而相关记录并不总是在那里。例如,我有一个Participant表,它有一个Team表的可为null的外键。这是因为一些参与者将加入一个团队,而另一些则不会。问题是,如果参与者在团队中,我想提取一份报告,其中显示参与者列表以及他们的一些团队信息。团队表上的一列不可为null,所以当我尝试使用标准投影或动态投影来选择它时:
var standardProjection = data.Select(i => new
{
i.FirstName,
i.ParticipantTeam.CaptainPickupFlg <--- Non Nullable Boolean
});
var dynamicProjection = data.Select("new (FirstName, ParticipantTeam.CaptainPickupFlg)");
我在尝试枚举结果时出错:
"转换为值类型"Boolean"失败,因为具体化的值为null。结果类型的泛型参数或查询必须使用可为null的类型。"
我如何才能避免这个错误,并让ParticipantTeam.CaptainPickupFlg在匿名类型中实现为可为null的布尔?
ScottGu的动态林克:http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
data.Where( i => i.ParticipantTeam != null ).Select( i=> new
{
i.FirstName,
i.ParticipantTeam.CaptainPickupFlg
});
如果你需要所有的参与者,你有两个选择:
如果您可以在返回的匿名类型中提供可为null的字段:
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 });
其具有默认值CCD_ 1。