【问题标题】:Avoid Error when No Results from Entity Query实体查询无结果时避免错误
【发布时间】:2011-03-14 17:38:33
【问题描述】:

我有一个简单的实体查询:

Dim rhcexists = From p In dbContracts.Signatures _
                    Where p.StudentID = people_code_id _
                    And p.ContractType = "rhc" _
                    Order By p.ID Descending _
                    Select p

然后我使用 if..then 来检查其中一个结果值是否比六个月前更新,如下所示:

If rhcexists.First.SignatureDate > Date.Today.AddMonths(-6) Then
End If

但是,如果没有返回结果,则会返回错误。如果根本没有任何价值,我有没有办法告诉它表现得好像日期超过六个月?例如,我可以在伪中做类似的事情:

If Exists(rhcexists.First.SignatureDate, Date.Today.AddMonths(-8)) > Date.Today.AddMonths(-6) Then

如果结束

【问题讨论】:

    标签: asp.net vb.net linq entity-framework


    【解决方案1】:

    您正在使用First 扩展方法,如果没有结果,它会爆炸。你可以这样做:

    Dim first = rhcexists.FirstOrDefault()
    If first IsNot Nothing AndAlso first.SignatureDate > Date.Today.AddMonths(-6) Then
        ' Do stuff here
    End If
    

    如果没有结果,FirstOrDefault 将返回 Nothing,而不是抛出异常。

    【讨论】:

    • 如何设置作为日期的 FirstOrDefault 值?它不断回来说 webHousing.Signatures 不能是 Date.Today。
    • @davemackey:不清楚你的意思。您在 query 上调用 FirstOrDefault(),因此结果将是查询返回的任何类型 - 猜测是 Signature 或类似的东西。请注意在我的代码中我如何在first 上使用SignatureDate 属性。
    • @davemackey: Try Is Not Nothing 相反。你基本上想要相当于 C# if (first != null && ...)
    • @Jon Skeet 确实将引用类型与 null/nothing 进行比较的正确语法是 IsNot Nothing
    • @davemackey:那不是我发布的代码,是吗?这是If clcfirst IsNot Nothing,而不是If clcfirst.SignatureDate IsNot Nothing。关键是如果没有值,clcfirst 将是一个空引用,所以你不应该尝试取消引用它。
    【解决方案2】:

    使用 FirstOrDefault 而不是 First。然后你可以设置默认返回的内容

    【讨论】:

    • 如何设置 DefaultIfEmpty 的值?而且,特别是,如何将此值设置为日期值?例如,如果我这样做: rhcexists.DefaultIfEmpty(Date.Today) 我会收到错误消息:“'Date' 类型的值无法转换为 webHousing.Signature”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多