我正在尝试对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()
。