0

下面的代码行基于 RowIndex 对 IEnumerable 执行 FirstOrDefault 搜索,但在调试窗口(在 Watch、Quick watch 和 Immediate 窗口中)中不起作用。它会在这些窗口中引发 System.NullReferenceException。我正在使用 Visual Studio 2015 更新 3。

sheetdata.Descendants<Row>().FirstOrDefault(p => p.RowIndex.Value == 2U)

但是当我将它转换为列表并进行相同的搜索时,它可以在这些调试窗口中工作。为什么会出现这种差异?

sheetdata.Descendants<Row>().ToList().FirstOrDefault(p => p.RowIndex.Value == 2U)

当我运行代码时,这种差异不存在。只有当我尝试在这些调试窗口中调试代码时,我才能看到这种差异。

在此处输入图像描述

4

1 回答 1

3

我认为 OpenXml 的 QueryProvider 的处理存在问题Convert.ToUInt32(2),因为他需要将其翻译成自己的语言(如 SQL 的 QueryProvider)。

您应该尽量避免在谓词中进行转换并预先进行转换,因为并非所有 QueryProviders 都支持所有功能并且可能会抛出异常(主要是NotSupportedException)。

uint value = Convert.ToUInt32(2);
sheetdata.Descendants<Row>().FirstOrDefault(p => p.RowIndex.Value == value)

该调用.ToList()将在内存中执行此操作,因为它将从您的工作表中读取所有值,然后找到第一个匹配值。

于 2017-01-18T20:15:18.753 回答