" Nullable对象必须具有值"何时使用方法?

时间:2016-07-05 12:40:53

标签: c# linq azure nullable azure-cosmosdb

我试图针对Azure DocumentDB集合运行LINQ查询。当我运行查询时,我不断收到包含AggregateException的{​​{1}}消息:

  

Nullable对象必须具有值

我已将此问题简化为以下(有点人为的)示例:

当我运行此代码时,我从调用InvalidOperationException

中获得了上述异常
ToArray()

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

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;
}

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

注意:
- 虽然public void RunQuery() { var query = documentDbClient .CreateDocumentQuery<MyDocument>() .Where(doc => doc != null); var results = query.ToArray() } 代表了我更复杂的谓词逻辑,但上面的代码完全重现 的问题。我不会在GetDoc()或其他方法中隐瞒任何恶作剧:) - 即使GetDoc()成为GetDoc(),也会出现问题 - 只是尝试使用static而不是List<MyDocument>进行重现,并且没有抛出任何异常。表示底层数据提供程序中的内容= Azure DocumentDB&#39; s documentDbClient

1 个答案:

答案 0 :(得分:5)

在@ andrew-liu和@will的帮助下(谢谢!)我已经弄明白了:

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

因为SDK不知道我的GetDoc()方法,所以它会引发异常,并带有神秘的消息“Nullable对象必须具有值

在.Net的DocumentDB SDK的v1.9中,错误消息更加清晰。引发DocumentQueryException时会显示消息,例如“方法”GetDoc()“不支持”

您可以通过在查询中调用ToString()来获取SDK的v1.8中的类似反馈:query.ToString()