"Nullable object must have a value" Where 何时使用方法?



我正在尝试对Azure DocumentDB集合运行LINQ查询。当我运行查询时,我不断得到一个AggregateException,其中包含一个带有消息的InvalidOperationException

可为null的对象必须具有值

我已经将这个问题简化为以下(有些人为(示例:

当我运行此代码时,我会从对ToArray() 的调用中得到上面提到的异常

public class MyDocument { ... }
public void RunQuery()
{
    var query = documentDbClient
        .CreateDocumentQuery<MyDocument>()
        .Where(doc => GetDoc(doc) != null);
    var results = query.ToArray()
}
public MyDocument GetDoc(MyDocument myDocument)
{
    return myDocument;
}

相反,当我运行下面的代码时,不会引发任何异常,并且我从DocumentDB集合中获得了良好的结果。

public void RunQuery()
{
    var query = documentDbClient
        .CreateDocumentQuery<MyDocument>()
        .Where(doc => doc != null);
    var results = query.ToArray()
}

为什么两个代码示例之间的行为存在差异

备注:
-虽然GetDoc()是我更复杂的谓词逻辑的替代,但上面的代码完全复制了问题。我不会在GetDoc()或其他方法中隐瞒任何恶作剧:(
-即使将GetDoc()设为static,也会出现该问题
-只是尝试使用List<MyDocument>而不是documentDbClient进行复制,但没有引发异常。指示底层数据提供程序中的某些内容=Azure DocumentDB的IDatabaseClient

在@andrewliu和@will的帮助下(谢谢!(我已经能够弄清楚:

在我上面的例子中,在调用Where()时,内部的谓词被解释(而不是执行(为LINQ表达式。在调用ToArray()时,将针对DocumentDB.NETSDK的LINQ提供程序执行LINQ表达式。

因为SDK不知道我的GetDoc()方法,所以它抛出了异常,并显示了一条神秘的消息"Nullable object must have a value">

在DocumentDB SDK for.Net的v1.9中,错误消息要清晰得多。抛出DocumentQueryException时会出现类似"不支持方法"GetDoc((">的消息。

通过调用ToString()这样的查询,您可以从SDK的v1.8中获得类似的反馈:query.ToString()

最新更新