Csharp/C#教程:为什么匿名类型实例不能接受entity framework查询返回的空值?分享


为什么匿名类型实例不能接受entity framework查询返回的空值?

当我尝试运行以下entity framework查询时:

var l = (from s in db.Samples let action = db.Actions.Where(x => s.SampleID == x.SampleID && x.ActionTypeID == 1).FirstOrDefault() where s.SampleID == sampleID select new { SampleID = s.SampleID, SampleDate = action.ActionDate, }).ToList(); 

我得到以下exception:

转换为值类型“DateTime”失败,因为实现值为null。 结果类型的generics参数或查询必须使用可空类型。

问题可能是Action.ActionDate在EF模型中定义为不可为空的DateTime ,但是当没有为Sample分配相关操作时,查询返回null

解决方法是返回具有可空属性的非匿名类型,但为什么匿名类型不能接受null结果? 是否可以以某种方式强制使用可空属性创建匿名类型?

您使用的是匿名类型,而不是generics类型。 匿名类型由编译器在编译时定义。 最后,就像你创造了一个

 class MyEntity { public readonly int SampleID; public readonly DateTime SampleDate; } 

编译器根据您在new=右侧使用的类型“选择”这些类型。 因此,如果SampleID为intActionDateDateTime则将使用这些类型。

现在,当entity framework执行查询并“反序列化”“ MyEntity ”类中的数据时,它会尝试将SQL接收的null转换为DateTime ,并且转换失败。 解决方案是将ActionDate定义为DateTime? 在匿名类型:

 SampleDate = (DateTime?)action.ActionDate, 

或者在ActionDatenull时为SampleDate赋值:

 SampleDate = (DateTime?)action.ActionDate ?? default(DateTime), 

(这第二个解决方案未经测试,因为我附近没有SQL Server,如果它工作, SampleDate将是一个DateTime并且将包含查询返回的日期或日期为null时的DateTime.MinValue

上述就是C#学习教程:为什么匿名类型实例不能接受entity framework查询返回的空值?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1031962.html

(0)
上一篇 2022年1月14日
下一篇 2022年1月14日

精彩推荐