我试图针对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
。
答案 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()
。