"Nullable object must have a value" Where用什么方法?
"Nullable object must have a value" when Where uses a method?
我正在尝试 运行 针对 Azure DocumentDB 集合的 LINQ 查询。当我 运行 我的查询时,我不断收到一个 AggregateException
,其中包含一个 InvalidOperationException
和消息:
Nullable object must have a value
我已将此问题简化为以下(有些人为的)示例:
当我 运行 这段代码时,我从对 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
.
在@andrew-liu 和@will 的帮助下(谢谢!)我已经弄明白了:
在我上面的例子中调用 Where()
时,里面的谓词被解释(而不是执行)为 LINQ 表达式。在调用 ToArray()
时,针对 DocumentDB .NET SDK 的 LINQ 提供程序执行 LINQ 表达式。
因为 SDK 不知道我的 GetDoc()
方法,它会抛出带有神秘消息的异常 "Nullable object must have a value".
在 .Net 的 DocumentDB SDK v1.9 中,错误消息更加清晰。抛出 DocumentQueryException
并显示一条消息,如 "Method "GetDoc()" is not supported".
您可以通过在查询中调用 ToString()
从 SDK v1.8 获得类似的反馈:query.ToString()
.
我正在尝试 运行 针对 Azure DocumentDB 集合的 LINQ 查询。当我 运行 我的查询时,我不断收到一个 AggregateException
,其中包含一个 InvalidOperationException
和消息:
Nullable object must have a value
我已将此问题简化为以下(有些人为的)示例:
当我 运行 这段代码时,我从对 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
.
在@andrew-liu 和@will 的帮助下(谢谢!)我已经弄明白了:
在我上面的例子中调用 Where()
时,里面的谓词被解释(而不是执行)为 LINQ 表达式。在调用 ToArray()
时,针对 DocumentDB .NET SDK 的 LINQ 提供程序执行 LINQ 表达式。
因为 SDK 不知道我的 GetDoc()
方法,它会抛出带有神秘消息的异常 "Nullable object must have a value".
在 .Net 的 DocumentDB SDK v1.9 中,错误消息更加清晰。抛出 DocumentQueryException
并显示一条消息,如 "Method "GetDoc()" is not supported".
您可以通过在查询中调用 ToString()
从 SDK v1.8 获得类似的反馈:query.ToString()
.