访问 IEnumerable 清除内容

Accessing IEnumerable clears content

我有一个数据库 (Cassandra) 查询 return 是一个 IEnumerable。试图找出为什么这 return 没有数据(当我知道数据库中有数据时)我发现了一个奇怪的问题。

该查询实际上 return 数据,25 个条目。我正在用 Data.Count(); 检查这个但是在代码的后面,它是空的。发现Count Method莫名其妙的清空了数据

经过快速调查:任何读取此数据的操作都会将其完全清除。即使在调试中,如果我加载 "results view" 以获取数据列表,最初我会看到我的 25 个条目 - 然后如果我单击关闭,然后重新加载结果视图:Emtpy.

有人以前有过这样的经历吗?

        String connectionString = "SELECT * FROM thedatabase WHERE thecondition";

        RowSet Data = ExecuteComand(connectionString);

        if (Data == null) // interestingly, I can check for null without issue
        {
            OutputMessage("Output to " + exportFile + " failed");
            return;
        }
        int b = Data.Count(); // results in 25
        int c = Data.Count(); // results in 0

无法保证 Enumerable 可以被枚举两次。一个正确构建的枚举至少应该抛出一个异常,但错误的代码总是会发生。你可以做的是在一个行为良好的集合中实现它,例如 List<T>

var data2 = Data.ToList();

int b = data2.Count;
int c = data2.Count;

现在你甚至有优势 Count 是 O(1) 而不是 O(N) :-)(在 List<T>Count 值是 "cached")

我不知道 cassandra,但我假设返回的 IEnumerable<T> 是延迟执行的(延迟)。通过使用它(f.e。与 foreachToListCount),查询被执行并且资源(f.e。连接)是 disposed/closed.

如果是这种情况,您可以将其加载到内存集合中,例如:

var data = ExecuteComand("SELECT * FROM thedatabase WHERE thecondition").ToList();

现在您可以在没有 "clearing" 的情况下使用 data.Count