可空对象必须在Linq中具有值

时间:2011-08-24 15:17:08

标签: c# linq linq-to-entities

我使用以下Linq To Entitiy获取我的'siteconfig'实体的第一个也是唯一的记录:

var site = unitofwork.SiteConfigRepository.Get().FirstOrDefault();

但是当我的应用程序出现在下面的代码中时,throws'可空对象必须有一个值':

if (site!= null) { TimeSpan span = DateTime.Now.Subtract((DateTime)site.logindDate ); }

我实体中唯一可以为空的类型是一个名为logindDate的属性,其类型为DateTime。

有人帮帮我吗?

2 个答案:

答案 0 :(得分:2)

尝试这样的事情:

if (site!= null) 
{ 
    if (site.loginDate.HasValue)
    { TimeSpan span = DateTime.Now.Subtract((DateTime)site.logindDate.Value ); }
}

您没有检查空loginDate,我怀疑 可能是问题所在。请记住,当您拥有可空类型时,需要检查HasValue,然后从Value属性中获取值。

答案 1 :(得分:0)

IEnumerable.FirstOrDefault()返回枚举的第一个元素,或者默认(T)(如果列表中没有元素,则通常为null,除非T是值类型)。很可能你的Get()返回一个空的可枚举。

在一个相关问题上(如果确实发生了这种情况),如果你确定列表总是返回一个且只有一个元素,那么你应该使用Single()(因为那时你会抛出一个异常)在该行)或者在 FirstOrDefault()之后对null 进行测试。我认为最好在意外行为的源头抛出或处理异常,而不是以后几行。