【问题标题】:nullable object must have a value in Linq可空对象在 Linq 中必须有一个值
【发布时间】:2011-08-24 15:17:07
【问题描述】:

我使用以下 Linq To Entity 来获取我的“siteconfig”实体的第一条也是唯一一条记录:

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

但是当我的应用程序遇到以下代码时,会抛出“可为空的对象必须有一个值”:

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

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

有人帮帮我吗?

【问题讨论】:

  • 这是引发异常的确切行吗?如果没有,请扩展代码并添加堆栈跟踪。
  • 是的,我在那里放了一个断点,当应用程序到达那个点时,抛出一个异常。
  • { .... } 之间有一些东西抛出异常。如果您使用可为空的 DateTime,请确保检查 .HasValue
  • @IAbstract in {....} 我只是以这种方式阅读并复制 loginDate :TimeSpan span = DateTime.Now.Subtract((DateTime)site.logindDate );

标签: c# linq linq-to-entities


【解决方案1】:

试试这样的:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这无法解释问题,因为 OP 专门对 null 进行了检查 site
    • 我确信总是在列表返回的元素上,但我将使用单次并再次测试应用程序。 [已编辑] 使用 Single() 不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    相关资源
    最近更新 更多